[Feature Request] Support user-defined custom themes in settings.json

Resolved 💬 3 comments Opened Apr 20, 2026 by nasyxx Closed Apr 23, 2026

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"}]

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗