[Feature Request] Support user-defined custom themes in settings.json
Bug Description
Title: Support user-defined custom themes in settings.json
Body:
Claude Code currently ships 7 built-in themes (dark, light, dark-daltonized, light-daltonized, dark-ansi, light-ansi, auto), but there is no way to define a fully
custom theme.
The dark-ansi / light-ansi themes help by deferring to the terminal's ANSI palette, but they only cover the 16 ANSI slots — Claude Code's UI chrome (diff highlights,
prompt borders, thinking-block tint, tool-call badges, status line, etc.) still uses hardcoded colors that can clash with carefully curated terminal themes.
Request: allow a customTheme object in ~/.claude/settings.json where users can override individual color roles, e.g.:
{
"theme": "custom",
"customTheme": {
"foreground": "#50616D",
"background": "#F2ECDE",
"diffAdded": "#057748",
"diffRemoved": "#960018",
"toolCallBadge": "#801DAE",
"thinkingTint": "#b49b7f"
}
}
Alternatively, a separate theme file (~/.claude/themes/mytheme.json) loaded by name.
Use case: I maintain a curated palette (Chinese traditional color names, derived from 彩.el) in WezTerm, with matched light/dark variants. dark-ansi gets me most of the
way, but several Claude Code surfaces don't pick up the ANSI colors, leaving a visual mismatch. Custom themes would let users align Claude Code with their
terminal/editor ecosystem.
Environment Info
- Platform: darwin
- Terminal: WezTerm
- Version: 2.1.113
- Feedback ID: 87b6c0a0-05f5-4d85-b722-50b9c14f98ef
Errors
[{"error":"Error: NON-FATAL: Lock acquisition failed for /Users/Nasy/.local/share/claude/versions/2.1.113 (expected in multi-process scenarios)\n at sd_ (/$bunfs/root/src/entrypoints/cli.js:2751:2177)\n at WH8 (/$bunfs/root/src/entrypoints/cli.js:2751:1257)\n at processTicksAndRejections (native:7:39)","timestamp":"2026-04-17T21:28:40.157Z"},{"error":"Error: File does not exist. Note: your current working directory is /Users/Nasy/.config/wezterm.\n at call (/$bunfs/root/src/entrypoints/cli.js:4732:7630)\n at processTicksAndRejections (native:7:39)","timestamp":"2026-04-17T22:56:05.059Z"},{"error":"AxiosError: Request failed with status code 404\n at CU (/$bunfs/root/src/entrypoints/cli.js:110:1194)\n at <anonymous> (/$bunfs/root/src/entrypoints/cli.js:115:12744)\n at emit (node:events:92:22)\n at endReadableNT (internal:streams/readable:865:50)\n at processTicksAndRejections (native:7:39)\n at request (/$bunfs/root/src/entrypoints/cli.js:117:2467)\n at processTicksAndRejections (native:7:39)","timestamp":"2026-04-17T22:56:19.092Z"},{"error":"AxiosError: Request failed with status code 404\n at CU (/$bunfs/root/src/entrypoints/cli.js:110:1194)\n at <anonymous> (/$bunfs/root/src/entrypoints/cli.js:115:12744)\n at emit (node:events:92:22)\n at endReadableNT (internal:streams/readable:865:50)\n at processTicksAndRejections (native:7:39)\n at request (/$bunfs/root/src/entrypoints/cli.js:117:2467)\n at processTicksAndRejections (native:7:39)","timestamp":"2026-04-17T22:56:20.875Z"}]This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗