Design tokens as a service

One seed color in.
A whole design system out.
Guaranteed accessible.

Palette Studio turns a single color — or the word “ocean” — into complete light and dark token systems. Every semantic pair is verified against WCAG before it is returned, so what the API hands your agent is safe to ship.

OKLCH color science WCAG 2.1 + APCA 7 output formats
terminal
# One request. A production-ready system.
curl "$API/v1/tokens?seed=ocean&contrast=AAA"

{
  "meta": { "contrastTarget": "AAA" },
  "themes": {
    "light": {
      "brand": {
        "solid":   "#0B4A7A",
        "onSolid": "#FFFFFF"
      }
    }
  },
  "audit": {
    "light": { "passing": 21, "total": 21 }
  }
}
21/21
Pairs verified per theme
66
Colors per system
211
Passing engine + API tests
0
Runtime dependencies
Playground

Generate a system, then watch it run a real interface

This runs the exact engine the API runs, in your browser. The interface below is not a picture — it is live markup rendered with the generated tokens.

LIVE INTERFACE — rendered with the generated tokens

Overview

Revenue
$48,290
▲ 12.4% vs last month
Open invoices
37
▼ 3.1% vs last month
Collection rate
92%
InvoiceClientAmountStatus
INV-2041Meridian Labs$12,400Paid
INV-2040Ashford & Co$3,180Pending
INV-2039Volta Systems$8,750Overdue
INV-2038Kestrel Group$1,920Draft
ℹ Every color in this interface was solved to meet the selected contrast target — including the button hover and active states.

CONTRAST AUDIT

—
PairColors WCAG APCA Lc Result
How it works

Color science, not color guessing

Three problems separate a real token system from five hex codes in a row.

sRGB gamut slice at the current brand hue

Every step lands inside the gamut

The shaded region is the maximum chroma sRGB can actually display at each lightness for this hue. Ask for more saturation than that and a naive generator silently clips, which is how palettes end up with two steps that render identically.

  • Gamut boundary — computed per hue, not assumed.
  • Scale steps — chroma reduced to fit, hue and lightness held.
  • Lightness targets — evenly spaced perceptually, not numerically.
1 — Perceptual uniformity

HSL says 50% lightness for both yellow and blue, then renders one twice as bright as the other. Everything here happens in OKLCH, where equal steps look equal.

2 — Gamut safety

Out-of-range colors are resolved by reducing chroma while lightness and hue hold — the strategy CSS Color 4 specifies — instead of clipping channels and shifting the hue.

3 — Enforced contrast

Most tools report that a pair failed. This one moves the color until it passes, including mid-tone button fills where neither white nor black text reaches 4.5:1.

API reference

Built for agents first

An OpenAPI 3.1 spec and a plugin manifest ship at the root, so agent frameworks can register these endpoints as tools without anyone writing a wrapper.

Live. The API is deployed and serving from the URL below — every example on this page calls it. Anonymous access needs no key. To run your own copy instead, the Worker source is in api/; npx wrangler deploy puts it on your own Cloudflare account, then paste that URL here and the examples update.
GET /v1/tokens Generate a full token system
ParameterTypeDefaultDescription
seedstringrandomHex color, keyword such as ocean, or a hue number.
contrastenumAAAA targets 4.5:1, AAA targets 7:1.
modesstringlight,darkWhich themes to return.
formatenumjsonjson, css, scss, tailwind, style-dictionary, swift, android.
neutralTintnumber0.012Chroma bled into the neutral ramp so greys belong to the brand.
hueTorsionnumber4Degrees of hue drift across the ramp, as hand-built scales do.
POST/v1/tokensSame, with a JSON body
GET/v1/scaleOne 11-step perceptual scale
GET/v1/contrastWCAG + APCA report for a pair
GET/openapi.jsonMachine-readable tool definition
JavaScript

      
Python

      
Registering as an agent tool

    
Pricing

Free to try without a signup wall

Anonymous access is deliberately open so an agent can discover and trial the API mid-task. The limit is low enough that production use needs a key.

Anonymous
$0

No key, no account. For trials and agent discovery.

  • 10 requests / minute
  • 200 requests / day
  • JSON and CSS output
  • Full contrast guarantee
Start here
Self-hosted
Free

Run the Worker on your own Cloudflare account. Source is in this repo.

  • Unlimited requests
  • Your infrastructure, your data
  • Fork and modify the engine
  • No vendor in the path
See deploy steps
Honest status. The API is deployed, and checkout, webhook-driven key issuance and the customer portal are wired to Stripe and verified end to end against a real account — payment, signature-verified webhook, key issued. Billing currently runs in Stripe's test mode, so the button above completes a full checkout with a test card but moves no real money. Per-minute limits are enforced by Cloudflare's rate limiting bindings, which are permissive by design: the cutoff is gradual, not exact.