-
v0.0.12
StableRelease / guard (push) Successful in 35sGates / frontend (push) Successful in 1m40sGates / test (push) Successful in 2m23sGates / test-aarch64 (push) Successful in 7m12sGates / package (push) Successful in 4m18sGates / container (push) Successful in 16sRelease / gates (push) Successful in 14m12sRelease / publish (push) Failing after 4m57sreleased this
2026-08-30 09:58:51 +00:00 | 38 commits to master since this releaseOverview 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.dbis 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 replacesGET /api/stats,/api/stats/timeseries,/api/stats/types,/api/stats/routesand/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.txtgit.mial.net/mokhtar/nxdns:0.0.12@sha256:a9a60ba0e64701d0252d433a794dc5a035e3122f07e9fab5b1e2e6a77924f33cCommits 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 callDownloads
- Upgrading resets your query history. The query-log schema gains the aggregate tables described below, and