- New /edit/theme-settings page with native color pickers for the
background/primary/positive/negative theme colors plus light mode,
contrast and saturation multipliers, custom-css-file path, and
picker-disable. Pickers use hex; the backend converts to Glance's
HSL "H S L" form before writing. Theme presets and full custom CSS
intentionally still YAML.
- Numbered backup chain: save() rotates up to 10 prior versions as
glance.yml.bak.1 .. .10 instead of a single .bak. The /edit page
lists them with humanized timestamps and a per-row Restore button.
Single-step "Restore previous (toggle)" is preserved.
- Restoring any backup saves the just-current state as a fresh
.bak.1, so undo-the-undo always works.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
A web editor at /edit for managing pages and widgets without hand-editing YAML:
- Page list and per-page widget views with breadcrumb navigation
- Add/delete pages, add/delete/reorder widgets within a column
- Per-widget textarea editor with curated starter templates, widget-specific
help (example, full field reference, link to upstream docs), and inline
error rendering that preserves the user's edits on validation failure
- Pre-save validation via newConfigFromYAML; atomic temp+rename writes with
.bak backup; YAML edits go through yaml.Node so comments and unresolved
${env:X}/${secret:X} tokens survive round-trips
- Auth gate: editing requires auth.users to be configured, or
admin.allow-without-auth: true as an explicit opt-in for trusted networks
- Pencil button on the dashboard near the theme picker for quick access
- Admin views read fresh from disk so the list updates immediately after
saves rather than lagging the fsnotify watcher
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>