TUI Theming
The TUI ships with 40+ built-in themes, all defined in src/cli/tui/theme.ts. The active theme is a live singleton (umbraTheme) that every Ink component reads — switching themes takes effect immediately without restart.
Theme object shape (UmbraTheme)
Section titled “Theme object shape (UmbraTheme)”| Token | Used for |
|---|---|
frame | Panel borders, window chrome |
frameDim | Dim/inactive panel chrome |
accent | Primary highlights, active selections |
accentSoft | Secondary highlights |
skillHighlight | Skill invocation markers |
text | Main body text |
muted | Secondary/metadata text |
success | Positive outcomes, check marks |
warning | Non-fatal alerts |
danger | Errors, denied permissions |
code | Inline code, tool names |
thinking | Extended reasoning / thinking output |
userBackground | User message bubble background |
assistantBackground | Assistant message bubble background |
systemBackground | Outermost terminal background |
Built-in themes
Section titled “Built-in themes”umbra (default), aura, ayu, carbonfox, catppuccin, catppuccin-frappe, catppuccin-macchiato, cobalt2, cursor, dracula, everforest, flexoki, github, gruvbox, kanagawa, lucent-orng, material, matrix, mercury, monokai, nightowl, nord, one-dark, opencode, orng, osaka-jade, palenight, rosepine, solarized, synthwave84, tokyonight, vercel, vesper, zenburn, vscode-default, classic, dark-pro, pastel, hacker, retro, snow, midnight
Switching themes
Section titled “Switching themes”/theme dracula # switch in the TUI/theme # open pickerThe selected theme is persisted to ~/.umbra/runtime-preferences.json under the theme key and restored on next launch. Fallback is always umbra if the stored name is not found.
Adding a custom theme
Section titled “Adding a custom theme”Add an entry to the THEMES record in src/cli/tui/theme.ts with all 15 required tokens and rebuild. Custom themes follow the same lifecycle as built-ins.