• v0.0.23
    Gates / package (push) Successful in 47s
    Gates / container (push) Successful in 11s
    Release / gates (push) Successful in 12m3s
    Release / publish (push) Successful in 5m25s
    Gates / frontend (push) Successful in 2m15s
    Gates / test (push) Successful in 2m47s
    Gates / test-aarch64 (push) Successful in 8m28s
    Gates / package (push) Successful in 6m36s
    Gates / container (push) Successful in 16s
    CI / gates (push) Successful in 18m14s
    Release / guard (push) Successful in 41s
    Gates / frontend (push) Successful in 3m5s
    Gates / test (push) Successful in 3m19s
    Gates / test-aarch64 (push) Successful in 7m45s
    Stable

    mokhtar released this 2026-10-20 13:57:09 +00:00 | 41 commits to master since this release

    Fixed

    • A blackhole route to an upstream no longer stops failover. On a route like that, connect() fails with an errno the runtime has no name for, and nxdns took it for a fault of its own: the query got SERVFAIL at once, the next upstream was never tried, and nothing was charged to the unreachable one. A connect failure of that kind now counts against that upstream as ConnectFailed (cause Unexpected), and the query fails over.
    • The Overview charts no longer draw the current bucket as a fall in traffic. Every Overview window ends at the end of the bucket that holds the present moment, so its last bucket is still counting. Queries over time draws the curve into it dashed over a fainter fill, and Client activity draws its column faint inside a dashed outline. Both legends name "Still counting", and the tooltip and the chart's data table give that bucket's time as "
    • The query detail page names the device. The Client fact showed only the address, while the Activity list showed "iPhone (192.168.50.52)" for the same query. It now uses the list's label. The query log records only the address, so the record's intro says the device name is the one the address has today.

    Added

    • A NixOS module. The flake exports nixosModules.default, which adds services.nxdns with four options: enable, package, configFile and openFirewall. It runs the release's own nxdns.service with a drop-in for file mode, checks configFile with the pinned binary's nxdns import at build time so a configuration that does not parse, validate or reconcile fails the build, and restarts the service when only the configuration changes. The flake's package now also installs lib/systemd/system/nxdns.service. See "Install nxdns with Nix".
    • nxdns_upstream_local_resource_total counts exchanges that ended on this process's own resources (memory, file descriptors, an unnamed system error) before any upstream answered. Until now, such a SERVFAIL left no record of its cause anywhere.

    Changed

    • The compose file names its own release. deploy/docker/compose.yaml defaults its image to the release it is tagged with instead of :latest, so docker compose up -d with the file from a tag runs that tag's image, and the install and upgrade steps no longer set NXDNS_VERSION. The variable still picks another release, and NXDNS_IMAGE still names a local image. Compose files from v0.0.22 and earlier keep the :latest default.
    • A DoH upstream that answers with an error status says which. The Diagnostics episode and /api/health read HttpStatus (status 505 HTTP Version Not Supported) instead of HttpStatus (cause HttpStatus). A 505 is a server that requires HTTP/2, which nxdns does not speak.

    Artifacts

    255ffa81b09cd84c25e92c699c3b8be59ea2bc287accdca62ed81f5219d852af  nxdns-0.0.23-x86_64-linux-musl.tar.gz
    563be323c6ef1601c3a547233aa70dcacc384507210aa54d2c7efcf833148055  nxdns-0.0.23-aarch64-linux-musl.tar.gz
    a680d2fc13ca7723d006c888a82ee10acf7d83f541d6c74deeac0d29993bb87b  IMAGE-DIGEST.txt
    
    git.mial.net/mokhtar/nxdns:0.0.23@sha256:7a554696b9649c92e2ead85ebf8a04ce37339ed68e8fe3452f2d3f8bcc3994d1
    

    Compare v0.0.22...v0.0.23

    Commits since v0.0.22
    9a99890 build: bump version to 0.0.23
    4ad7ad6 changelog: date the 0.0.23 section
    b4ef7b8 website: plan records the approved look, three install tabs and phone screenshots
    d9d1c1d docs: verify-a-release transcripts elide the signing key's email address
    f351469 nix: a services.nxdns module that runs the packaged unit in file mode against a configuration the pinned binary accepted
    aa8c9e2 deploy: the compose file names its own release, and the cut moves it with the version
    ea9f16a admin: the overview's last bucket is drawn as still counting; the query detail names the device as the activity list does
    8efe504 upstream: an unnamed connect errno fails over, local-resource exchanges are counted, doh faults carry the http status
    2697adf website: demo household and the admin screenshots it produced
    4ef795a docs: config examples use cloudflare doh; quad9 doh needs http/2 and answers 505
    
    Downloads