Skip to content

Theming

Themes are CSS files that define custom properties controlling the entire UI — colors, radii, terminal palette, editor highlighting, and diff colors. planeai ships with several bundled themes and supports custom themes.

Open Preferences (⌘, / Ctrl+,) and look under the Appearance section. Available themes appear as clickable buttons — select one to apply it immediately.

Alternatively, set the theme in your config file:

{
"appearance": {
"theme": "catppuccin",
},
}

Themes live in ~/.config/planeai/themes/ (or %APPDATA%\planeai\themes\ on Windows). On first launch, planeai scaffolds this directory with the bundled themes. Any .css file you add here becomes available in the theme selector.

ThemeDescription
defaultMonochrome design system (GitHub-inspired)
githubGitHub Light / Dark
catppuccinCatppuccin Latte (light) / Macchiato (dark)
draculaDracula color palette
oneAtom One Light / Dark
  1. Copy an existing theme as a starting point:
    Terminal window
    cp ~/.config/planeai/themes/default.css ~/.config/planeai/themes/my-theme.css
  2. Edit the CSS custom properties in my-theme.css
  3. Select “my-theme” in Preferences → Appearance

Each theme defines variables in :root (light mode) and .dark (dark mode):

:root {
/* Light mode tokens */
--color-canvas: #f4f4f6;
--color-accent: #18181d;
/* ... */
}
.dark {
/* Dark mode tokens */
--color-canvas: #171717;
--color-accent: #f5f5f5;
/* ... */
}
TokenDescription
--color-canvasBase page background
--color-chromeChrome/header background
--color-sidebarSidebar background
--color-mainMain content area background
--color-panelPanel/card background
--color-panel-hiElevated panel (hover states, highlights)
--color-t1Primary text
--color-t2Secondary text
--color-t3Muted text (hints, placeholders)
--color-borderDefault border (subtle)
--color-border-sStrong border (more visible)
--color-accentPrimary accent color
--color-on-accentText color on accent backgrounds
--color-accent-bgAccent tint background (selections, highlights)
--color-scrimModal/overlay backdrop
TokenDescription
--color-status-runningActive/running indicator (green)
--color-status-reviewNeeds review indicator (amber)
--color-status-exitedError/exited indicator (red)
--color-status-idleIdle/inactive indicator (gray)
TokenDescription
--radius-baseSmall elements (buttons, inputs)
--radius-containerLarge containers (cards, panels)
TokenDescription
--terminal-backgroundTerminal background
--terminal-foregroundTerminal foreground
--terminal-cursorCursor color
--terminal-selectionSelection background
--terminal-blackANSI black
--terminal-redANSI red
--terminal-greenANSI green
--terminal-yellowANSI yellow
--terminal-blueANSI blue
--terminal-magentaANSI magenta
--terminal-cyanANSI cyan
--terminal-whiteANSI white
--terminal-bright-*Bright variants (×8)
TokenDescription
--diff-add-bgAdded line background
--diff-del-bgDeleted line background
--diff-add-colorAdded line text color
--diff-del-colorDeleted line text color
TokenDescription
--editor-backgroundEditor background
--editor-foregroundEditor text
--editor-selectionSelection background
--editor-line-numberLine number gutter
--editor-addedAdded text in editor
--editor-deletedDeleted text in editor
--editor-added-bgAdded line background in editor
--editor-deleted-bgDeleted line background in editor
TokenDescription
--editor-keywordKeywords (if, return, import)
--editor-stringString literals
--editor-commentComments
--editor-numberNumeric literals
--editor-variableVariables
--editor-typeType annotations
--editor-functionFunction names
--editor-propertyObject properties
--editor-operatorOperators
--editor-punctuationBrackets, semicolons
--editor-metaMeta/decorators
/* my-theme.css — Catppuccin-inspired custom theme */
:root {
--color-canvas: #e6e9ef;
--color-chrome: #e6e9ef;
--color-sidebar: #e6e9ef;
--color-main: #eff1f5;
--color-panel: #eff1f5;
--color-panel-hi: #dce0e8;
--color-t1: #4c4f69;
--color-t2: #6c6f85;
--color-t3: #8c8fa1;
--color-border: rgba(76, 79, 105, 0.08);
--color-border-s: rgba(76, 79, 105, 0.15);
--color-accent: #1e66f5;
--color-on-accent: #eff1f5;
--color-accent-bg: rgba(30, 102, 245, 0.1);
--color-scrim: rgba(76, 79, 105, 0.3);
--color-status-running: #40a02b;
--color-status-review: #df8e1d;
--color-status-exited: #d20f39;
--color-status-idle: #9ca0b0;
--radius-base: 0.5rem;
--radius-container: 1rem;
--terminal-background: #eff1f5;
--terminal-foreground: #4c4f69;
--terminal-cursor: #dc8a78;
}
.dark {
--color-canvas: #1e2030;
--color-chrome: #1e2030;
--color-sidebar: #1e2030;
--color-main: #24273a;
--color-panel: #24273a;
--color-panel-hi: #363a4f;
--color-t1: #cad3f5;
--color-t2: #a5adcb;
--color-t3: #6e738d;
--color-border: rgba(202, 211, 245, 0.08);
--color-border-s: rgba(202, 211, 245, 0.14);
--color-accent: #8aadf4;
--color-on-accent: #24273a;
--color-accent-bg: rgba(138, 173, 244, 0.12);
--color-scrim: rgba(0, 0, 0, 0.55);
--color-status-running: #a6da95;
--color-status-review: #eed49f;
--color-status-exited: #ed8796;
--color-status-idle: #5b6078;
--terminal-background: #24273a;
--terminal-foreground: #cad3f5;
--terminal-cursor: #f4dbd6;
}