The sodium lamp turns the whole city this colour.
A dark colour scheme with São Paulo as its reference — the sodium street lamp,
exposed concrete, the free span of the MASP, the drizzle before the rain.
sp-night.github.io · palette · spec · ports
Not one palette at three brightnesses — three ways of looking at the same city.
| Noite Paulista | the city at 3am; blue-violet dark, the sodium lamp burning warm on top |
| Garoa | the same window through the drizzle; flat grey, chroma near zero |
| Pico do Jaraguá | the same night from the highest point; the dark turned towards the forest |
Plain text files. No build step, nothing to compile.
| ghostty | the full 16-colour ANSI mapping, cursor, selection, split dividers |
| kitty | ANSI, cursor, splits, the tab bar and the three mark slots |
| alacritty | ANSI, both cursors, search hits, hints, the footer bar |
| eza | a native theme.yml — file kinds, permissions, sizes, git status |
| helix | the whole scope tree, the three modes, diagnostics, diffs and the picker |
| herdr | the agent sidebar, panes and toasts — including the four colours for what each agent is doing |
Every colour is written down once. A role layer names a palette key, and a port
names a role — never a colour. Move syntax.keyword in one file and every port
changes together.
palette 22 colours per flavour — the only place a hex is written
↓
roles every role names a palette key, never a colour
↓
ports a mapping asks for a role, never a colour
No hex in any port was picked by hand, including the previews — those are synthetic SVGs drawn from the palette, so they cannot show a colour you will not get.
Contrast is a gate, not a promise. 70 pairs per flavour are measured on every build, and the build fails when one falls short. An unreadable comment is the number-one issue of every popular dark theme, and always because nobody measured.
The engine and the full specification live in sp-night/sp-night. Adding a port is three steps, and only one of them needs a human.
A port is a mapping, not a copy of colours. Start with the spec, then docs/port-creation.md.
If an app needs something the roles do not offer, that is a real finding — open an issue rather than reaching for the palette.
MIT.