colornames-oklab 4444 names, blue-noise sampled in OKLab · 372 kB (93 kB gzipped)

drag to orbit · pinch or double-tap to zoom · hover for names

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:

tiercountmeaningexample names
srgb2041shows on any screenMoss, Denim, Butter, Charcoal
p3776needs a Display P3 screenElectric Blue, Neon Carrot
rec20201627outside P3, the outer shellSmaragdine, 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)
fieldwhat it is
nameunique color name
tiersrgb · p3 · rec2020, the smallest gamut containing the color
hexsRGB fallback, chroma-clamped in OKLCH (hue & lightness preserved)
oklabexact 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.

Ko-fi

All 4444 names

The full list, alphabetical (locale-aware, so accented names sort where you'd expect them). Type to filter.