- 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>
- Head widgets are now first-class in dashboard edit mode: they get
drag/edit/delete handles, their own SortableJS group (so they can't
cross into columns), and the layout endpoint accepts a
headWidgets[] sequence alongside columns[].
- New POST /edit/api/restore swaps glance.yml ↔ glance.yml.bak —
effectively undo (and click again to redo). Surfaced as a "Restore
previous version" button on /edit.
- group and split-column are now editable inline via a new
list-of-widgets schema type. Each item picks a widget type from a
dropdown (excluding group/split-column to honor the backend's
no-nesting rule) and renders that type's schema-driven sub-form.
Switching the type re-renders the body.
- New /edit/site-settings page with a form for branding (app name,
logo, favicon, footer, app icon/background). POST applies via the
same surgical yaml.Node update used for widgets. Theme/server
intentionally still YAML for now.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Pages can now be reordered, renamed, and have their metadata edited
without touching YAML.
- Up/down arrows next to each page in the /edit list to reorder.
- "Settings" button per page opens /edit/pages/{slug}/settings — a
form covering name, slug, page width, desktop nav width, mobile
header, hide desktop nav, center vertically.
- POST /edit/api/pages/{slug}/fields applies metadata changes
surgically via the existing yaml.Node + atomic-save flow so
columns/widgets/comments stay untouched.
- POST /edit/api/pages/{slug}/move?dir=up|down swaps adjacent pages.
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>