Color Palette Generator
Press generate (or the spacebar) for a fresh palette, lock the swatches you want to keep, preview them for colour blindness, check their contrast, and export in the format you need
Palette from an image
Export and share
#264653 #2a9d8f #e9c46a #f4a261 #e76f51
Colour-blind preview
Protanopia (no red)
Deuteranopia (no green)
Tritanopia (no blue)
Achromatopsia (no colour)
A matrix simulation of how the palette reads with each condition. Useful for spotting colours that merge, not a clinical test.
Contrast matrix
| Text on background | #264653 | #2a9d8f | #e9c46a | #f4a261 | #e76f51 |
|---|---|---|---|---|---|
| #264653 | - | 3.03 | 6.03 | 4.88 | 3.25 |
| #2a9d8f | 3.03 | - | 1.98 | 1.61 | 1.07 |
| #e9c46a | 6.03 | 1.98 | - | 1.23 | 1.85 |
| #f4a261 | 4.88 | 1.61 | 1.23 | - | 1.50 |
| #e76f51 | 3.25 | 1.07 | 1.85 | 1.50 | - |
Row is the text colour, column the background. Green passes WCAG AA for normal text (4.5:1).
Lock what you like
Lock any swatch and keep generating around it; the first locked colour seeds every harmony mode
Accessibility built in
Preview your palette as protanopia, deuteranopia, tritanopia and achromatopsia, and see the WCAG ratio for every pair
Palette from any image
Drop a photo and the dominant colours are extracted in your browser; the image is never uploaded
Frequently asked questions
Why do the generated palettes look balanced instead of garish?
Colours are built in OKLCH, where lightness and chroma track what the eye perceives, and each mode keeps them inside a moderate range. Random HSL colours swing wildly in brightness at the same nominal lightness; OKLCH does not. Any colour that would fall outside the sRGB screen gamut is pulled back by reducing chroma, so hue and lightness hold.
Is the exported hex exactly what I see on screen?
Yes. Every colour is a 6-digit sRGB hex the moment it is generated, and the swatch, the share link and every export format are all rendered from that same value, so nothing is rounded or converted on the way out.
How does the share link work?
The palette is stored in the URL after the # as dash-separated hex values. Because a hash is never sent to a server, nothing leaves your browser, and opening the link reproduces the palette exactly. A link that is malformed is ignored and you get a fresh palette.
Is my image uploaded when I extract a palette?
No. The image is drawn onto a small canvas (at most 100 by 100 pixels) in your browser and a k-means clustering finds the dominant colours there. Transparent pixels are skipped, and the same image always gives the same palette.