115 laps at Thunderhill
Next case study. A year of my own telemetry, and what I found reviewing my own chart a year later.
Color Safety Lens audits palettes for contrast and color-vision deficiency. The first working version gave confident, authoritative, wrong answers. Off by more than ΔE 14 on some hues, where 1.0 is a visible difference.
Every brand guideline specifies color at full strength. In a dashboard that color spends its life at 60%, 30%, 10%. Fills, ramps, banding, disabled states. The guideline says nothing about those. That is where accessibility quietly breaks.
I was checking tints one at a time on webaim.org, dozens per dashboard, across fifty. Slow, and worse, it was sampling. I only caught the failures I thought to look for.
Tint ramp, audited both ways
Each step checked against a white label and a black one
Live · WCAG 2.1 relative luminance · 4.5:1 threshold for body text
I used the Machado, Oliveira & Fernandes (2009) model, the standard CVD matrices. Read the values in, multiply through the matrix, write them back out. It rendered. It looked plausible. I shipped it.
The matrices operate on linear RGB, light as a physical quantity. Hex values in a design file are gamma-encoded sRGB, pre-distorted for how displays and eyes work. I was running a physics model on perceptual numbers.
The same simulation, computed both ways
Deuteranomaly at full severity
-
-
ΔE 1.0 is the threshold of a just-noticeable difference. Anything above about 2.3 is plainly visible to an ordinary observer.
Live · Machado et al. 2009 matrices · CIEDE2000 difference
Fixing the code took an afternoon: linearize in, apply, re-encode out. Trusting it again took much longer.
Five audits later, it passed clean.
The corrected simulator
Okabe and Ito, the control palette
Live · severity interpolated toward the published severity-1.0 matrices; the production tool uses Machado's full per-severity tables
The tool tests every color pair in a palette at once. Run against the dashboard palette in use at the time, it returned combinations that failed WCAG AA that hand-checking had missed.
Verified tints export as SVG back into Figma and into the design system instead of into a screenshot folder, which moved the audit from a final check into the definition of done. The source is public on GitHub.
Next case study. A year of my own telemetry, and what I found reviewing my own chart a year later.