Toolvore

Color Palette Generator

Generate harmonious color palettes with lockable swatches.

This tool runs entirely in your browser. Your data is never uploaded, never stored, and never leaves your device.

Rolls a row of five random colours, keeps any you lock, and re-rolls the rest — the quick way to arrive at a workable scheme when you have no starting colour in mind.

How to use it

  1. 1Press Generate, or focus the palette and tap the Space bar, to replace every unlocked swatch.
  2. 2Click the padlock on a swatch you want to keep; it survives every later Generate until you unlock it.
  3. 3Click a swatch's hex to copy that one colour, or use Copy below the palette to take all five as a comma-separated list.

Example

Input
Lock the second swatch, then press Generate twice
Output
The locked hex is identical after both presses; the other four change each time

Colours are drawn in HSL with saturation held between 45% and 90% and lightness between 45% and 70%, then converted to hex — which is why black, white and flat greys never come up, and equally why the tool cannot be asked for a pastel or a deep shade. The hex label switches between dark and light type on its own, from a brightness test on the swatch behind it.

What happens to your data

No palette service is involved: each hex is produced on your device from a random hue and turned into RGB by arithmetic in the page. The five colours and their lock flags live in one React state array, with no localStorage entry and nothing in the URL behind them, so a palette you have not copied is gone for good after a reload — and never existed anywhere we could have kept it.

Last updated August 2026

You have an empty layout and no colour in mind. The brief asks for something fresh but not corporate, no brand guidelines came with it, and half an hour in a colour picker has produced nothing but a slightly different blue each time. Randomness genuinely helps at this stage — five colours you did not choose tell you what you actually want faster than choosing them one at a time does.

Work out first which of two situations you are in, because only one of them is served by rolling dice. If a colour is already fixed — a logo, a client's hex, something pulled out of a photograph — you are extending a palette rather than generating one, and the honest route is to lock that colour and re-roll around it until something sits beside it well, or to build tints and shades from it instead. With nothing fixed, random is the right place to start, and locking is what turns it from a slot machine into a method: keep one, re-roll four, keep two, re-roll three.

What a random row cannot tell you is whether the colours work as an interface. Five hues arriving together are a mood board, and the common mistake is treating all five as equals. Real interfaces run on one dominant colour, a great deal of neutral, and an accent used rarely enough that it still means something — nothing here assigns those roles for you.

The other thing worth knowing before you start is that a hex value says nothing about legibility. A palette can look lively on screen and still fail the moment you put text on top of it.

How it works

Toolvore builds each swatch from a single random hue taken anywhere on the 360-degree circle, then turns that hue with its saturation and lightness into red, green and blue channels by arithmetic inside the page and prints the result as a six-digit hex. The weak point is that the five draws are independent of each other. No harmony rule connects them — nothing offers complementary, analogous or triadic sets, and nothing checks that two hues are not near neighbours, so a row where three swatches read as versions of the same teal comes up regularly, and rolling again is the only remedy. The narrow band that keeps the colours usable also decides what can never appear: no near-black for body text, no near-white for a page, no desaturated grey for borders and dividers, so the neutrals an interface actually needs have to come from elsewhere. There is no history either. The previous palette is not held anywhere, so a colour you liked but did not lock or copy cannot be recovered — there is no undo, and a reload begins from a fresh roll.

Common use cases

  • Starting a mood board when the brief names a feeling but no colours
  • Finding a second and third colour to sit beside a brand hex you already have
  • Breaking out of the same default blue on every side project
  • Choosing tag or label colours for a board where each one has to read as distinct
  • Filling in chart series colours for a prototype nobody will ship
  • Picking placeholder colours for a wireframe so sections separate visually
  • Warming up before a client colour session, with something concrete to react to

Frequently asked questions

How many colours does a design actually need?

Fewer than five, usually. A working interface tends to run on one dominant colour, one or two neutrals covering most of the surface area, and a single accent held back for the thing you want clicked. The often-quoted 60-30-10 split — sixty per cent dominant, thirty supporting, ten accent — is a rule of thumb rather than a law, but it captures the important part: the proportions matter more than the hues do. Treat a row of five as a pool to choose from rather than a specification to fill. Two of them going unused is a normal outcome, not waste.

Should I use hex, RGB or HSL in my CSS?

They describe the same sRGB colours, so the choice is about editing rather than output. Hex is compact and copies cleanly, which is why tools hand you hex. HSL is far easier to reason about by hand, because hue, saturation and lightness are separate numbers — making a colour ten per cent darker is one edit rather than three. RGB sits between them and is what you want when an alpha channel needs spelling out. Modern CSS accepts all three, plus newer spaces such as oklch that behave more predictably when you lighten and darken. Pick one per project and stay with it.

How do I build a palette when I already have one brand colour?

Work outwards from it rather than around it. The first move is usually vertical rather than sideways: take the single hex and derive tints and shades of it, so you have a light surface, a mid tone and something dark enough for text. That covers most of an interface before a second hue is involved at all. Then add one accent, chosen for contrast against the family you have just built. There are separate tools here for generating shades from one colour and for moving a value between hex, RGB and HSL, which helps when the brand guide is written in one notation and your stylesheet in another.

Will a generated palette pass accessibility contrast checks?

Assume not, and check. Contrast is a ratio between two specific colours, so a palette on its own cannot pass or fail anything — the pairing is what gets tested. WCAG asks for 4.5:1 on normal body text and 3:1 on large text and the visual boundaries of controls, and mid-lightness colours are exactly the ones that miss: too dark for white text, too light for black. The hex label sitting on each swatch picks its own dark or light type from an old weighted brightness sum with a fixed threshold, not from a contrast ratio, so it is readable in practice but is not evidence of anything. Test the real pairing in a contrast checker.

What do complementary, analogous and triadic actually mean?

They are positions on the hue circle. Complementary is two hues opposite each other, roughly 180 degrees apart, which gives maximum tension and is easy to overdo at full saturation. Analogous is three or four neighbours within about thirty degrees, which reads calm and coherent and can end up flat. Triadic is three hues spaced evenly at 120 degrees, lively and hard to balance without letting one dominate. Split-complementary takes a hue plus the two neighbours of its opposite, keeping the contrast while softening the clash. None of these schemes is applied here — hues are drawn independently, so any harmony in a roll is coincidence.

Do the colours I generate get sent anywhere?

No. This tool makes no network request of any kind — there is no palette service behind it, no call carrying the hex values away, nothing fetched per roll. The colours are produced by arithmetic running in the tab, and the five hex strings with their lock flags sit in ordinary component state, which is memory that vanishes when the page unloads. The only thing that leaves the page is what you copy, and that goes to your system clipboard under your browser's permission rules rather than ours — if the browser refuses, you are told so, rather than being left to paste whatever was on the clipboard before.

Why do my colours look different on another screen or in print?

Two separate reasons. On screens, a hex value is interpreted as sRGB, and displays vary in calibration, brightness, colour profile and whether the operating system is applying a warming filter — the same hex honestly looks different on a cheap monitor at night than on a calibrated one at noon. Print is the bigger problem, because printing is subtractive CMYK and a good part of the vivid mid-saturation range has no ink equivalent. Bright cyans, oranges and pure greens are the usual casualties and come back duller than the version everyone approved. If the palette is heading for print, get it converted and proofed before sign-off.

How do I keep the same colours consistent across a whole project?

Name them once and refer to the name everywhere. In CSS that means custom properties on the root element, and the useful discipline is naming by role rather than by appearance — a variable called brand-accent survives the day the colour changes from orange to green, while one called orange becomes a lie. Design tools have the same idea under the name styles or tokens. One small thing to watch when copying from here: the hex labels are shown in capitals by a styling rule, while the value written to your clipboard is lowercase, so a strict string comparison between what you read and what you pasted will not match.

Why does a palette that looks right in light mode fall apart in dark mode?

Because the relationships invert while the colours stay put. A mid-saturation hue that reads as confident on white tends to glow on a near-black surface, and an accent that stood out against a pale page gets lost against a dark one. The usual corrections are to desaturate slightly and lighten the accent for the dark theme rather than reusing the identical hex, and to avoid pure black as a background, since a very dark grey reduces the halation around bright text. In practice it is a second palette derived from the first, which is the moment role-based variable names start paying for themselves.

Used in these workflows