• v0.0.12
    Release / guard (push) Successful in 35s
    Gates / frontend (push) Successful in 1m40s
    Gates / test (push) Successful in 2m23s
    Gates / test-aarch64 (push) Successful in 7m12s
    Gates / package (push) Successful in 4m18s
    Gates / container (push) Successful in 16s
    Release / gates (push) Successful in 14m12s
    Release / publish (push) Failing after 4m57s
    Stable

    mokhtar released this 2026-08-30 09:58:51 +00:00 | 38 commits to master since this release

    Overview stops re-reading the whole query log. One endpoint, one snapshot, pre-aggregated buckets — a 30-day view now costs the same on a month of history as on a day of it. Read the upgrade note first: it resets your query history.

    Changed

    • Upgrading resets your query history. The query-log schema gains the aggregate tables described below, and querylog.db is never migrated: the first start after the upgrade sets the old file aside (kept on disk next to the new one, named with the reason) and begins a fresh log. Settings, groups, blocklists and every other configuration are untouched.
    • The Overview is served by one endpoint, GET /api/overview. It replaces GET /api/stats, /api/stats/timeseries, /api/stats/types, /api/stats/routes and /api/stats/clients, which are gone. The five panels now come from a single database snapshot, so they can no longer disagree with each other, and the page shows one loading and one error state instead of five.
    • Query statistics are pre-aggregated as they are written. The query log now maintains 30-minute aggregate tables in the same transaction that stores the rows, and the 24-hour, 7-day and 30-day views read those instead of scanning every logged query. The cost of opening the Overview no longer grows with the size of the log: measured at three million rows, the 30-day view went from roughly eight-tenths of a second of scanning to under fifty milliseconds, at the price of about ten percent on each background write batch and ~1.5 MB of disk. The server also keeps the most recent response per period in memory and serves repeat polls from it while nothing has changed — until new queries land, retention prunes, or the period's time window rolls forward — so on a quiet network most of the steady 30-second refreshes do no database work at all.

    The Overview charts move to visx and grow up: one hover treatment across all four, honest labels, and maintained d3 math under the app's own rendering.

    Changed

    • The Overview charts are drawn with visx. The hand-written chart layout code is replaced by visx 4.0.0 primitives — maintained d3 math for the scales, ticks, stacking and arcs — while the rendering, colours and themes stay the app's own. The charts read as before, with four behaviour improvements: all four charts now share the same hover treatment (the per-client chart and both donuts gain the tooltip and dimming the query timeline already had, so pointing at a ring segment names it, its count and its share), an open tooltip follows a data refresh instead of showing stale counts, and it retires cleanly when the time window rolls. The admin bundle grows by about 68 KB and stays under its size budget.
    • The query timeline's third series is called "Allowed". What the chart called "Other" is every query that was neither blocked nor served from cache — answered upstream, from a local record or a forward zone — so it is now named for what it is rather than for the subtraction that produces it. It stays on the chart even in a window where nothing was allowed, alongside Blocked and Cached: all three name a kind of answer a query can get, and a period where every query was blocked or cached is worth seeing.
    • The client chart drops "Other" in a window where it counted nothing. That series aggregates the clients outside the top eight, so when it counts nothing there is nothing being aggregated, and a legend entry, a tooltip row and a table column that exist only to say "zero" are noise. The named clients stay even at zero, because a client that went quiet is a fact about the window.

    Artifacts

    f31e83a49ca21f6d97cc6c0223c6d9ca05f0f1b2432653a4b2f9a93ca0e78d29  nxdns-0.0.12-x86_64-linux-musl.tar.gz
    45fe8337866989b9404f5e67945dfa989d72dc207bed3f95ea3c51dfa284b32e  nxdns-0.0.12-aarch64-linux-musl.tar.gz
    4cbfc00d7ca2db57a1b78587de185c2e77148eba70a2b0b4eefc97d52e53ab39  IMAGE-DIGEST.txt
    
    git.mial.net/mokhtar/nxdns:0.0.12@sha256:a9a60ba0e64701d0252d433a794dc5a035e3122f07e9fab5b1e2e6a77924f33c
    

    Compare v0.0.8...v0.0.12

    Commits since v0.0.8
    6170571 build: bump version to 0.0.12
    c847072 overview: one endpoint, live projections and a response cache (m36)
    7cdb74e build: bump version to 0.0.11
    4367003 changelog: 0.0.11
    728b8d6 admin: draw the overview charts with visx
    091962a build: bump version to 0.0.10
    4fcbd0a changelog: 0.0.10
    d961b15 db-mode config changes apply live in-process
    17e6e93 admin: only the content region scrolls on wide screens
    8a44d90 cut: schema gate — refuse to release an undisclosed querylog schema change
    03149b5 ci: drop the one-insn-per-tb workaround, the qemu panic is an 11.1.0-only regression
    a972c8d logger tests: join every writer future before its database closes, fix the gate-open race
    78d688a ci: run the aarch64 suite with one qemu insn per tb, tcg optimization falsely trips the ubsan pointer check
    fe5bd96 admin: live ring capacity is injectable, eviction test no longer timing-bound
    1f215ac build: bump version to 0.0.9
    2f86cd7 changelog: 0.0.9 releases today
    51cda8b milestone 33: contract closure — samples, file-authority enumeration, dead code, bundle ceiling
    e5f23d5 querylog: return to the default checkpoint cadence
    24521ab milestone 32: task-shaped configuration, file mode as a rendering, config status api
    c99a37d milestone 31: concurrent upstream exchanges, dot session reuse, queue metrics
    623667e milestone 30: overview as a dashboard, explicit health contract, period aggregations
    0e83477 agents: move opus-coder to the global scope
    fa323c7 milestone 29: activity — history, live and policy simulation on one surface
    0fd6bbd milestone 28: query provenance — every logged query is exactly explainable
    7e6cb50 release cut: bump-kind justfile recipe and a compiled, tested cut tool
    8a17e9e admin: fix dashboard phantom scroll, drop last-failure column from upstream table
    0107df5 spec: measurement window is the deployment side's call
    
    Downloads