v0.15.0
Highlights
This release brings an agnostic software upgrade frontend, opt-in and
disabled by default.
- #123 — Software upgrades: Odio implements neither detection nor upgrade
logic. It reads a result file written by an external detector (current/latest
version, availability) and can trigger two systemd user units — one to
re-check, one to run the upgrade — surfacing status, live run progress and a
header badge in the UI.
✨ Features
- Agnostic upgrade frontend —
GET /upgradefor detector status, plus
POST /upgrade/checkandPOST /upgrade/startto trigger the configured
units. Capabilities are additive: the result file alone enables read-only
status, and each configured unit enables its trigger. - Internal user units — configured upgrade units register as internal:
triggerable, but hidden from/servicesand the event stream. - Live run progress over a Unix socket — the upgrade script writes one JSON
line per milestone (tmpfs, no SD-card write wear), relayed verbatim as
upgrade.progressSSE events. The run verdict comes from the systemd job
result (authoritative), independent of the script's self-report; in-flight
state is mirrored inGET /upgradeso a client reloading mid-upgrade still
sees it.
🎨 UI
- Upgrade status badge in the header, surfacing availability and live run
state — language-agnostic, via icon and colour.
🧹 Internal
- New
upgrade.info/upgrade.progressevent types and an internal flag
on the eventStreaminterface. cache.Value— a lock-free single-value holder.- Upgrade backend configuration (
upgrade:block, opt-in).
Full changelog: v0.14.0...v0.15.0