What is this?
4444 color names spread evenly over the OKLab color space, out to the edge of the Rec2020 gamut. Every point above is one named color.
Made with AI. About 1300 of the names (roughly 30%) and all of the short descriptions were written by Claude Fable 5, a language model by Anthropic. The other ~3150 names are human-made. Most come from color-names: some the model picked for a point, the rest were matched from its curated bestOf list. A few dozen are my own suggestions. I wrote the sampling, set the rules the names had to follow, and reviewed the output, replacing names that didn't fit their color. Scripts check the hard constraints, and scripts/audit-provenance.mjs counts which names are invented. Expect the odd name or description that misses.
The project grew out of color-names, my crowd-sourced list of 30 000+ color names. Plotted in a perceptual color space, that list bunches up where people have always looked (reds, skin tones, popular sRGB pastels) and leaves large parts of the gamut nearly empty. This list starts from the other end: pick evenly spaced colors first, then name them.
The points are placed with best-candidate (blue-noise) sampling in OKLab, so neighbors are roughly the same perceptual distance apart everywhere. Sampling is seeded and grows in stable passes, so existing ids and names stay put when the list gets longer.
Each point gets the smallest standard gamut that contains it, and the names get less common the further out the tier is:
| tier | count | meaning | example names |
|---|---|---|---|
srgb | 2041 | shows on any screen | Moss, Denim, Butter, Charcoal |
p3 | 776 | needs a Display P3 screen | Electric Blue, Neon Carrot |
rec2020 | 1627 | outside P3, the outer shell | Smaragdine, Zaffre, Impossible Green |
The model named one point at a time, with its OKLCH coordinates and tier in front of it and color-names as a reference for tone. The later passes skipped the model and pulled names from color-names directly. Every name is unique. About 80 basic names (Red, Blue, Navy, Pink, White, …) are checked to sit on srgb points close to the colors people expect, so you don't need a wide-gamut display to see Pink.
Install
npm install colornames-oklab
The package ships one JSON file plus ESM and CJS entry points, with no dependencies.
Usage
// ESM
import colors from 'colornames-oklab';
// CJS
const colors = require('colornames-oklab');
colors.length; // 4444
colors.find(c => c.name === 'Emerald');
// { name: 'Emerald', tier: 'srgb', hex: '#089156', oklab: [0.577, -0.1257, 0.0551] }
A tiny dependency-free lookup ships with the package. Pass raw OKLab values (converting your colors is up to you) and get the nearest named color back. With unique, every name is used at most once, like color.pizza's noduplicates:
import { closest } from 'colornames-oklab';
closest([0.7, 0.1, 0.1]).name; // → a warm coral
closest([[0.7, 0.1, 0.1], [0.3, 0, 0]]); // one match per query
closest(palette, { unique: true }); // no name twice
For CSS, spell the exact color as oklab(). Every current browser renders it and gamut-maps to whatever the display can show. The hex is the pre-clamped sRGB fallback:
el.style.background = 'oklab(' + c.oklab.join(' ') + ')'; // exact, browser gamut-maps
el.style.background = c.hex; // sRGB fallback (OKLCH-clamped)
| field | what it is |
|---|---|
name | unique color name |
tier | srgb · p3 · rec2020, the smallest gamut containing the color |
hex | sRGB fallback, chroma-clamped in OKLCH (hue & lightness preserved) |
oklab | exact sampled [L, a, b]; OKLCH is hypot(a,b) / atan2(b,a) away |
Support
If you find this project useful, please consider buying me a coffee. It keeps my caffeine levels high enough to distinguish between #fafafa and #fbfbfb.
All 4444 names
The full list, alphabetical (locale-aware, so accented names sort where you'd expect them). Type to filter.