What
Instance repositories can now provide selectable appearance themes as one stylesheet per theme.
profile/themes/index.jsonlists{ "id", "name" }entries.profile/themes/<id>.cssis that theme’s stylesheet, scoped to:root[data-theme="<id>"].- Account → Appearance lists the built-in Everforest variants plus the instance themes, grouped under This instance.
- Theme stylesheets are linked before
profile/custom.css, so instance-wide overrides still apply last. - The server validates ids and names, rejects duplicate/reserved ids and missing stylesheets, and keeps the previous snapshot on error.
theme.jsaccepts the instance ids from<html data-themes="…">before first paint, so a saved custom theme does not flash or get cleared just because the script does not know it.
Why
The appearance picker was hardcoded to Everforest. The instance repository already owns the instance’s presentation, so it should be able to offer named palettes without adding server code for each one.
Default repository docs
The starter repository now creates profile/themes/index.json and its root README.md documents the theme-pack format, the id rules, the data-theme selector, dark/light requirements, and the difference between a selectable theme and profile/custom.css. The Admin Configuration path table and docs/configuration.md describe the same convention.
Stacking
This is based on instance-repo-init (#225) because it extends the instance repository seed and docs from that request. Land #225 first.
Checks
./vole workflow run verify passes.