A cleanup release: dark mode lands, scheduled jobs stop leaving stuck locks behind, and a lot of duplicated code and documentation goes away.
⚠️ Breaking
GET /health changed its response body. It was a JSON array of {"name","pass"} objects; it is now {"status":"ok"} or {"status":"unhealthy"}. Status codes are unchanged — 200 healthy, 503 unhealthy — so Kubernetes liveness and readiness probes are unaffected. Only scripts parsing the body need updating. The reason for a failure is now logged instead of returned, since the endpoint is unauthenticated and the error names the database host and port.
Added
- Dark mode, with a theme toggle in the header. The choice is kept in
localStorageand falls back toprefers-color-scheme; an inline script in<head>applies it before the first paint, so a dark session never flashes light.
Changed
- Scheduled jobs now coordinate through PostgreSQL advisory locks instead of a
cron_locktable (dropped by migration20260831210000_drop_cron_lock). A row-based lock outlived the process that took it, so an instance killed mid-job left the row behind and every later run skipped until a reaper cleared it — and that reaper would itself delete the lock of a job legitimately running past twelve hours. An advisory lock belongs to a session, so PostgreSQL releases it when the backend goes away, and there is nothing to reap. - Faster page loads. Inter is requested as four weights instead of the whole
wght@100..900axis, and ApexCharts is loaded only by the two pages that draw a chart instead of all eighteen templates. - Charts follow the design system. Both ApexCharts pages read their series and axis colours from the Kumo tokens, so they track the palette — dark mode included — instead of hard-coded hex. Hues are unchanged in light mode.
- Templates deduplicated. 46 repeated icon glyphs are defined once in
templates/icons.html;page-header,empty-stateandstat-trendpartials replace copies that had already drifted apart.admin.html— 1,940 lines, 38% of the project's HTML — splits into seven section files. - Logging goes through
log/slogdirectly; theloggerpackage was four wrappers around functions the standard library has had since Go 1.21. Server output is unchanged. - LDAP documentation is one document per Diátaxis category: nine files become five, 3,071 lines become 614.
Fixed
- Dark mode never actually applied. The token override block led with
:root, which matches<html>in both modes, and its!importantlight values kept winning. The light tokens now key off[data-mode="light"]alone. - Accessibility. Header menus carry
aria-haspopup,aria-controlsand a syncedaria-expanded, and close on Escape. The twenty modals arerole="dialog" aria-modal="true", are labelled from their own heading, take focus on open, restore it on close, and trap Tab inside the panel. - Navigation shows the current page. All eight links carried identical classes everywhere, so nothing told the reader — or a screen reader — where they were. Subtree matching included:
/analytics/securityhighlights Analytics. - The mobile menu had drifted from the desktop bar, listing the nav items in a different order, and the "New version" badge was written out twice.
GET /insightsreturned 500 on every request — it rendered a template that does not exist. The route is gone and the path now answers 404.LDAP_SKIP_TLS_VERIFYwas documented but never existed. Anyone who set it expecting a self-signed certificate to be accepted got a connection failure and no explanation.LDAP_GROUP_FILTER, the setting most often behind "not a member of any authorized group", was missing from the reference and is now documented.
Removed
- The
gin-healthcheckdependency, which dragged the MongoDB, Redis, InfluxDB and RabbitMQ clients into the build for checks the server never used./healthis now nine lines. Compiled packages drop from 536 to 433 and the binary loses 2.1 MB. docs/schema-compare.mdanddocs/txlog_expected.json, a 1,013-line proposal for a feature that was never built, along with thekomparoMakefile target that regenerated the JSON.scripts/embed_uikit_css.py, which pasted 88 KB of CSS intodocs/UI-KIT.htmlon every build. The page links the stylesheet now and drops from 105 KB to 16 KB.- Dead code:
util.Db,util.Check,util.CheckConfig,Get500,PostAdminForceCleanMigration,docs/generate_schema.sh, and thevscode-langservers-extractednpm dependency.
Full Changelog: v1.36.0...v1.37.0