Themes¶
Roost ships with a small set of bundled color themes. Pick one with theme = NAME in config.conf. Themes control colors only; font choice stays on font_family / font_size.
The setting takes effect on the next launch (themes are not hot-reloaded today). Unknown names fall back to roost-dark with a warning logged at startup.
Bundled themes¶
| Name | Style |
|---|---|
roost-dark |
The default. Roost's built-in dark palette (cmux-derived). |
Dracula+ |
Higher-contrast Dracula variant with cursor-text set. |
Dracula |
The original Dracula palette. |
Catppuccin Mocha |
Pastel dark; the "mocha" Catppuccin flavor. |
Gruvbox Dark Hard |
Warm, high-contrast retro palette. |
TokyoNight |
Cool blues + softer accent colors. |
Atom One Dark |
Atom editor's familiar dark scheme. |
The six themes other than roost-dark are byte-identical copies of files from Ghostty's bundled set. If you want a Ghostty theme that's not on this list, it usually parses cleanly in roost — see File format below.
File format¶
Theme files are plain key=value text with # comments — the same syntax as config.conf (and as Ghostty's themes). Roost honors:
| Key | Required | Effect |
|---|---|---|
background |
yes | Default background color. Parser errors if missing. |
foreground |
yes | Default foreground color. Parser errors if missing. |
palette = N=#RRGGBB |
no | One of the 16 ANSI colors (N in 0..15). Unset entries default to black. Indices 16–255 are computed (xterm 6×6×6 cube + 24-step gray ramp). |
cursor-color |
no | Cursor block fill. Defaults to foreground. |
cursor-text |
no | Glyph color when the cursor sits over a non-empty cell. Defaults to background. |
bold-color |
no | Color for bold text drawn with the default foreground. Bold-with-explicit-color (e.g. bold red) is unaffected. Defaults to foreground. |
selection-background |
no | Selection overlay color (rendered at 35% alpha). Defaults to foreground. |
selection-foreground |
no | Parsed but currently unused (see Limitations). Defaults to background. |
Unknown keys are silently ignored. A theme file is typically ~22 lines.
Example (the bundled Dracula+):
palette = 0=#21222c
palette = 1=#ff5555
palette = 2=#50fa7b
# ... palette = 3..14 ...
palette = 15=#f8f8f2
background = #212121
foreground = #f8f8f2
cursor-color = #eceff4
cursor-text = #282828
selection-background = #f8f8f2
selection-foreground = #545454
Limitations¶
- No user override directory. Only the bundled themes are loadable. To use a theme that isn't bundled, drop the file into
cmd/roost/themes/and rebuild — the directory is embedded into the binary at compile time. - No hot-reload. Theme is loaded once when each tab is created. To switch, edit
config.confand restart roost. selection-foregroundis parsed but not yet rendered. Roost's selection is currently a 35%-alpha overlay over the existing text; honoringselection-foregroundrequires switching to opaque selection + re-rendering glyphs, which is a render-order change tracked separately.- Indices 16–255 of the palette are not customizable — they're filled by the standard xterm formula. Bundled themes only set indices 0–15, matching every Ghostty theme.
Trying a Ghostty theme that isn't bundled¶
The format is identical, so you can usually copy a file in:
# Run from your roost checkout.
cp "/Applications/Ghostty.app/Contents/Resources/ghostty/themes/Solarized Dark - Patched" \
./cmd/roost/themes/
./build/build.sh
Then set theme = Solarized Dark - Patched in config.conf. If the theme uses keys roost doesn't honor (e.g. palette-generate), they're silently dropped — the rest still works.