Skip to content

v1.37.0

Latest

Choose a tag to compare

@rdeavila rdeavila released this 01 Sep 22:39
c652fca

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 localStorage and falls back to prefers-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_lock table (dropped by migration 20260831210000_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..900 axis, 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-state and stat-trend partials 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/slog directly; the logger package 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 !important light values kept winning. The light tokens now key off [data-mode="light"] alone.
  • Accessibility. Header menus carry aria-haspopup, aria-controls and a synced aria-expanded, and close on Escape. The twenty modals are role="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/security highlights 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 /insights returned 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_VERIFY was 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-healthcheck dependency, which dragged the MongoDB, Redis, InfluxDB and RabbitMQ clients into the build for checks the server never used. /health is now nine lines. Compiled packages drop from 536 to 433 and the binary loses 2.1 MB.
  • docs/schema-compare.md and docs/txlog_expected.json, a 1,013-line proposal for a feature that was never built, along with the komparo Makefile target that regenerated the JSON.
  • scripts/embed_uikit_css.py, which pasted 88 KB of CSS into docs/UI-KIT.html on 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 the vscode-langservers-extracted npm dependency.

Full Changelog: v1.36.0...v1.37.0