Colour

Check it, fix it, extract it, turn it into a system.

All 9 colour tools

Every one runs in your browser. Nothing is uploaded and nothing is metered.

Your brand colour, set as body text.

This is 16px regular — the size most interface copy actually ships at. If reading it feels like effort, that is the measurement talking.

Contrast

2.83:1

WCAG AA

Fail

Nearest passing colour

Try

What colour tools are

Browser-based utilities that measure the relationship between two or more colours — contrast ratio, perceived lightness, colour-vision behaviour — and produce palettes, ramps and tokens from them. The useful ones compute those relationships from the colour you supply rather than matching it against a fixed list of approved pairs.

Nine tools that share one engine, so a colour you fix in the contrast checker is a colour the palette generator, the ramp builder, the colour-blindness simulator and the name finder already understand.

The difference from every other colour tool is that these tell you what to change. Anything can report that a pair fails; finding the nearest passing colour that holds your brand hue is the part that takes measurement.

Measured, not eyeballed

Every number on these pages is computed in your browser from the colour you gave it — WCAG 2 ratios, APCA lightness contrast, CIEDE2000 difference, and the Machado model for colour-vision deficiency. Nothing is looked up from a table of pre-approved pairs.

The site audits its own interface with the same engine on every build. The tool cards you are about to click were each assigned their colour by stepping lightness at fixed chroma until the result cleared 4.5:1 against its own tint, in both themes. A colour tool whose own interface quietly failed its checker would be the most embarrassing defect available.

What makes these colour tools different

  • A failure comes back with its fix attached

    Contrast is driven almost entirely by lightness; hue and saturation barely move it. That is what makes a failing brand colour solvable — the search runs along the lightness axis at fixed hue and chroma, so what comes back is still recognisably your colour. Candidates are ranked by CIEDE2000, smallest visible change first.

    #4a9fe8 measures 2.83:1 on white. Holding hue 247° and its chroma and moving OKLCH lightness from 0.682 to 0.567 gives #207bc1 at 4.50:1.

  • Two contrast models, with the disagreement explained

    WCAG 2 compares two colours and nothing else, so a 12px hairline caption and a 32px bold heading in the same pair score identically. APCA weighs size and weight. Both are shown, because conformance is still measured against WCAG 2 and APCA is the better predictor of whether anyone can read the thing.

    WCAG 2 returns a ratio from 1:1 to 21:1. APCA scores on a signed scale from about −108 to +106 Lc and takes font size and weight as inputs; at 14px regular it cannot pass at any contrast, not even black on white.

  • Colours checked against each other, not only against a ground

    A contrast checker asks whether a foreground separates from a background. It never asks whether two foregrounds separate from each other, and that is the failure that takes out status colours, chart series and category keys.

    Bootstrap’s danger red and success green sit about 74 apart in perceptual distance for typical vision and about 4 under deuteranopia. Tailwind’s red-500 and green-500 fall from 76 to about 8.

  • OKLCH as the working space

    Ramps, harmonies and lightness searches all run in OKLCH, where equal steps in lightness look equal. HSL lightness is a transform of RGB with no model of vision in it, which is why an evenly stepped HSL ramp does not look evenly stepped.

    At an HSL lightness of 50%, yellow has a relative luminance of 0.928 and blue 0.072 — a factor of nearly 13 at the same nominal lightness.

How to do it

The order that works, and why each step changes the answer.

  1. Start from the colour you are not allowed to change

    Almost every real colour problem begins with one fixed value — a logo colour, a client’s hex code, an existing token. Put that in first. Generating a set and then discovering the brand colour does not fit it is the long way round.

  2. Build the ramp in OKLCH

    Eleven steps from 50 to 950, lightness stepped evenly and chroma tapered at both ends. Do not build it by mixing toward white and black in HSL: the steps come out uneven and the hue drifts.

  3. Assign roles by measurement

    Decide which step is text, which is border and which is surface by reading the contrast figures rather than by eye. A vivid brand colour is made to be seen at size on a logo; as 16px body copy it usually misses 4.5:1, and the step two or three darker still reads as the brand.

  4. Check the palette against itself

    Run every colour against every other under simulated colour-vision deficiency. This is the check a contrast tool structurally cannot perform, and it is where red-and-green status pairs come apart.

  5. Fix by lightness, then measure again

    Move a failing colour along its own lightness axis instead of choosing a new one, and re-check on the other ground too — a colour that carries text on white often fails on black, and the reverse.

Worked examples

Real inputs, real numbers. Pick one.

A brand blue that fails as body text

You give it

#4a9fe8 set as 16px regular text on #ffffff.

You get

2.83:1, against a 4.5:1 AA threshold. Holding hue and chroma and moving OKLCH lightness from 0.682 to 0.567 produces #207bc1 at 4.50:1 — the same blue, two steps down.

A five-colour palette audited against white

You give it

The palette generator’s default set: #0f172a, #1e5aa8, #3ba0c9, #e8b04b, #f4f1ea.

You get

17.85:1, 6.81:1, 2.98:1, 1.95:1 and 1.13:1. Two of the five can carry body text. The amber reaches 4.51:1 at #a16c00, its lightness moving 0.791 to 0.572 with the hue held.

A status pair that passes contrast and still fails

You give it

Bootstrap’s #dc3545 and #198754, both as text on white.

You get

Both measure 4.53:1 and clear AA. Against each other they are about 74 apart for typical vision and about 4 under deuteranopia, so for roughly 5% of men the error state and the success state are the same colour.

Which colour tool do you need?

Start from the job, not the tool name.

How these differ from a contrast checker

AspectdsynA typical online checker
When a pair failsReturns the nearest passing colour at the same hueReturns a red cross
Contrast modelWCAG 2 and APCA side by side, with the disagreement explainedWCAG 2 only
Colour-vision checkEvery pair in the palette, foreground against foregroundForeground against background only, if at all
Working spaceOKLCH, so equal lightness steps look equalHSL
Where it runsYour browser — works offlineA server, with the colour in the request
Its own interfaceAudited by the same engine on every buildNot checked

The figures behind that

  • APCA scores on a signed scale from about −108 to +106 Lc, and accounts for font size and weight; WCAG 2 returns a ratio from 1:1 to 21:1 and does not.

  • At the same HSL lightness of 50%, yellow has a relative luminance of 0.928 and blue 0.072 — a factor of nearly 13, which is why HSL is the wrong space for building a ramp.

  • Bootstrap’s danger and success colours both measure 4.53:1 on white, and their perceptual distance falls from about 74 to about 4 under deuteranopia.

  • Each of this site’s tool cards was assigned its colour by stepping lightness at fixed chroma until the result cleared 4.5:1 against its own tint, in both themes.

Keep exploring