After a few weeks of heavy Claude Code use I noticed I was squinting at tool output and permission prompts more than I was reading them. The theme I had — a fine theme for Python files — was tuned for syntax token differentiation: bright keyword colors, muted comments, high-contrast strings. None of that maps to what Claude Code actually puts on screen, which is body-size English prose: reasoning paragraphs, tool result blocks, permission prompts asking whether I want to run a shell command.
So I built klein-blue: four Terminal.app themes tuned specifically for Claude Code's prose output rather than code scanning.
The central design constraint came from APCA (Accessible Perceptual Contrast Algorithm), which scores contrast differently for body text than for large UI elements. I set per-role gates: body text at Lc ≥ 90, subtle text ≥ 75, muted ≥ 45, accents ≥ 60. The fourth variation (Klein Void Prot) is the only one where every accent slot clears those gates strictly — the others make deliberate trade-offs toward aesthetics.
The anchor color is Yves Klein's IKB. This is where the practical problem got interesting: pure IKB (hex 002FA7) fails APCA contrast as text on dark ground at Lc -12, effectively invisible. Putting it in ansi:blueBright — where Claude Code routes permission-prompt text — would make those prompts unreadable. The fix was splitting IKB across two ANSI slots: pure IKB in ansi:blue for decorative borders and highlights where legibility isn't load-bearing, and a lifted Klein-family blue (A8BEF0) in ansi:blueBright for permission-prompt text that actually needs to be read.
One thing that bit me during setup: Claude Code has to be set to dark-ansi via its /theme picker. If it's on any other setting it ignores the Terminal.app ANSI palette entirely and falls back to its hardcoded RGB values — the theme does nothing.
The four variations (Refined, Sand & Sea, Prot, Gallery) differ mainly in how aggressively they neutralize the ansi:redBright slot, which Claude Code uses for its claude-sand brand color. Neutralize it and you get a single-blue void. Accept it and you get Klein blue competing with Claude's warm sand as a two-hero palette.
Ships as .terminal profile files with an install.sh and a restore.sh for rollback. CommitMono-Regular for Refined and Prot, IBM Plex Mono for the others — both install to ~/Library/Fonts/.
Top comments (0)