A complete reference for the ~/.claude/themes/*.json schema, including all 72 reachable tokens (reconciled 2026-08-30 against Claude Code 2.1.251). Pairs with theme.schema.json for editor validation and autocomplete.
Custom themes require Claude Code v2.1.118 or later.
Selecting the theme via /theme stores custom:<filename-slug> as the preference. Claude Code watches the directory and reloads on file change.
| Field | Type | Required | Description |
|---|---|---|---|
$schema |
string | No | Editor hint for autocomplete/validation. Ignored by Claude Code. |
name |
string | No | Display label in /theme. Defaults to filename slug. |
base |
enum | No | Built-in preset to inherit from. Defaults to dark. |
overrides |
object | No | Sparse map of token → color. Tokens not listed fall through to base. |
base value |
Notes |
|---|---|
dark |
Default; standard dark theme. |
light |
Standard light theme. |
dark-daltonized |
Dark variant tuned for color-vision-deficiency safety. |
light-daltonized |
Light daltonized variant. |
dark-ansi |
Uses 16-color ANSI palette only — best for terminals with custom palettes. |
light-ansi |
ANSI light variant. |
| Form | Pattern | Example |
|---|---|---|
| Hex RGB | #rrggbb |
#a89278 |
| Short hex | #rgb |
#a87 |
| Functional RGB | rgb(r,g,b) |
rgb(168, 146, 120) |
| 256-color | ansi256(n) (0–255) |
ansi256(180) |
| Named ANSI | ansi:<name> |
ansi:cyanBright |
The 16 valid ANSI names: red, green, blue, yellow, magenta, cyan, white, black, plus a Bright suffix on each (redBright, greenBright, …).
Per the official docs: "Unknown tokens and invalid color values are ignored, so a typo cannot break rendering." Strict validation in theme.schema.json catches typos in your editor — runtime is forgiving either way.
Badges:
- Documented — listed in the official color token reference
- Internal — present in the binary's preset object, reachable via
overrides, but not in the public docs (descriptions inferred from naming and surrounding code)
| Token | Status | Controls |
|---|---|---|
claude |
Documented | Primary brand accent — spinner, assistant label |
claudeShimmer |
Documented | Lighter color paired with claude in animated gradients |
claudeBlue_FOR_SYSTEM_SPINNER |
Internal | Blue brand variant for the system spinner |
claudeBlueShimmer_FOR_SYSTEM_SPINNER |
Internal | Shimmer paired with claudeBlue_FOR_SYSTEM_SPINNER |
professionalBlue |
Internal | Anthropic-blue marketing accent (login, billing) |
chromeYellow |
Internal | Yellow marketing accent |
| Token | Status | Controls |
|---|---|---|
text |
Documented | Default foreground text |
inverseText |
Documented | Text on top of colored backgrounds (badges) |
inactive |
Documented | Hints, timestamps, disabled items |
inactiveShimmer |
Internal | Shimmer paired with inactive |
subtle |
Documented | Faint borders and de-emphasized text |
suggestion |
Internal | Suggestion-tier UI accents (autocomplete hints) |
remember |
Documented | Memory and CLAUDE.md indicators |
background |
Internal | Generic surface background fill |
| Token | Status | Controls |
|---|---|---|
success |
Documented | Success messages and passing checks |
error |
Documented | Errors and failures |
warning |
Documented | Warnings, cautions, auto-mode border |
warningShimmer |
Documented | Shimmer paired with warning |
merged |
Documented | Merged pull request status |
| Token | Status | Controls |
|---|---|---|
promptBorder |
Documented | Input box border (default mode) |
promptBorderShimmer |
Internal | Shimmer paired with promptBorder |
permission |
Documented | Permission prompts and pickers |
permissionShimmer |
Internal | Shimmer paired with permission |
planMode |
Documented | Plan mode accent and border |
autoAccept |
Documented | Accept-edits mode accent and border |
autoAcceptShimmer |
Internal | Shimmer paired with autoAccept |
skill |
Internal | Skill-invocation accent; shares its value with autoAccept |
effortUltra |
Internal | Ultra effort / thinking-level indicator |
bashBorder |
Documented | Input border when entering ! shell command |
ide |
Documented | IDE connection indicator |
fastMode |
Documented | Fast mode indicator |
fastModeShimmer |
Internal | Shimmer paired with fastMode |
| Token | Status | Controls |
|---|---|---|
diffAdded |
Documented | Background of added lines |
diffRemoved |
Documented | Background of removed lines |
diffAddedDimmed |
Documented | Unchanged context near added lines |
diffRemovedDimmed |
Documented | Unchanged context near removed lines |
diffAddedWord |
Documented | Word-level highlight in added lines |
diffRemovedWord |
Documented | Word-level highlight in removed lines |
These apply only when /tui fullscreen rendering is active.
| Token | Status | Controls |
|---|---|---|
userMessageBackground |
Documented | Background behind user messages |
userMessageBackgroundHover |
Internal | Hover variant of userMessageBackground |
composerSidebarBackground |
Internal | Background fill for the fullscreen composer sidebar |
messageActionsBackground |
Internal | Background fill behind per-message action affordances. Removed from the preset since v2.1.140 — overrides are now ignored. |
bashMessageBackgroundColor |
Internal | Background for shell-command messages |
memoryBackgroundColor |
Internal | Background for memory / CLAUDE.md annotations |
selectionBg |
Documented | Mouse-selection background |
Subagents declared with color: <name> in their YAML frontmatter draw using the matching token. Override these to recolor your agent transcripts.
| Token | Status |
|---|---|
red_FOR_SUBAGENTS_ONLY |
Documented |
blue_FOR_SUBAGENTS_ONLY |
Documented |
green_FOR_SUBAGENTS_ONLY |
Documented |
yellow_FOR_SUBAGENTS_ONLY |
Documented |
purple_FOR_SUBAGENTS_ONLY |
Documented |
orange_FOR_SUBAGENTS_ONLY |
Documented |
pink_FOR_SUBAGENTS_ONLY |
Documented |
cyan_FOR_SUBAGENTS_ONLY |
Documented |
| Token | Status | Controls |
|---|---|---|
rate_limit_fill |
Internal | Filled portion of the usage bar |
rate_limit_empty |
Internal | Empty portion of the usage bar |
| Token | Status | Controls |
|---|---|---|
briefLabelYou |
Internal | "You" label in compact transcript mode |
briefLabelClaude |
Internal | "Claude" label in compact transcript mode |
| Token | Status | Controls |
|---|---|---|
clawd_body |
Internal | Body color for the Clawd mascot art |
clawd_background |
Internal | Background behind the Clawd mascot art |
Each color has a *_shimmer partner for gradient animation.
| Pair | Status |
|---|---|
rainbow_red / rainbow_red_shimmer |
Internal |
rainbow_orange / rainbow_orange_shimmer |
Internal |
rainbow_yellow / rainbow_yellow_shimmer |
Internal |
rainbow_green / rainbow_green_shimmer |
Internal |
rainbow_blue / rainbow_blue_shimmer |
Internal |
rainbow_indigo / rainbow_indigo_shimmer |
Internal |
rainbow_violet / rainbow_violet_shimmer |
Internal |
Custom themes only control the prebuilt UI tokens above. Code-block coloring is a separate subsystem and is not theme-controllable.
Code blocks are syntax-highlighted by highlight.js, which Claude Code maps to hardcoded ANSI scopes in the binary (ae object), not to theme tokens. The mapping is fixed:
keyword → blue (ANSI)
literal → blue
class → blue
name → blue
string → red
number → green
comment → green
So there is no code, codeBlock, inlineCode, or syntax* key in the preset, and no overrides entry can recolor code text. Why this matters: if your theme "code blue" looks wrong (e.g. washy), the fix lives in your terminal's ANSI palette, not the theme. The theme's text/muted etc. trust the terminal's ANSI fg for default text, but hljs keywords resolve straight to ANSI blue (34) through the terminal palette.
In short: accent, borders, status, diffs, backgrounds → theme tokens. Code syntax highlighting → fixed hljs ANSI map (change your terminal palette or a custom hljs emitter).
The full scope map is baked into the binary's Var ae={...} with chalk-style ANSI: keyword: ae.blue, built_in: ae.cyan, type: ae.cyan.dim, literal: ae.blue, number: ae.green, string: ae.red, comment: ae.green, doctag: ae.green, meta: ae.grey, tag: ae.grey, name: ae.blue, attr: ae.cyan. These resolve to ANSI index numbers (34 blue, 36 cyan, 32 green, 31 red, 37 grey), so the actual hue is whatever your terminal assigns those index. If you want code text to be #c4808a-style rose, restyle at the terminal.
The 61 documented tokens come from the official docs at https://code.claude.com/docs/en/terminal-config#color-token-reference. The remaining internal tokens were extracted from the canonical preset object inside the Claude Code 2.1.251 binary at ~/.local/share/claude/versions/<version>:
strings -n 4 ~/.local/share/claude/versions/<version> > /tmp/cc-strings.txt
python3 - <<'PY'
import re
raw = open('/tmp/cc-strings.txt', encoding='utf-8', errors='replace').read()
m = re.search(r'var v=\{(.*?)\},Y=\{', raw)
keys = re.findall(r'([A-Za-z_][A-Za-z0-9_]*):"(?:rgb|ansi)', m.group(1))
print(len(keys))
PYThat grabs the first (light) preset object — six preset variables (v, Y, L, G, F, B) all share the same key set; the 72 keys define the complete tunable surface. Any future token Anthropic adds appears in those preset literals first; rerun the count against a newer binary and re-check the token list. The preset objects also expose the non-theme hljs ANSI map (Var ae={...} / Var l=new Map(...)), the thing that colors code blocks — see "What the theme cannot do".
theme.schema.json— JSON Schema for editor validationartificer.json— example custom theme- Official theme docs
- Plugins reference: themes — for shipping themes via plugins