Three palettes, not one
This is the distinction the inspiration boards flatten, and almost every dashboard problem traces back to it. Three colour systems share one screen, each with a different job and a different failure mode.
| Job | Fails when | |
|---|---|---|
| Neutrals | Carry 80–90% of the screen: surfaces, borders, body text, table rows | Too few steps, so a dense table has nothing to separate rows, headers and disabled cells |
| Semantic | Mean something: success, warning, danger, info | A decorative element borrows the colour, and users learn to ignore it |
| Categorical | Distinguish data series from each other | Too many hues, or hues that collapse for a colour-blind reader |
A brand palette that looks great on a landing page usually supplies one of these — an accent — and none of the other two. That is why the first dashboard screen looks fine and the fifth looks like three products stitched together.
On a dashboard the accent is the rarest colour on screen, not the most visible one.
Build the neutrals first
Neutrals carry most of a dashboard, and a thin neutral scale is the single most common structural defect. A dense table needs to separate, at minimum: the page background, the card the table sits in, the header row, the row hover state, the border between rows, primary text, secondary text, and disabled text. That is eight distinguishable values, and "three greys" does not produce them.
Two things make a neutral scale work. First, give it enough steps — nine or so, spaced perceptually rather than by even hex arithmetic, which clusters everything in the middle. Second, tint them. A neutral carrying a small amount of your brand hue reads as part of the design; an untinted grey reads as the framework default, because it is.
Token specimen · real values
Ambient Sage
Live renderAmbient Sage's actual tokens — the same values its exports use.
Color tokens
Ambient Sage
Core
background
H 72 · C0, 0, 2, 4
foreground
H 84 · C7, 0, 18, 89
card
H 70 · C0, 0, 3, 10
muted
H 80 · C1, 0, 3, 7
border
H 69 · C0, 0, 3, 15
Brand
primary
H 53 · C0, 8, 68, 0
primary-fg
H 84 · C7, 0, 18, 89
secondary
H 70 · C0, 0, 3, 10
accent
H 52 · C0, 8, 60, 3
ring
H 53 · C0, 8, 68, 0
Semantic
destructive
H 6 · C0, 70, 78, 25
destructive-fg
H 0 · C0, 0, 0, 0
success
H 130 · C61, 0, 51, 55
warning
H 35 · C0, 38, 91, 21
muted-fg
H 84 · C2, 0, 6, 66
Charts
chart-1
H 53 · C0, 8, 68, 0
chart-2
H 210 · C65, 33, 0, 17
chart-3
H 142 · C44, 0, 28, 25
chart-4
H 340 · C0, 48, 32, 12
chart-5
H 33 · C0, 30, 68, 9
Reserve the status colours
Success, warning, danger and info are not decoration. The moment a chart series, a nav highlight, or a marketing banner uses your red, red stops meaning "something is wrong", and users stop scanning for it. This is a one-way door: attention you spend on decoration cannot be reclaimed for meaning.
- Keep them out of the categorical set. If you have four series and one of them is green, that green is now ambiguous on a screen that also shows health status.
- Don't let the accent be a status colour. If your brand is green and green also means success, either the brand or the meaning has to move. Usually the brand: shift the accent's hue or lightness far enough that the two never sit adjacent and read as the same thing.
- Never rely on colour alone. A status needs an icon, a label, or a shape as well. This is an accessibility requirement, and it is also what keeps the interface readable in a screenshot pasted into a support ticket.
- Give each status a surface variant. A danger *badge* and a danger *banner background* are different colours; if you define only one you will get a banner that either shouts or disappears.
How many data series can you colour?
Six or seven, and the honest answer is that six is where it starts getting difficult. The constraint is not aesthetic: distinguishable hues at equal lightness are a limited resource, and once about eight of them are on one chart, adjacent series become guesswork and the legend turns into a lookup task.
This is the part a palette generator cannot help with, because the categorical set has to be judged as a group and against the neutrals it will sit on. Below are two dashboard-shaped palettes with their chart-1 through chart-5 roles visible alongside the surfaces — which is the only way to see whether series four is still distinguishable from series two on a card.
Token specimen · real values
EarthDash
Live renderEarthDash's actual tokens — the same values its exports use.
Color tokens
EarthDash
Core
background
H 40 · C0, 0, 1, 2
foreground
H 0 · C0, 0, 0, 90
card
H 0 · C0, 0, 0, 0
muted
H 40 · C0, 2, 5, 6
border
H 39 · C0, 2, 6, 10
Brand
primary
H 23 · C0, 47, 76, 3
primary-fg
H 0 · C0, 0, 0, 90
secondary
H 40 · C0, 2, 5, 6
accent
H 60 · C0, 0, 72, 11
ring
H 23 · C0, 47, 76, 3
Semantic
destructive
H 6 · C0, 70, 78, 25
destructive-fg
H 0 · C0, 0, 0, 0
success
H 67 · C4, 0, 38, 56
warning
H 38 · C0, 31, 86, 9
muted-fg
H 27 · C0, 14, 25, 58
Charts
chart-1
H 0 · C0, 0, 0, 90
chart-2
H 38 · C0, 12, 32, 24
chart-3
H 67 · C4, 0, 38, 56
chart-4
H 23 · C0, 47, 76, 3
chart-5
H 60 · C0, 0, 72, 11
Read the chart roles as a row, never one at a time
A categorical colour has no meaning alone; it only has to differ from its neighbours. Squint at the five chart swatches together — if any two merge, they will merge on a chart too, and no amount of tuning the individual hex will fix a set that is too tightly packed.
Both sets stop at five, which is deliberate rather than a limitation of the format.
What to do instead, in order of preference:
- Label directly. Put the series name at the end of its line. This removes the legend, removes the lookup, and removes most of the pressure on colour.
- Group the tail. Show the top five and an "other" bucket. Almost no dashboard reader is comparing series eleven with series twelve.
- Split the chart. Small multiples — one series per panel, same axes — beat one chart with twelve colours at almost any size.
- Vary something other than hue. Dash pattern, marker shape, or fill texture, especially in print or when a screenshot may be greyscaled.
Sequential and diverging are different problems
Categorical colours must be *equally* distinguishable with no implied order. A sequential scale — low to high — must vary mainly in lightness so the order is readable, and a diverging scale needs a neutral midpoint with two directions away from it. Using a categorical palette for a heatmap is the most common version of this mistake, and it makes the data look random.
Colour-blind safety, concretely
Around one in twelve men has some form of colour vision deficiency, and the most common form makes red and green hard to separate — which is unfortunate, because red and green are exactly what dashboards use for bad and good.
The practical rules are short. Vary lightness as well as hue between any two colours that carry meaning, so they remain distinguishable in greyscale. Never pair red and green as the only difference between two states. And for status, always add a second channel — an icon, a plus or minus sign, a word — so the colour is reinforcement rather than the message. A palette that survives a greyscale screenshot survives almost every deficiency.
Dark mode changes the answer
Dashboards get used in dark mode more than most product surfaces, and a categorical palette tuned for white does not transfer. Mid-tone saturated hues that read cleanly on white tend to vibrate against a near-black background, and the two or three darkest series simply disappear.
Define the series colours per mode rather than converting them. The same is true of your neutral scale: in dark mode raised surfaces are *lighter* than the background, which inverts the instinct that a card is a lighter thing on a tinted page. The specifics — including measured lightness values from shipping palettes — are in dark mode colour palettes that hold up.
Ambient Sage
Live renderRendered from the kit's actual tokens, fonts, and treatments
Dashboard
Welcome back — here's how Ambient Sage is performing today.
Active users
15.1k
+5%Trending up this month
vs. previous 30 days
MRR
$49.1k
+3%Strong recurring growth
Net of churn
Retention
89%
+2%Engagement above target
Rolling 28-day window
NPS
69
+3Meets growth projections
Survey · n=1,204
Total revenue
Last 12 months
$49.1k+18.2%
Recent sales
You closed 265 deals this month.
Alex Rivera
alex@ambientsage.com
Mira Okonkwo
mira@ambientsage.com
Jonas Feld
jonas@ambientsage.com
Sana Qureshi
sana@ambientsage.com
Theo Lindgren
theo@ambientsage.com
Recent transactions
View all| Customer | Status | Date | Amount |
|---|---|---|---|
AR Alex Rivera Founder & CEO | Paid | 2m ago | $1,999.00 |
MO Mira Okonkwo Head of Product | Pending | 1h ago | $39.00 |
JF Jonas Feld Design Lead | Processing | 3h ago | $299.00 |
SQ Sana Qureshi Engineering Lead | Paid | Yesterday | $99.00 |
TL Theo Lindgren Brand Director | Refunded | 2d ago | $2,400.00 |
Typography
Plus Jakarta Sans
Color system
28 semantic roles, light + dark
Agent outputs
DESIGN.md, CSS, Tailwind, shadcn
Why this keeps getting rebuilt from scratch
Increasingly the dashboard is generated rather than designed — an agent is asked for an analytics screen and produces one. Whatever the brief did not specify, the model supplies, and it supplies it fresh each time.
We sampled 299 public DESIGN.md files, the documents written specifically so a coding agent will follow them. 86% give raw hex values with no semantic role attached, which means the file cannot answer "what colour is a disabled table cell" or "which colour means danger". 69% never mention dark mode. So the agent decides, and it decides differently on the next screen.
The fix is the same whether a person or an agent is building: name the roles, define them in both modes, and write down which colours are reserved. A palette expressed as roles is instruction; a palette expressed as five hex codes is inspiration.
Checks that catch the failures
- 1
Screenshot the densest table and desaturate it
If rows, headers, hover and disabled states stop being distinguishable in greyscale, your neutral scale is too flat and your status colours are carrying meaning alone.
- 2
Put every status on screen at once
Success, warning, danger and info together, as badge and as banner. This is where a missing surface variant shows immediately.
- 3
Chart eight series on purpose
Not because you should ship it, but to find where your palette gives up. Whatever number that is, design the "and others" behaviour for one below it.
- 4
Toggle dark mode with a chart open
The two darkest series are the ones that vanish, and they vanish silently.
- 5
Count the accent
On a good dashboard screen the accent appears once or twice. If it is everywhere, it has stopped meaning "this is the action".
Palettes defined as roles, in both modes
Every kit here defines its full set of colour roles for light and dark — surfaces, borders, muted text, status and chart series — installable as one shadcn registry item. Free kits need no account.
FAQ
How many colours should a dashboard palette have?
More than people expect, because it is three palettes. Roughly nine neutral steps, four status colours each with a badge and a surface variant, and six or seven categorical series — all defined in both light and dark. A five-swatch brand palette supplies about one of these.
How many data series can I distinguish by colour?
Six or seven in practice. Past that, adjacent series become guesswork and the legend turns into a lookup task. Better options in order: label series directly, group the tail into an 'other' bucket, split into small multiples, or vary dash pattern and marker shape instead of adding another hue.
What if my brand colour is also a status colour?
Move the brand, not the meaning. If your accent is green and green means success, shift the accent's hue or lightness far enough that the two never read as the same thing when adjacent. Status colours are learned by users and cannot be reclaimed once diluted.
Can I use my marketing palette for the dashboard?
Only as a starting point. A marketing palette usually supplies an accent and a couple of decorative colours; a dashboard needs a deep neutral scale, a reserved status set and a categorical set. Reuse the hue family so it feels like one product, then build the other two palettes properly.
How do I make a dashboard palette colour-blind safe?
Vary lightness as well as hue between any two colours that carry meaning, never rely on red versus green as the only difference between states, and always add a second channel such as an icon or a label. The quickest test is to desaturate a screenshot: if it is still readable in greyscale, it is safe for almost every deficiency.