UI Themes
Six built-in palettes, selectable from the Theme dropdown in Settings → General:
There’s also a System option, which follows your OS’s light/dark preference — but only ever resolves to Coder Dark or Coder Light, never Charcoal or Cappuccino, since there’s no principled “system version” of a themed palette beyond the app’s own default pair.
Switching takes effect immediately, no restart required. Your last choice is remembered on next launch with no flash of the wrong palette (a small cache of the resolved theme is applied before the app’s UI even starts rendering).
Editor Themes
Eight built-in Monaco themes, selectable from the Editor theme dropdown in Settings → General — completely independent of the UI theme above:
Each theme includes PHP-specific token color rules in addition to the generic ones, since Monaco’s bundled PHP grammar emits its own token names that the generic rules alone don’t match.
Switching the editor theme applies live to every open tab and the git diff viewer — no reopening files required.
The integrated terminal also follows the editor theme rather than the UI theme, since it’s monospace/code-adjacent text — each editor theme has a matching 16-color terminal palette (hand-derived from that theme’s own colors, since ANSI terminal colors aren’t part of a Monaco theme). Switching applies live to every open terminal tab.
Mix and match
Because the two systems are independent, you can run e.g. the Charcoal UI with the Coder Dark (Mocha) editor theme, or Coder Light UI with Cappuccino editor colors — whatever combination you prefer. The “coordinated” pairs (same name on both sides, like Charcoal ↔ Charcoal) are simply the sets that were designed to look like one cohesive system if you want that, not a requirement.Custom themes
Coder loads your own themes from~/.coder/themes/ — one folder per theme, and the folder name is the theme id (shown as-is in the dropdowns, e.g. themes/dracula/ → “dracula”):
- UI:
~/.coder/themes/<your-id>/ui.css— a:root { --var: value; ... }block, same 15 variables as the built-in palettes (exact shape below). Nodata-theme="..."attribute needed on the selector — the folder name already is the id. - Editor:
~/.coder/themes/<your-id>/editor.json— a MonacoIStandaloneThemeDataobject (exact shape below).
UI theme variables
A UI theme is exactly these 15 CSS custom properties, declared inside a plain:root { ... } block — no data-theme="..." attribute needed, since the folder name is already the id. All 15 are required — there’s no partial-override/fallback-to-default behavior today. Values shown are Coder Dark (Mocha):
:root) is never actually read — only the declarations inside { } matter, the folder name is still what determines the theme’s id. :root is just the conventional, always-valid choice so the file lints clean in any editor.
Three layout variables (--titlebar-height, --sidebar-width, --chat-width) are not part of a theme — they’re structural, shared by every palette.
Editor theme JSON
An editor theme is a MonacoIStandaloneThemeData object — base ('vs-dark' or 'vs'), inherit: true, a rules array of token→color mappings, and a colors map of editor chrome colors:
*.php rules exist because Monaco’s bundled PHP grammar emits its own token names (variable.php, keyword.php, etc.) instead of matching the generic ones above it — without them, PHP code falls back to plain foreground for variables, property/method names, and punctuation. Every other token type (comment, keyword, string, …) works across all languages via Monaco’s generic Monarch token names.