Spent three hours one afternoon squinting at Claude Code permission prompts — the blue text that tells you what the tool wants to do next. The color looked right. The hex was right. WCAG 4.5:1 passed. The text was still almost unreadable.
The problem is WCAG's contrast formula treats dark-on-light and light-on-dark symmetrically. APCA doesn't. On a dark ground, the same pigment that reads fine as a background accent becomes invisible as text — pure IKB (hex 002FA7) scores Lc -12 under APCA, which is functionally nothing. WCAG's ratio for the same pairing would pass at certain font sizes.
For klein-blue I set per-role Lc gates rather than a single threshold: body text at Lc ≥ 90, subtle labels at ≥ 75, muted/secondary at ≥ 45, accent spans at ≥ 60. Those aren't arbitrary — they map to the specific ANSI slots Claude Code uses for tool output, reasoning blocks, and permission prompts. Claude Code is mostly prose at body size. Most of your screen is ansi:white and ansi:brightWhite, not syntax tokens.
The IKB split came out of that constraint directly. I wanted the actual Klein pigment in the theme — that's the whole point — but pure IKB can't carry readable text on dark ground. So it lives in ansi:blue (decorative: borders, highlights, UI chrome) and a lifted Klein-family value, A8BEF0, goes in ansi:blueBright where permission-prompt text renders. You see IKB. You can also read the text next to it.
Klein Void Prot (V3) is the only variation where every accent slot clears its gate under strict APCA verification. The other three variations (Refined, Sand & Sea, Gallery) make deliberate tradeoffs — Sand & Sea, for instance, accepts Claude's brand red-orange in ansi:redBright as a second hero color instead of neutralizing it, which means that slot fails the accent gate by design. The Lc numbers are in the README for every slot in every variation.
One install note that bit me: Claude Code ignores ANSI theme files entirely unless you set /theme to dark-ansi inside the app. It falls back to a hardcoded RGB palette otherwise. The .terminal profiles do nothing until that's set.
# install fonts and profiles, back up your current Terminal.app theme
git clone https://github.com/robertnowell/klein-blue
cd klein-blue && bash install.sh
# then in Claude Code: /theme → dark-ansi
Top comments (0)