-
v0.0.3
StableGates / frontend (push) Successful in 1m3sGates / test (push) Successful in 1m39sGates / test-aarch64 (push) Successful in 6m28sGates / container (push) Successful in 18sRelease / guard (push) Successful in 1m30sGates / test-aarch64 (push) Successful in 5m45sGates / package (push) Successful in 24sRelease / gates (push) Successful in 7m54sGates / package (push) Successful in 5m34sCI / gates (push) Successful in 14m5sGates / frontend (push) Successful in 58sGates / test (push) Successful in 1m29sGates / container (push) Successful in 10sRelease / publish (push) Successful in 9m12sreleased this
2026-08-15 10:57:14 +00:00 | 82 commits to master since this releaseDevices name themselves: the clients table asks the router over reverse DNS instead of waiting for the operator to type every name. The CI container gate also moved from workflow shell into a compiled, tested tool, which fixed a latent temp-directory bug shared with the release tool.
Added
- Client names learned over reverse DNS. A client row that carries no hand-typed name gets one from the network: each tracker flush pass takes up to 16 unnamed rows, builds each address's reverse name, matches it against the declared
forward_zones, and on a match sends one PTR query to that zone's resolver, storing the answer as a learned name. This requires a conditional forward zone covering the LAN's reverse space — for example168.192.in-addr.arpapointed at the router; without one, nothing is sent anywhere. A hand-typed name always wins, learned names never appear innxdns exportand are never set bynxdns import, and each row refreshes once a day (an hour after a failure), so a rename can show stale for up to 24 hours. The API'sClientobject gains alearned_namefield and the clients page shows it.
Changed
- The container CI gate — image build, image-contents assertion against the packaged artifacts, and the startup/shutdown smoke test — moved from workflow shell into
tools/container_check.zig, compiled and unit-tested byzig build testand runnable on a laptop against a local docker daemon. The health probe now runs under a real 60-second deadline (the shell loop's "30 seconds" could stretch past three minutes), and the gate's docker objects carry an ownership label so anything a dead runner leaks is discoverable. The version in CI is parsed frombuild.zig.zonthrough the zon grammar, once, instead of by two copies of asedregex.
Fixed
- The release tool's temporary-directory claim was not exclusive: the "create" it relied on succeeds on a directory that already exists, so a stale or concurrent directory could be silently adopted, written into, and deleted on exit. Both the release tool and the new container gate now claim their directories exclusively and retry on collision.
Downloads
- Client names learned over reverse DNS. A client row that carries no hand-typed name gets one from the network: each tracker flush pass takes up to 16 unnamed rows, builds each address's reverse name, matches it against the declared