Three usability improvements from live testing feedback:
- Restart-pending banner: every successful POST to /api/v3/config/main
(display hardware, rotation/durations, general settings) now raises a
persistent banner - "Configuration saved, restart the display to apply" -
with a Restart Now button that posts restart_display_service directly.
Backed by sessionStorage so it survives tab switches and reloads until
restarted or dismissed. Plugin config saves are deliberately excluded:
they apply live via the display process's config watcher.
- Unsaved-changes guard: plugin config panels are Alpine x-if templates,
so navigating away destroys the panel and revisiting re-fetches it -
edits were silently discarded. Forms now mark themselves dirty on input
(cleared on successful submit), a capture-phase click handler confirms
before a lossy tab switch, and beforeunload guards full page unloads.
System tabs (x-show, persistent DOM) are exempt - no false prompts.
- Installable web app: manifest.json (standalone display, dark theme) +
generated LED-grid icons (192/512 maskable + 180 apple-touch), linked
from base.html. "Add to Home Screen" now yields an app-like fullscreen
experience; no service worker, so zero behavioral risk.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KEZK1P1Q1fu5pcuVrkrCFZ