Palette generator

Press space, lock what you like, see what can carry text.

Press space to generate · lock a colour with its padlock

Near Black

best with F4F1EA 15.82:1

carries text in this palette

Near Royal Blue

best with F4F1EA 6.03:1

carries text in this palette

Near Deep Sky Blue

best with 0F172A 5.99:1

carries text in this palette

Near Goldenrod

best with 0F172A 9.13:1

carries text in this palette

Near Floral White

best with 0F172A 15.82:1

carries text in this palette

5 of 5 colours have a partner in this palette they can carry body text on — the strongest pair is #0F172A with #F4F1EA at 15.82:1. 1 pair collapse under simulated colour blindness — Near Deep Sky Blue / Near Goldenrod.

In short

Press the spacebar and the unlocked columns re-roll. Click a lock and that colour stays while everything else rearranges around it. So far, so familiar — that interaction has been the standard for a decade and there is no reason to change it.

What palette generator is

A generator that produces a row of colours you can lock and re-roll with the spacebar. What separates one from another is not the generating — that has been solved for a decade — but whether anything in the result can carry text.

What this tool does that others do not

  • Locking anchors rather than freezes

    A locked colour is not simply left alone while the rest are re-randomised. Its hue becomes the anchor, and the others are placed at spaced hues and staggered lightnesses around it, so the set reliably spans dark to mid-light, with something dark enough to carry text. The generator does not reach the near-white of a page background, so add your own if the palette needs one.

  • Text is judged against the palette, not against white

    Each column names its strongest partner inside the palette and the ratio between them, because a palette is used against itself. Checking against white or black cannot fail: every colour clears about 4.58:1 on one of the two, since its contrast on white times its contrast on black is always 21. Where no partner reaches 4.5:1, the column offers the nearest colour that would, at the same hue.

  • The audit strip counts what is usable

    It reports how many of the colours have a partner in the palette they can carry body text on, names the strongest pair, and names any pair that stops being tellable apart under simulated colour-vision deficiency. The second is a foreground-against-foreground check, which is the comparison a contrast tool never makes.

  • The palette lives in the address bar

    Colours are encoded in the URL, so copying the link shares exactly what is on screen. No account, nothing stored here, and a shared palette that still works in a year.

How to use it

  1. Lock the colour you already have

    Start from the brand colour or the one you like, then press space. Re-rolling all five and hoping is the slow path.

  2. Watch the audit strip, not the swatches

    A row of swatches always looks good. The number that matters is how many of them can hold text on another colour in the same set, because a palette of mid-tones has nothing dark or light enough to pair with.

  3. Take the suggested replacement for anything that fails

    It holds the hue, so the substitute still belongs to the palette rather than arriving from somewhere else.

  4. Copy the URL before you close the tab

    That is the save. There is no account and nothing is kept on this side.

Worked example

Real input, real figures.

Auditing a popular mid-tone palette

You give it

#264653, #2a9d8f, #e9c46a, #f4a261, #e76f51 — teal, sand and coral.

You get

Three of five have a text partner: the dark teal reaches 6.03:1 with the sand. The mid teal tops out at 3.03:1, and its fix is #53bfb0 at 4.53:1 against #264653, hue held at 183° and OKLCH lightness moved from 0.630 to 0.738. The coral tops out at 3.25:1.

Against the usual spacebar generator

AspectThis toolA typical generator
Locking behaviourLocked hue anchors the placement of the restLocked slot skipped, rest randomised
Per-colour verdictIts strongest partner in the palette, with the ratioNone, or against white only
Palette-level checkPairwise colour-vision collapse namedNot offered
When a colour failsThe nearest passing colour at the same hueNothing
SharingColours encoded in the URLAn account

Guide

What is different is the audit

The common complaint about palette generators is that the result looks good as a row of swatches and falls apart in a real interface. Usually that is because nothing in the palette can carry text: photographs and random generators both gravitate to mid-tones, and a set of mid-tones has nothing dark or light enough to pair with itself.

So every column shows its contrast against both grounds, and where neither passes it offers the nearest colour that would — holding the hue, so the suggestion still belongs to the palette. The strip at the bottom counts how many colours are actually usable as text, and names any pair that collapses under simulated colour blindness.

Why locking anchors rather than freezes

When you lock a colour, the generator does not simply leave it alone and randomise the rest. It treats the locked hue as the anchor and places the others at spaced hues and staggered lightnesses around it, so the set holds together and reliably contains something dark enough for text and something light enough for a surface.

Purely random values per slot is what produces five colours with no relationship to each other, which is the thing you then have to press space forty more times to escape.

Questions people ask

Straight answers. Each one links directly: copy the address after opening it.

How do I keep a colour I like?

Click the lock on its column. Locked colours stay put and everything else regenerates around them — the locked hue becomes the anchor the rest are placed against, rather than the whole set being re-rolled at random.

What does the audit strip tell me?

How many of the colours have a partner in the same palette they can carry body text on, which pair is strongest, and whether any pair collapses under simulated colour blindness. All of it is measured live as you edit.

Why not check each colour against white and black?

Because that check cannot fail. A colour’s contrast on white multiplied by its contrast on black is always 21, so every colour clears about 4.58:1 on one of the two. The useful question is whether it can carry text on another colour in your palette, so each column shows its strongest partner there, and offers a fix at the same hue when none reaches 4.5:1.

Can I share a palette?

Yes — the colours live in the address bar, so copying the URL shares exactly what you are looking at. No account and nothing stored on our side.

Looking for something already made? The palette libraryis curated and filterable by whether the colours carry body text, survive colour blindness, or hold up as chart series.