Skip to content

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.

TokenUsed for
framePanel borders, window chrome
frameDimDim/inactive panel chrome
accentPrimary highlights, active selections
accentSoftSecondary highlights
skillHighlightSkill invocation markers
textMain body text
mutedSecondary/metadata text
successPositive outcomes, check marks
warningNon-fatal alerts
dangerErrors, denied permissions
codeInline code, tool names
thinkingExtended reasoning / thinking output
userBackgroundUser message bubble background
assistantBackgroundAssistant message bubble background
systemBackgroundOutermost terminal background

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

Terminal window
/theme dracula # switch in the TUI
/theme # open picker

The 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.

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.