Build a palette and learn why it works, in the colour spaces vision science actually uses. Everything is computed in OKLCh — so "the same lightness" really is the same lightness — and the tool shows you what HSL was getting wrong by generating the same scheme both ways side by side. Orbit the sRGB gamut as a true 3D solid and morph it between OKLab, CIELAB, HSL and the raw RGB cube: HSL is a perfect cylinder, the real thing is a lopsided lump, and the lump is why there is no such colour as a pale vivid blue. Ask for the opposite of a colour and get all four honest answers — additive, afterimage, perceptually even, and Itten's artist's wheel — with the basis of each named, because that argument is really about which system you are standing in. Then audit the palette: WCAG 2.1 and APCA contrast side by side with the disagreements called out, colourblind simulation as the cone-loss projection it actually is, and a photocopy test for members that differ by hue alone. Every colour gets a plain-English ISCC-NBS name, which is how you find out that brown is dark orange and olive is dark yellow. Runs entirely in your browser.
The palette
dark greyish blue
L 28 · C 0.047 · h 259°
NBS 183: Dark Blue, navy blueΔE 6.0
strong reddish orange
L 57 · C 0.153 · h 37°
NBS 35: Strong Reddish OrangeΔE 6.9
very light yellow
L 83 · C 0.145 · h 93°
NBS 82: Vivid YellowΔE 4.6
very pale blue
L 91 · C 0.017 · h 251°
NBS 189: Bluish WhiteΔE 4.5
greyish bluish green
L 44 · C 0.056 · h 173°
NBS 146: Dark GreenΔE 5.6
Generate a scheme
Hues that measure the SAME lightness, so hue alone distinguishes them. Impossible in HSL; routine in OKLCh.
Palettes built from a constraint, not a wheel
Three generators that solve for a property instead of stepping round a circle. These are what you want when the palette has a job to do.
Maximally distinct — for a legend or a key
Chosen to maximise the SMALLEST CIEDE2000 between any two members, because a legend fails on one confusable pair, not on an average. Deterministic.
Sequential ramp — for a quantity
Monotonic in lightness, interpolated in OKLab. A ramp whose lightness wobbles reads as banded no matter how good its hues are.
Diverging ramp — for a deviation from a middle
Two arms forced to mirrored lightness profiles, meeting at a light pivot, so neither side reads as systematically heavier than the other.
Pull a palette out of a photograph
Clustering happens in OKLab, where distance is roughly perceived difference. Almost every “get the colours from this image” feature clusters in RGB instead, which splits the greens (where RGB has room the eye does not) and merges the darks (where the eye discriminates and RGB does not). Both results are shown so you can see it on your own picture.
What the export writes
:root {
--dyer-1: #1b2a41;
--dyer-1-oklch: oklch(28.35% 0.0473 258.70);
--dyer-2: #c1502e;
--dyer-2-oklch: oklch(57.34% 0.1532 37.15);
--dyer-3: #e8c547;
--dyer-3-oklch: oklch(83.16% 0.1453 93.21);
--dyer-4: #dbe4ee;
--dyer-4-oklch: oklch(91.50% 0.0167 250.85);
--dyer-5: #2f5d50;
--dyer-5-oklch: oklch(44.13% 0.0556 173.19);
}The CSS export writes each colour twice — the hex as a universal fallback and an oklch() line beside it. Authoring in oklch() is what lets you later change a whole palette’s lightness without its hues shifting. Take it from Export at the top of the page.
Sources & methods
Colour spaces. OKLab and OKLCh are Björn Ottosson’s (2020), used with his published matrices — including the concatenated linear-sRGB↔LMS pair, so that sRGB white lands exactly on L 1 and neutrals get no spurious hue. CIELAB follows CIE 15:2004 with the exact rational ε and κ. The D65 white point is derived from the sRGB primaries rather than typed in, because the rounded textbook value disagrees with them enough to give every grey a faint blue cast.
Colour difference. CIEDE2000 per CIE 142:2001, checked in the test suite against the reference pairs published by Sharma, Wu & Dalal (2005). Also reported: CIE76 (kept to show where it disagrees), Euclidean OKLab, and HyAB (Abasi, Amani Tehran & Fairchild 2020), which is the better predictor for the large differences a palette actually deals in.
Gamut. Mapping is the CSS Color 4 §13.2 algorithm — hold lightness and hue, reduce chroma to the boundary, accept a clip only under a just-noticeable difference. Chroma given up and any residual hue drift are reported rather than hidden. Display-P3 uses the SMPTE RP 431-2 primaries at D65.
Contrast. Two metrics, never averaged. The WCAG 2.x ratio is what is legally enforceable (ADA, EAA and Section 508 all point at WCAG 2.0/2.1 AA). APCA (Andrew Somers / Myndex), reported as Lc using the published 0.1.9 constants, models perception better — it is asymmetric and size-aware — but it was removed from the WCAG 3 working draft in July 2023 for lack of working-group consensus, and WCAG 3 is not expected to be a Recommendation before 2028. So: satisfy WCAG for compliance, trust APCA for the reading experience, and read the disagreements the audit lists.
Colour vision deficiency. Dichromacy is simulated as a projection in LMS cone space (Brettel, Viénot & Mollon 1997; Viénot, Brettel & Mollon 1999) via the Hunt-Pointer-Estévez transform. The projection is solved from its anchors — the white point plus the preserved hue axis — so the test suite can check it against invariants (idempotence, neutrals fixed, anchor hue preserved) instead of trusting transcribed matrices. Severities below 100% interpolate toward the projection to stand in for anomalous trichromacy; that interpolation is a convenience, not a physiological model — Machado, Oliveira & Fernandes (2009) do it properly by shifting the cone fundamental.
Naming — two namers, deliberately. The structural name (“dark greyish yellowish brown”) comes from our own OKLCh calibration of the ISCC-NBS vocabulary — it exists to teach why a name is what it is (brown is dark orange, olive is dark yellow). Beside it, each swatch now shows the nearest of the real 267 ISCC-NBS centroid colours — Kelly (1958)’s central colour for each name block, the swatches NBS printed as the 1965 Centroid Color Charts — via David Mundie’s CC0 transcription of the NBS centroid dictionary, with the CIEDE2000 distance printed beside the name. Read that ΔE: under ~3 the name is essentially exact; past ~10 the colour sits between blocks and the name is a rough address. One caveat remains: block membership is decided by irregular boundaries in Munsell space, so the nearest centroid is not always the containing block — near a boundary, the certified designation can differ.
Other models. The Helmholtz-Kohlrausch predictor is Fairchild & Pirrotta (1991). Unique hue loci are central estimates from the unique-hue literature and carry large observer variation — particularly unique green, which scatters by tens of degrees between individuals. Itten’s twelve-hue wheel is reproduced from its standard published rendering; treat those hexes as the wheel’s own definition, not as measurements.
What this tool does not do. No spectral or pigment physics — there is no Kubelka-Munk model here, so Dyer cannot tell you what happens when you mix two real paints, and it cannot predict metamerism (two colours that match under one light and not another). No ICC profiles or device calibration: “sRGB” here means the standard, not your particular screen. Every appearance judgement assumes an ordinary bright viewing condition and a normal adaptation state.
Where the teaching comes from. Dyer’s pedagogy follows the work of colour educator Peter T. Donahue (@color.nerd) — specifically: that the RYB wheel is perceptually distorted and its complements are a 19th-century inheritance rather than a fact; that colour is an asymmetrical 3D solid in which each hue peaks at its own lightness; that chroma, saturation and gamut headroom are three different numbers a single slider cannot express; the split-primary system and the third-primary law behind clean and muddy mixes; the black fallacy and the shadow path that replaces it; earth pigments as low-chroma primary-dominant mixtures; harmony as a hierarchy of value and chroma rather than a shape on a wheel; and ISCC-NBS plain-English naming as the way in. The implementations here are ours and rest on the primary sources listed above — the errors are ours too.
His own tools are worth your time, and they are not these. Go and use them: the Digital Color Fidget (the character-first harmony tool and palette builder whose rotatable gamut masks our mask panel is an answer to), Gamut to Palette, his Centroid Picker for exploring the ISCC-NBS system properly, and his OSA-UCS Explorer — all at petertdonahue.com. Dyer now carries the 267 real centroids as a nearest-name lookup and plots OSA-UCS as one body in the morph — but his Centroid Picker and OSA-UCS Explorer are built for wandering those systems, block by block and lattice by lattice, which a lookup and a silhouette are not. Different instruments; use both.