Skip to main content
Since v1.125, every color in ChatCLI comes from a single source of truth: the ui/theme package. It defines a semantic palette (colors named by role, not by hue), detects the terminal’s color capability, and ships 11 ready-made themes (dark, light + 9 community palettes) that re-skin the entire UI — chat, /coder and /agent cards, borders, markdown, code blocks, and spinners — with no restart.
The theme is process-global state. Switching applies on the next render, no restart needed. Unlike CHATCLI_CODER_UI (the timeline style), which the renderer re-reads from the environment on every call.

Switch themes at runtime

/config ui                     # show the active theme + detected color profile
/config ui theme               # same thing (explicit form)
/config ui theme dark          # switch to the dark theme
/config ui theme dracula       # switch to any theme by name
/config ui theme tokyo-night   # hyphenated names work fine

/config theme dracula          # shorthand equivalent to /config ui theme dracula
Full autocomplete: type /config ui theme <TAB> (or /config theme <TAB>) and every theme appears: dark · light · dracula · nord · tokyo-night · solarized-dark · solarized-light · gruvbox · catppuccin-mocha · monokai · one-dark.
The status panel (/config ui) shows the active theme, the source of the value (environment variable vs. default), the detected color profile, and the list of themes with the active one marked by →.

Available themes

There are 11 themes in total. Each strip shows the name and the palette’s real colors, in the order model · accent (reasoning) · ok · warn · error: dark theme — default, dark-background terminals light theme — light-background terminals dracula theme — high-contrast purple/pink/cyan nord theme — cool arctic, low saturation tokyo-night theme — modern night-blue solarized-dark theme — Solarized on its dark base solarized-light theme — same hues on a light background gruvbox theme — retro, warm, high-contrast catppuccin-mocha theme — soft pastel (Mocha) monokai theme — classic editor palette on charcoal one-dark theme — Atom’s balanced blue/gray
dark and light are ChatCLI’s calibrated variants; the other nine are adaptations of the classic community palettes mapped onto ChatCLI’s semantic roles (same structure, different colors). All of them degrade to 256 and 16 colors while keeping the roles distinguishable.
The switch applies the palette all at once because Colorize and the ansiColorToLip converter route through the active theme — there’s no call-site churn.

Semantic palette

Colors are named by the role they serve, not by hue. That’s what makes swapping the whole theme a matter of touching only the palette:
GroupFieldUse
Brand/HierarchyPrimarymodel name, primary actions
Secondarymulti-agent, batch, secondary badges
Accentreasoning / cognitive emphasis
Mutedneutral borders, secondary text, defaults
Semantic stateSuccesstool success, enabled
Warningwarnings, disabled
Dangererrors, tool failure
Infonotes / explanations
StructuralBorderdefault card border
Text / TextStrongbody text / bold and headings
Backgroundcode-block background

Themed markdown

Markdown is rendered by glamour with a StyleConfig derived from the palette (replacing the legacy glamour.WithStandardStyle("dark")), so markdown and code-block colors share the UI’s hues. Syntax highlighting via chroma and a language chip above each code block. The document is rendered whole (not block by block), so reference links, footnotes, and paragraph spacing all resolve correctly.

Color profile and graceful degradation

ChatCLI detects the terminal’s capability and degrades gracefully. In pipes, CI, or dumb terminals, output becomes clean plain text with no color codes.
ProfileMeaning
TrueColor24-bit terminal
ANSI2568-bit (256-color) terminal
ANSIclassic 16-color terminal (SGR 30–37 / 90–97)
ASCIIno color — NO_COLOR, dumb, pipe/redirect
Detection honors the usual signals (NO_COLOR, CLICOLOR_FORCE, TERM, COLORTERM). The dark theme keeps the ANSI16 = 10 index for green, so 16-color terminals are identical to legacy behavior.

Persistence

A runtime switch applies only to the current process. To pin a default across sessions, add to your .env:
CHATCLI_THEME=light
The mutator prints this hint right after each switch. ChatCLI never rewrites your .env on its own. See CHATCLI_THEME in the environment-variable reference.
Parallel change in v1.125: the chat reply envelope gained a footer with per-turn cost and context usage, and spinners were unified into a single themed braille spinner, shown only when a terminal is present.