Six hours into a heavy session, my eyes were done before my work was. The theme wasn't the obvious culprit — it looked fine for code. But I was reading paragraphs, not code. Tool output, permission prompts, reasoning traces: the terminal was 80% English prose, rendered at body size, and my theme had been tuned to differentiate Python keywords.
So I built klein-blue around the APCA contrast metric instead, with per-role gates matched to the specific ANSI slots Claude Code populates. Body text needs Lc ≥90. Subtle text ≥75. Accent slots ≥60. Those thresholds are where contrast stops being academic at body size on dark ground and starts being the reason you can read at hour six.
The anchor color is IKB — Yves Klein's International Klein Blue, hex 002FA7. Pure IKB fails APCA at text size on dark backgrounds (Lc -12, effectively invisible), so I split it across two ANSI slots: pure IKB in ansi:blue for decorative borders and highlights where it never carries prose, and a lifted Klein-family value (A8BEF0) in ansi:blueBright for permission-prompt text you actually have to read.
Four variations ship because there's a genuine design fork in the ansi:redBright slot — the slot Claude Code maps to its claude-sand brand color. Each answers that question differently:
- Klein Void Refined — sand neutralized, IKB uncontested
- Klein Void Sand & Sea — sand kept as a second hero alongside IKB
- Klein Void Prot — every accent passes strict APCA gates, no carve-outs; the only variation where the full spec holds
- Klein Void Gallery — one blue, near-black for everything else
All four are macOS Terminal.app .terminal profiles. One prerequisite that will burn you if you miss it: Claude Code's /theme picker must be set to dark-ansi. Any other setting and Claude Code ignores the ANSI profile entirely, rendering its own hardcoded RGB values.
git clone https://github.com/robertnowell/klein-void
bash install.sh
# then in Claude Code: /theme -> dark-ansi
Top comments (0)