After a few weeks of heavy Claude Code sessions, I noticed the thing that was actually tiring wasn't the work — it was reading. Tool output, permission prompts, reasoning traces, explanations. Paragraphs. Most of my screen at any given moment is English prose at body size, not syntax-highlighted Python. Every terminal theme I tried was optimizing for the wrong workload.
So I built klein-blue: four Terminal.app themes tuned specifically for prose legibility in Claude Code, anchored to Yves Klein's IKB pigment.
The core design problem: pure IKB fails as readable text on dark ground. APCA scores it Lc -12 — effectively invisible. The fix was to split it across two ANSI slots. The plain blue slot gets pure IKB for decorative borders and highlights where legibility doesn't matter. The bright blue slot gets a lifted Klein-family blue (hex A8BEF0) for permission-prompt text that actually needs to be read. You keep the pigment; you don't go blind.
Contrast is enforced per semantic role using the APCA Lc metric, not WCAG ratios. WCAG was designed for static web content at display sizes; APCA is perceptually uniform and handles body text on dark backgrounds more honestly. The gates: body >= 90, subtle >= 75, muted >= 45, accent >= 60. The third variation, Klein Void Prot, is the only one where every accent slot clears strict gates — the others make deliberate tradeoffs for visual character.
The fourth slot Claude Code uses heavily is ansi:redBright — its claude-sand brand color. That slot became the differentiating axis between variations: neutralize it to let IKB dominate, or accept it as a second hero. Klein Void Sand & Sea takes the two-hero approach; Klein Void Gallery maximizes the void.
# Install
git clone https://github.com/robertnowell/klein-blue
cd klein-blue && ./install.sh
# Then in Claude Code: /theme -> dark-ansi
# (without dark-ansi, Claude Code ignores the ANSI palette entirely)
Built for macOS Terminal.app; ships as .terminal profile files with CommitMono and IBM Plex Mono depending on variation. Full rollback via restore.sh.
Top comments (0)