Open collection of color spaces.
- Formulas tested against cited sources
- Conventional ranges
- JS with TypeScript types / WASM / GLSL / LUT / ICC / OCIO
import space from 'color-space';
space.rgb.oklch(255, 128, 0); // → [0.732, 0.186, 53] — modern CSS
space.slog3.rec2020(0.5, 0.5, 0.5); // camera log → UHD wide gamut
space.rgb.xyz(300, -10, 0); // → [59.7, 30.6, 2.8] — out-of-range in, unclamped out
// batch
space.rgb.oklch([255, 128, 0, 0, 255, 128]); // [0.732, 0.186, 53, 0.875, 0.234, 151]
// meta
space.lab.range; // [[0, 100], [-125, 125], [-125, 125]]Individual spaces:
import oklch from 'color-space/oklch.js';
oklch.rgb(0.65, 0.25, 180); // matches CSS oklch(0.65 0.25 180)color-space– All 221 interconnected spaces · 70 kB gzipcolor-space/<name>.js– One standalone spacecolor-space/lite– 54-space working set · 29 kB gzipcolor-space/wasm– lite set as WASM · bare.wasmincludedcolor-space/gl– GLSL/WGSL shader sourcecolor-space/gl/hlsl·color-space/gl/msl– HLSL (DirectX, Unity, Unreal) and Metal, written by naga from the WGSL ·await hlsl('rgb', 'oklch')· needs the optional peernaga-wasm(it declares Node ≥ 24.12; CI runs it on 22, where npm only warns)color-space/lut–.cubeLUTs for Resolve, Premiere, OBS, ffmpeg — verified vs ACEScolor-space/icc– Matrix + TRC or CLUT profilescolor-space/ocio– OpenColorIO colorspaces for Blender, Nuke, Resolve, Houdini:colorspace(space.sgamut3cine), curve and matrix from native transforms, 55 spaces, each checked against the library to 1e-6color-space/util–parse·formatCSS colors,mix,gamut,visible,deltaE,contrast(WCAG),cvd(color-vision simulation) ·deltaE('rgb', [255, 0, 0], [250, 0, 0])color-space/data.json– Channels, ranges, provenance, references, graph, gamutscolor-space/conformance.json– Cited reference conversions, each with its source, to test any color library againstnpx color-space rgb oklch 255 128 0– CLI, no install:convert(default) ·cube·icc·space·spaces·mcp(MCP server for agents)
MCP tools – convert · gamut · css · space · spaces · cube · shader · icc · code – so agents call verified math instead of guessing it. A color goes in as any CSS string ('#ff8000', 'oklch(0.7 0.1 50)', 'rebeccapurple') or as channel values; shader writes the conversion as GLSL, WGSL, HLSL or MSL, code gives the JS call and its verified colour-science equivalent.
claude mcp add color-space -- npx -y color-space mcp # Claude Code
code --add-mcp '{"name":"color-space","command":"npx","args":["-y","color-space","mcp"]}' # VS CodeClaude Desktop claude_desktop_config.json, any project .mcp.json:
{ "mcpServers": { "color-space": { "command": "npx", "args": ["-y", "color-space", "mcp"] } } }Claude Code plugin (the server plus a skill): /plugin marketplace add colorjs/color-space, then /plugin install color-space@color-space. Docker: docker build -t color-space-mcp . and run it with docker run -i --rm color-space-mcp.
Over HTTP (Streamable HTTP, stateless): npx -y color-space mcp --http 8787 on localhost, or host fetch from color-space/mcp.js in a Worker, Deno or Bun. Skill for agents that load skills: plugins/claude/skills/color-space.
A complete collection of color spaces: one minimal API, formulas tested against their sources. While alternatives focus on digital color spaces, this project takes broader perspective, covering historical and cross-disciplinary spaces as well. Side effects: errata in papers, color education, test cases for JS→WASM compilers (porffor, jz).
It is not a color toolbox — gamut mapping, palettes, alpha stay out; the few tools the atlas itself uses (parsing, mixing, ΔE, contrast, color-vision simulation) are color-space/util. Pantone, NCS, RAL Classic, and similar licensed swatch catalogs aren't open and stay out as well.
A wrong value or a missing space: open an issue with the document that defines it. How a space is added and checked: CONTRIBUTING.md.
Thanks to the researchers, theorists, specifiers, implementors and the libraries that helped this one happen.
| Library | Spaces | Ranges | Camera log · CAM · historic | Backends |
|---|---|---|---|---|
| color-space | 221 | Conventional | ✅ | JS · WASM · GLSL/WGSL · LUT · ICC |
| color-space/lite | 54 | Conventional | logs · HDR · CAM16 | JS · 29 kB gzip |
| color-space/wasm | 54 | Conventional | logs · HDR · CAM16 | WASM |
| culori | 30 | 0–1 | ❌ | JS |
| colorjs.io | 51 | 0–1 | some | JS |
| texel/color | ~16 | 0–1 | ❌ | JS |
| chroma-js | 11 | mixed | ❌ | JS |
| d3-color | 6 | mixed | ❌ | JS |