• v0.0.3 efbe355070

    v0.0.3
    Gates / frontend (push) Successful in 1m3s
    Gates / test (push) Successful in 1m39s
    Gates / test-aarch64 (push) Successful in 6m28s
    Gates / container (push) Successful in 18s
    Release / guard (push) Successful in 1m30s
    Gates / test-aarch64 (push) Successful in 5m45s
    Gates / package (push) Successful in 24s
    Release / gates (push) Successful in 7m54s
    Gates / package (push) Successful in 5m34s
    CI / gates (push) Successful in 14m5s
    Gates / frontend (push) Successful in 58s
    Gates / test (push) Successful in 1m29s
    Gates / container (push) Successful in 10s
    Release / publish (push) Successful in 9m12s
    Stable

    mokhtar released this 2026-08-15 10:57:14 +00:00 | 82 commits to master since this release

    Devices 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 example 168.192.in-addr.arpa pointed at the router; without one, nothing is sent anywhere. A hand-typed name always wins, learned names never appear in nxdns export and are never set by nxdns 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's Client object gains a learned_name field 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 by zig build test and 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 from build.zig.zon through the zon grammar, once, instead of by two copies of a sed regex.

    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