Skip to content

Themes ​

The interface is styled entirely through CSS custom properties, applied at the app level — never per project.

  • Built-in theme — doru, a single JSON palette file in the app's themes/ directory: one file per theme, no CSS. The file holds both the dark and the light palette; the operating system appearance decides which one applies — switch your OS to light mode and Dóru follows instantly. The file name is the theme id (doru.json); the name field inside is the display name.
  • Pick the theme in settings.json (see Settings) with a single string, or from the in-app Settings page (Theme dropdown); the choice is stored in settings.json either way.
  • The colors of the active palette are resolved to --doru-* CSS custom properties at startup.

User themes ​

Drop a <id>.json file with dark and light palettes into the themes directory inside the app's data directory (the same place where settings.json lives — see Settings), then pick it with "theme": "<id>" in settings.json. Restart the app after adding a file so it is picked up. The directory is created on first run; a user theme whose id matches a bundled one overrides it. A theme file that is malformed or does not match the schema is skipped (a warning is logged), like a missing one, and does not appear in the theme list. Bundled themes carry a $schema reference (https://doru.family/theme.json) — add the same line to your own file to get autocompletion and validation in editors that understand JSON Schema.

Bundled themes, each with a dark and a light palette:

Theme idDisplay name
doru (default)Dóru
one-darkOne Dark
githubGitHub
solarizedSolarized
gruvboxGruvbox
catppuccinCatppuccin
ayuAyu
rose-pineRosé Pine
everforestEverforest

The default Dóru palette follows the app icon: a deep forest green with warm paper tones. The dark palette layers surfaces from a near-black green-tinted canvas to lighter chrome and popovers; the light palette uses warm paper and cream.

Available variables:

VariableMeaning
--doru-bg-canvaseditor background and tab strip
--doru-bg-chromeactivity bar, sidebars, floating-panel surface
--doru-bg-raisedcards, chips, the chat input
--doru-bg-popovermenus and pickers
--doru-bg-inputbuttons, inputs, selects
--doru-fg / --doru-fg-muted / --doru-fg-faintmain, muted and faint text
--doru-border / --doru-border-stronghairlines and stronger borders
--doru-accent / --doru-accent-hover / --doru-accent-activeaccent (forest/sage green)
--doru-on-accenttext on the accent background
--doru-accent-alphatranslucent accent (chips, chat bubbles)
--doru-focusfocus ring color
--doru-overlay-hover / --doru-overlay-pressedhover/pressed overlays
--doru-success / --doru-warning / --doru-danger / --doru-infostate colors
--doru-radius-sm / --doru-radius-md / --doru-radius-lg4 / 6 / 8 px radii
--doru-control-heightcontrol height (28px)
--doru-panel-guttergap between the floating panels and the window edge (4px)
--doru-panel-radiusfloating-panel corner radius (8px)

The name comes from Proto-Indo-European *dóru — “tree”.