v0.14.0 — the dashboard, and the API to drive it
A browser you can run a fleet from — and the API, CLI and Hub features it needed, which turn out to be the ones the product was already half-built for.
omnyserver_web is a static, installable PWA that operates a Hub with no backend of its own. It is the REST API, seen.
Six things were already built and wired to nothing
Most of this release is not new machinery. It is connecting what was already there:
MetricRepositorypersisted a sample on every heartbeat, and nothing ever read one back. NowGET /nodes/{id}/metrics,node metrics --since 1h, and a chart.DesiredState/StateReconciler— the product's thesis — existed in the domain, reachable from nothing. Now declare, diff, drift and reconcile, fromstate set|show|diff|reconcileand a declared-vs-actual panel.NodeAgent.sendLogsshipped batches the Hub decoded and threw away. Nownode logs -f.NodeDescriptor.labelsexisted with no flag that could set one. Nownode start --label env=prod,nodes list --label, and selectors that target them.PresetRepositoryhad no endpoint. Now a preset library: save once, apply by id, stop shipping preset files around.- The Hub had no persistence at all — no
--data-dir. Grants, presets, desired state and alerts now survive a restart.
New
- Grant-verified API auth.
--principal+--tokenare checked against the Hub's grant table and resolve to real roles, rather than being an attribution header. Aviewerlink is now safe to hand out; mutations needoperatororadmin. - Live events over SSE —
GET /events/stream,events --follow. The feed is a console, not a poll. - Async operations. An install that outlives a request no longer times out in the browser:
--asyncreturns an operation id,ops list|showtracks it. - Fleet selectors — act on one node, on a label, or on all of them, with a per-node result matrix instead of a single verdict.
- Alerts that hold a condition before they mean anything (disk over 90%, a node offline past its grace), announced once and resolved once.
- Live grant management — an operator can be added or revoked without restarting the Hub.
- CORS, so a browser can actually read the Hub's answers — including its errors.
Every endpoint landed with its CLI command in the same change, so the CLI never falls behind the UI.
Requires
omnyhub1.6.0 — CORS and Server-Sent Events.omnyshell_web1.15.0 — the terminal, imported rather than rebuilt, so a node's shell opens in the dashboard.
Full notes: CHANGELOG.md