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.
Selecting a theme
Section titled “Selecting a theme”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", },}Theme file location
Section titled “Theme file location”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.
Bundled themes
Section titled “Bundled themes”| Theme | Description |
|---|---|
default | Monochrome design system (GitHub-inspired) |
github | GitHub Light / Dark |
catppuccin | Catppuccin Latte (light) / Macchiato (dark) |
dracula | Dracula color palette |
one | One Half Light / Dark |
Color schemes
Section titled “Color schemes”planeai bundles every color scheme that Ghostty ships, from iTerm2-Color-Schemes (MIT license). Each scheme belongs to its author, credited in the bundled CREDITS.md. In Preferences → Appearance, the Light and Dark dropdowns below the theme buttons set what each mode uses. Each lists the CSS themes first, tagged planeai, then the color schemes for that mode. Picking one mode keeps the other, so you can pair the default theme in light mode with a color scheme in dark mode. The theme buttons still apply one CSS theme to both modes.
With a color scheme, the terminal uses the scheme’s colors exactly. The rest of the UI (sidebar, panels, text, accent, diffs, and editor highlighting) is derived from the scheme, with a minimum text contrast enforced.
In the config file, theme is either a CSS theme name for both modes, or one entry per mode.
An entry is a color scheme name, or { "css": "<name>" } for a CSS theme:
{ "appearance": { "theme": { "light": { "css": "default" }, "dark": "Dracula" }, },}If a mode’s theme cannot be found, that mode falls back to the built-in default colors.
To add your own scheme, drop a file in Ghostty’s theme format into ~/.config/planeai/themes/ghostty/.
The file name is the scheme name, and a file with the same name as a bundled scheme replaces it.
Creating a custom theme
Section titled “Creating a custom theme”- Copy an existing theme as a starting point:
Terminal window cp ~/.config/planeai/themes/default.css ~/.config/planeai/themes/my-theme.css - Edit the CSS custom properties in
my-theme.css - Select “my-theme” in Preferences → Appearance
File structure
Section titled “File structure”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; /* ... */}Token reference
Section titled “Token reference”UI role tokens
Section titled “UI role tokens”| Token | Description |
|---|---|
--color-canvas | Base page background |
--color-chrome | Chrome/header background |
--color-sidebar | Sidebar background |
--color-main | Main content area background |
--color-panel | Panel/card background |
--color-panel-hi | Elevated panel (hover states, highlights) |
--color-t1 | Primary text |
--color-t2 | Secondary text |
--color-t3 | Muted text (hints, placeholders) |
--color-border | Default border (subtle) |
--color-border-s | Strong border (more visible) |
--color-accent | Primary accent color |
--color-on-accent | Text color on accent backgrounds |
--color-accent-bg | Accent tint background (selections, highlights) |
--color-scrim | Modal/overlay backdrop |
Status colors
Section titled “Status colors”| Token | Description |
|---|---|
--color-status-running | Active/running indicator (green) |
--color-status-review | Needs review indicator (amber) |
--color-status-exited | Error/exited indicator (red) |
--color-status-idle | Idle/inactive indicator (gray) |
| Token | Description |
|---|---|
--radius-base | Small elements (buttons, inputs) |
--radius-container | Large containers (cards, panels) |
Terminal colors (16 ANSI + chrome)
Section titled “Terminal colors (16 ANSI + chrome)”| Token | Description |
|---|---|
--terminal-background | Terminal background |
--terminal-foreground | Terminal foreground |
--terminal-cursor | Cursor color |
--terminal-selection | Selection background |
--terminal-black | ANSI black |
--terminal-red | ANSI red |
--terminal-green | ANSI green |
--terminal-yellow | ANSI yellow |
--terminal-blue | ANSI blue |
--terminal-magenta | ANSI magenta |
--terminal-cyan | ANSI cyan |
--terminal-white | ANSI white |
--terminal-bright-* | Bright variants (×8) |
Diff colors
Section titled “Diff colors”| Token | Description |
|---|---|
--diff-add-bg | Added line background |
--diff-del-bg | Deleted line background |
--diff-add-color | Added line text color |
--diff-del-color | Deleted line text color |
Editor colors
Section titled “Editor colors”| Token | Description |
|---|---|
--editor-background | Editor background |
--editor-foreground | Editor text |
--editor-selection | Selection background |
--editor-line-number | Line number gutter |
--editor-added | Added text in editor |
--editor-deleted | Deleted text in editor |
--editor-added-bg | Added line background in editor |
--editor-deleted-bg | Deleted line background in editor |
Syntax highlighting
Section titled “Syntax highlighting”| Token | Description |
|---|---|
--editor-keyword | Keywords (if, return, import) |
--editor-string | String literals |
--editor-comment | Comments |
--editor-number | Numeric literals |
--editor-variable | Variables |
--editor-type | Type annotations |
--editor-function | Function names |
--editor-property | Object properties |
--editor-operator | Operators |
--editor-punctuation | Brackets, semicolons |
--editor-meta | Meta/decorators |
Minimal theme example
Section titled “Minimal theme example”/* 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;}