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.
Contrast checker
Find the nearest passing colour without losing your brand hue.
Pick two colours →
Palette generator
Press space, lock what you like, see what can carry text.
Press the spacebar →
Colour blindness simulator
See which pairs in your palette stop being tellable apart.
Paste your palette →
Image picker
Pull a palette from any photo, and find out if you can set text in it.
Drop an image →
Ramp & token generator
One brand colour to eleven steps, with roles assigned by measurement.
Enter your brand colour →
Tailwind colours
A scale previewed on real components, with every contrast measured.
Set a base colour →
Colour harmonies
Complementary, triadic and analogous sets, each one contrast-audited.
Choose a base colour →
Colour converter
HEX, RGB, HSL, OKLCH and CMYK, with contrast alongside.
Paste any colour →
Colour name finder
Every name for a colour, each with how far it really is.
Enter a colour →
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
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.
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.
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.
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.
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.
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.
You have a specific pair that fails an audit
Contrast checker
It returns the nearest passing colour at your hue rather than just confirming the failure, so the brand survives the fix.
You are starting from one brand colour
Ramp & token generator
Eleven steps with text, border and surface roles assigned by measurement rather than by convention.
You are starting from nothing
Palette generator
Press space, lock what you like. Every set is audited as it is generated, so an unusable palette never survives to the next screen.
You need to know if a palette is distinguishable
Colour blindness simulator
It compares every colour against every other, which is the pairwise check a contrast tool cannot do.
You have a photograph and want its palette
Image picker
Extraction plus the audit, so you find out immediately whether you can set text in what you pulled out.
You need to call a colour something
Colour name finder
Every name comes with its measured distance, so you know whether “royalblue” is your colour or only its neighbour, and a palette exports as named tokens.
How these differ from a contrast checker
| Aspect | dsyn | A typical online checker |
|---|---|---|
| When a pair fails | Returns the nearest passing colour at the same hue | Returns a red cross |
| Contrast model | WCAG 2 and APCA side by side, with the disagreement explained | WCAG 2 only |
| Colour-vision check | Every pair in the palette, foreground against foreground | Foreground against background only, if at all |
| Working space | OKLCH, so equal lightness steps look equal | HSL |
| Where it runs | Your browser — works offline | A server, with the colour in the request |
| Its own interface | Audited by the same engine on every build | Not 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
Reference
Colour library
Every named colour, measured.
4 tools
CSS
Gradients and surfaces as CSS you paste, measured as they will paint.
3 tools
Typography
Pairing, scale, readability and font identification — measured the same way.
3 tools
Branding
Marks, codes and sheets — the things that carry the brand.
6 tools
Writing
Resumes, cover letters, word counts and interface copy, held to the same standard as the pixels.
15 tools
PDF
Merge, split, protect and convert — none of it uploaded.
3 tools
Video & audio
Trim, extract and convert — decoded by your own browser, not a server.
14 tools
Converters
Change a file’s format or size, or a length’s unit, without anything leaving your device.