Where themes live
Themes live in data/themes/ (or DEGOOG_THEMES_DIR). Each theme is a folder named by its id (e.g. 1999, zen), containing at least a theme.json manifest.
Theme manifest (theme.json)
Required:
- name (string) — Display name in Settings → Themes.
Optional:
- author, description, version — Shown on the theme card.
- css (string) — Path to the stylesheet relative to the theme folder (e.g.
style.cssorstyle.scss). SCSS is compiled at load. When the theme is active this file is served at/theme/style.css. - html (object) — Full HTML overrides. Keys:
index,search. Value is the filename in the theme folder (e.g."index": "index.html"). When the theme is active, that file is served instead of the built-in home or search page. - settingsSchema (array) — Same shape as plugin SettingFields (key, label, type: text | password | url | toggle | textarea, etc.). If present, a Configure button appears on the theme card; values are stored in
data/plugin-settings.jsonundertheme-<theme-id>.
Setup
Create data/themes/ (or set DEGOOG_THEMES_DIR). Each theme is a subfolder, e.g. data/themes/my-theme/, with:
- theme.json (required)
- style.css or style.scss (optional) — Use the same CSS variables as the app (
--bg,--text-primary,--text-link, etc.) so light/dark mode work. See the app’s main styles for the variable set. - index.html, search.html (optional) — Only used if listed under
htmlin theme.json.
The theme id is the folder name.
Applying a theme
Settings → Themes → choose a theme → Apply. The active theme id is stored in data/plugin-settings.json as theme.active (e.g. "theme": { "active": "1999" }).
Example: Official zen theme.