Problem
The palette was chosen on a white background in the afternoon. It ships to a room where the lights are off, the screen is charcoal, and the person reading it has been awake for nineteen hours.
Solution
Design the dark version first and derive the light one, rather than the other way round, because the dark case is the constrained case and the one that actually gets used at 3am.
Inverting a light palette does not work, and the reason is worth understanding. On white, a colour is distinguished largely by its darkness—you can pick from a wide range of lightness values and every one contrasts with the background. On charcoal, every usable colour has to be lighter than the background, which collapses the available lightness range and forces hue and saturation to do work they were not carrying before. Colours that were clearly different on white converge into a set of similar pale tints on black.
The specific casualties are predictable. Saturated blues disappear into dark backgrounds. Pure yellow and pure white are painfully bright and cause halation, especially for viewers with astigmatism. Mid-tone greys that read as “muted” on white read as “barely there” on charcoal. And the amber that meant warning becomes almost indistinguishable from the yellow that meant one of the series.
NN/g’s research is a useful corrective against treating dark mode as strictly better: light mode measured better for people with normal vision on reading and acuity tasks, because positive polarity produces more light, contracts the pupil, and sharpens focus. Dark mode measured better for people with cloudy ocular media such as cataracts. The honest conclusion is that neither wins outright, which is the argument for supporting both properly rather than picking one and inverting.
WCAG’s non-text contrast floor applies to chart elements as much as to buttons, and it is the requirement most often missed in dark themes, where a series line at 2:1 against the background looks fine to the person who chose it on a good monitor.
Use when
The primary context is dark: NOC walls, on-call tooling, terminals, anything watched overnight. Also whenever the product offers a theme toggle, because both themes then need to be first-class.
Don’t use when
The output is print, PDF or a projector, where dark backgrounds waste ink and wash out. If a dashboard is regularly screenshotted into documents, the light theme is the one that ships.
Trade-offs
Maintaining two palettes doubles the work and doubles the drift, and the second theme is usually the one nobody checks. Dark themes flatter poor contrast, so problems surface only on the cheap monitor in the actual control room. Photographs, logos and embedded content assume white and look wrong. And a dark chart screenshotted into a light document arrives as a black rectangle, which is a small daily friction for teams who write incident reports.
Checklist
- Was the dark palette designed first, or inverted from a light one?
- How many series colours stay distinguishable on the actual background at the actual size?
- Is pure white or pure yellow used anywhere large, and does it halate?
- Does every series colour meet the non-text contrast floor against the dark background?
- Do the status colours stay distinct from the categorical series colours in both themes?
- Have both palettes been checked for the common colour vision deficiencies?
- Has this been looked at on the worst screen it will actually run on?
- What happens when a dark chart is pasted into a light document?
- Do grid lines, axes and labels recede properly, or do they compete?
- Does the theme follow the system preference, and can it be overridden?
Compare
Grafana ships dark as its default theme and has done for its whole life, which is why its palette reads as the reference NOC palette and why its light theme has always felt like the derived one. Netdata also defaults dark and pushes further into density, which makes its per-series distinctions harder and its resting state calmer. Honeycomb supports both and leans on a heatmap where the colour ramp rather than the categorical palette carries the meaning, so the theme question is mostly about the ramp’s endpoints. ColorBrewer predates all of this and is still the most useful reference for the underlying problem, because it was built around whether a scheme survives colourblind viewers, photocopying and projection, which is the same durability question a dark theme asks. Cloudflare Radar ships both grounds as equals and holds its hues fixed across them, which shows what that costs. Capture the same page twice and the dark blue that dominates on white is the line closest to the background on charcoal, while the pale blue that was the quiet one carries the chart. Nothing was swapped; the lightness relationship simply ran out of room.
Related
Categorical series palette is where the distinguishability problem gets solved in detail. Semantic status color has to stay separable from the series colours in both themes. Grayscale with alerts is the discipline that makes a dark palette workable by needing fewer colours. Wallboard mode is the context where the dark palette meets a bad screen and a long viewing distance. Sequential and diverging scales covers ramps, which behave differently again on dark grounds.