I reached for WCAG contrast first. Checked IKB against my dark background, got a ratio above 3:1, and assumed it was usable. Then I actually rendered it: the blue was effectively invisible. WCAG's formula treats dark-on-dark the same as light-on-light at the same numerical ratio — it doesn't. APCA does.
APCA produces a signed lightness contrast (Lc). Positive values are light-on-dark; negative are dark-on-light. Pure IKB (hex 002FA7) on a near-black ground scores Lc -12. That's not a low-contrast blue. That's a blue that doesn't exist at reading size.
This distinction matters specifically for Claude Code because the tool uses ANSI slots for semantic roles — permission prompts in one slot, tool output in another, reasoning in a third. If you're calibrating a theme by WCAG, you'll pass a blue that reads as void.
The fix I landed on: split IKB across two slots. Pure 002FA7 goes into ansi:blue, which Claude Code only uses for decorative borders and structural chrome — things you register peripherally, not things you read. The readable slot, ansi:blueBright, gets A8BEF0: still in Klein's family, still cold and high-saturation, but lifted enough to clear the Lc 75 gate I set for "subtle" text.
The four variations ship with different per-role gate strictness. Klein Void Prot is the one where every single accent passes strict APCA gates — body text at Lc ≥90, subtle at Lc ≥75, muted at Lc ≥45, decorative accents at Lc ≥60. The other three trade some gate rigidity for aesthetic choices (accepting claude-sand as a second hero color, maximizing void, etc.).
One practical detail: none of this matters if you haven't set Claude Code's /theme picker to dark-ansi. If you leave it on the default, Claude Code ignores your Terminal.app ANSI profile and uses its own hardcoded RGB palette. The theme does nothing.
Installs via install.sh, fully rollback-able via restore.sh. macOS Terminal.app only.
Top comments (0)