Skip to main content
Contrastproof

Find and fix every color contrast failure on your website.

Contrastproof renders your page in a real browser, checks every text color against the background behind it, and gives you the exact color to use instead.

Free, no account, under 30 seconds.

contrastproof.com/s/substack.com

substack.com

Scanned 2026-08-27 · https://substack.com/

Color problems
9
Elements affected
255
Needing eyes
24
Dark mode
audited

Problem 1: text #ff6719 on background #ffffff, 2.91 to 1

01/30 elements13px · 400 · needs 4.5:1

On your site now

on2.91:1

Corrected

on4.51:1
What changed
Lightness only. The hue is exactly the one you picked.
Saturation
Down 0.025, the most this hue can hold at the new lightness.
Side by side
A visible change, which is the point.

Problem 2: text #ffffff on background #ff6719, 2.91 to 1

02/17 elements15px · 400 · needs 4.5:1

On your site now

on2.91:1

Corrected

on4.51:1
What changed
Lightness only. The hue is exactly the one you picked.
Saturation
Untouched.
Side by side
A visible change, which is the point.

3 more below, plus the dark-mode pass and the palette

A real scan of substack.com, run by the same engine your website goes through. Nothing here is illustration: this is the report, exactly as it arrives.

The problem

Four rules now demand the same contrast level, and low contrast is the failure the web fails most.

European Accessibility Act

European Union
Applies from
28 June 2025
If you fail
Penalties reach six figures.

ADA Title III

United States
Applies from
Today
If you fail
Lawsuits. $4,000 per violation in California.

ADA Title II

United States
Applies from
26 April 2027
If you fail
DOJ complaints and private lawsuits.

Section 508

United States
Applies from
Today
If you fail
Excluded from the contract.

All four ask for WCAG level AA, which is 4.5:1 on normal text.

Nobody catches these by looking.

92 pieces of text on substack.com sit at 4.48:1 against a requirement of 4.5. They miss by 0.02. No eye finds that, and no free checker tells you the gray that fixes it is #777677.

Problem 1: text #777777 on background #ffffff, 4.48 to 1

01/92 elements15px · 400 · needs 4.5:1

On your site now

on4.48:1

Corrected

on4.52:1
What changed
Lightness only. The hue is exactly the one you picked.
Saturation
Untouched.
Side by side
Too close to tell apart.

Problem 2: text #b9cfca on background #afd4cb, 1.02 to 1

02/1 element13px · 400 · needs 4.5:1

On your site now

on1.02:1

Corrected

on4.50:1
What changed
Lightness only. The hue is exactly the one you picked.
Saturation
Untouched.
Side by side
A visible change, which is the point.

Problem 3: text #0083d5 on background #ffffff, 4.03 to 1

03/5 elements15px · 400 · needs 4.5:1

On your site now

on4.03:1

Corrected

on4.55:1
What changed
Lightness only. The hue is exactly the one you picked.
Saturation
Down 0.007, the most this hue can hold at the new lightness.
Side by side
Too close to tell apart.

Every color that painted on the page

Ordered by how much of the page each covers, measured against the dominant surface. Surfaces are not held to a text ratio, so they are not marked against one.

  • #7777771.00
  • #777777surface
  • #ffffffsurface
  • #3637372.67
  • #eeeeeesurface
  • #ffffff4.48
  • #ff67191.54
  • #ff6719surface
  • #232525surface
  • #0000004.69
  • #c8c8c8surface
  • #000000surface

Three things a color picker cannot do.

1Render

The color that matters is the one that composited on screen, after the cascade, after JavaScript, after the semi-transparent panel. We load your page in Chromium and scroll it so lazy sections paint before we measure.

2Group

A scan of substack.com finds 145 failing elements, which sounds like weeks of work. They are not 145 problems. They are 5 colors used over and over: one caption gray, one link blue, one button fill. Fix a color once and every element wearing it is fixed too.

3Repair

We take the color you already chose and move it lighter or darker until it passes, holding your hue exactly, so the fix still reads as the same color rather than a new one. It is arithmetic, not a language model, so it is instant and it is the same answer every time.

Free to scan. $20 for the rest.

One payment, for a file you keep. Not a subscription, and not a widget that sits on your website.

Every scan

Free
  • Every text color and background on your page
  • What fails, and how many elements it hits
  • Your 2 worst problems, in each theme
  • Light and dark, measured separately

Then, if you want it

$20 once
  • Every remaining problem, not just the worst two
  • The elements and selectors behind each one
  • A CSS file you can paste straight in
  • A link that stays live, to send to a client

Fixing sites for clients

$79 once
  • Five different sites, not five pages
  • The same full report on every one
  • A code you paste, still no account
  • No expiry, use them whenever
  • No account
  • No subscription
  • No card kept
  • Refunded if a fix does not pass

You see your results before you decide, and payment happens on your report rather than here.

Free, no account, under 30 seconds.

Three ways to deal with this.

A free checker ends at the number. A widget leaves your colors alone and adjusts the page for visitors instead. We give you the values and get out of the way.

What it costs
Free checkers
Free
Contrastproof
$20 once
Overlay widgets
From $490 a year
Tells you what fails
Free checkers
Yes
Contrastproof
Yes
Overlay widgets
Yes
Tells you the color to use instead
Free checkers
No
Contrastproof
Yes, holding your hue
Overlay widgets
No
Changes your website
Free checkers
No
Contrastproof
Only if you paste the file
Overlay widgets
Adds a script that adjusts the page for visitors
Fixes the source
Free checkers
No
Contrastproof
Yes, you own the values
Overlay widgets
No, the original colors stay
Bills you again
Free checkers
No
Contrastproof
No
Overlay widgets
Yes, every year
Needs an account
Free checkers
Usually not
Contrastproof
No
Overlay widgets
Yes

Entry prices as published by each company in August 2026: accessiBe and UserWay both start at $490 a year, and AudioEye quotes on request. Overlay widgets do more than contrast, and this product does only contrast. The row that matters is the third one.

This site passes its own scan.

We point Contrastproof at itself and hold this site to the same numbers your report is made of.

Ink15.82:1
Body11.23:1
Muted5.25:1
Violet4.99:1

The palette is generated

Every color on this page came out of the same repair function the scanner runs on yours. None of them was picked by eye.

ok   body on canvas 11.23
ok   muted on sand   4.92
FAIL violet on elev   2.61
1 PALETTE FAILURE

Every color, in both themes

The scan reads this whole site the way it reads yours, light mode and dark. A color that passes on white can fail on a dark background, so both are measured and both arrive in your report.

Caption gray
Before: 3.90
After: 5.18
Button edge
Before: 2.61
After: 3.25
Badge tint
Before: 4.50
After: 4.70

It has caught us three times

The muted gray we set body captions in. A button edge on dark cards that left the control with no visible boundary. A badge sitting on exactly 4.50:1, which fails by a hair. None of the three was visible to us by eye.

Read the method