Dark themes for terminals and editors — six phosphor tubes and four OLED-black flavors.
At a glance
- 6 phosphor themes — one terminal tube each, hierarchy from brightness alone
- 4 OLED-black flavors: Random Access, Veridis, Voyager, Amnesiac
- 6–7 terminal ports each: Ghostty, WezTerm, iTerm2, Alacritty, kitty, Windows Terminal, Pi
- Editor ports today: VS Code, Sublime Text, Zed, Neovim (Veridis)
- Two pipelines, both validated: flavors generate from palette YAML, phosphors generate from their pi theme — see the manifest
- Every thinking ramp is derived and enforced: escalation is chroma, not lightness
See the demo preview for the flagship terminal render and rebuild commands.
Six themes, one terminal tube each. A real CRT could not show many hues, so it built hierarchy out of luminance — dim for what is resting, bright for what matters, a hot peak for what is happening now — and these spend a single phosphor the same way. Love letters to specific hardware: a VT520 under amber, a VT640 radar scope, the WOPR's blue room.
They are the refined half of this repo and they set its standards. The thinking-ramp rule every flavor now uses came from here, along with the validator that enforces it, and nothing in the family blinks — which the Ghostty exports now state outright rather than having the generator overrule.
Their pi themes are hand-authored and canonical: the terminal exports are derived from that JSON rather than the other way round, because these arrived finished and a pipeline built to spread a cool-spectrum palette across four flavors would only have made them worse.
| Theme | Tube | Glow | Ports |
|---|---|---|---|
reckoner-exect |
EXECT-100 / DEC VT520 | amber phosphor | pi + 6 terminals |
reckoner-scope |
DEC VT640 | P1 green | pi + 6 terminals |
reckoner-wopr |
VT100 | navy + cyan | pi + 6 terminals |
reckoner-darkspace |
dark.spaceAMP | teal wireframe | pi + 6 terminals |
reckoner-dusk |
— | violet on blue-black | pi + 6 terminals |
reckoner-factory |
— | safety orange on true black | pi + 6 terminals |
Full descriptions, the brightness ladder, and the harness-footer vocabulary they were tuned against: docs/phosphor-themes.md.
They also brought the thinking-ramp rule the generator now uses — see below.
Four variants, one philosophy: dark surfaces, restrained UI chrome, and a cool-spectrum accent family.
| Flavor | Named after | Accent | Background | Description |
|---|---|---|---|---|
| Random Access | Daft Punk — Random Access Memories | #00ffb2 mint |
#000000 pure OLED black |
Flagship. Mint-forward, green-family syntax, zero warm hues |
| Veridis | Daft Punk — Veridis Quo | #00ffb2 mint |
#0f0e0d warm black |
Warm-dark base with crisp cream text and electric mint |
| Voyager | Daft Punk — Voyager | #2ccfc0 teal |
#0f0e0d warm black |
Warm-dark base with a brighter teal-led accent family |
| Amnesiac | Radiohead — Amnesiac | #7b93ff indigo |
#0f0e0d warm black |
Warm-dark base with cool indigo contrast and sharper separation |
Five themes named for the hours, darkest to brightest. Four are ports — their colours belong to upstream projects and are reproduced unchanged.
| Theme | Hour | Palette | Upstream | Licence |
|---|---|---|---|---|
madrugada |
before dawn | blue-violet night | Tokyo Night | Apache-2.0 |
amanecer |
dawn | rose and gold | Rosé Pine | MIT |
mediodia |
noon | Latte, ink on paper | Catppuccin | MIT |
atardecer |
late afternoon | burnt ochre, olive | Gruvbox Material | MIT |
ocaso |
sundown | amber on ink | none identified | — |
anochecer |
nightfall | mauve | Catppuccin | MIT |
Only pi's thinking ramp was rebuilt, because that ramp is not something those
projects define and every port arrived with one that ended on its own error
colour. Full detail, and the statement of changes Apache-2.0 requires, in
docs/day-cycle.md and NOTICE.
Most dark themes spread warm accents across the screen. Random Access Themes deliberately compress the visual range:
- dark surfaces stay dark
- syntax lives in a tight accent family
- text stays high-contrast and calm
- WCAG contrast is treated as a hard requirement, not a nice-to-have
The flagship Random Access palette reaches 17.44:1 text/background contrast and every foreground color clears WCAG AA against the base background.
See the full rationale in docs/design.md.
| Terminal | Amber EXECT | Green Scope | Cyan WOPR | Teal Darkspace | Violet Dusk | Orange Factory |
|---|---|---|---|---|---|---|
| Ghostty | conf | conf | conf | conf | conf | conf |
| WezTerm | toml | toml | toml | toml | toml | toml |
| iTerm2 | itermcolors | itermcolors | itermcolors | itermcolors | itermcolors | itermcolors |
| Alacritty | toml | toml | toml | toml | toml | toml |
| kitty | conf | conf | conf | conf | conf | conf |
| Windows Terminal | json | json | json | json | json | json |
| Pi | json | json | json | json | json | json |
Pi is the source for these six; the terminal rows are derived from it.
| Terminal | Random Access | Veridis | Voyager | Amnesiac |
|---|---|---|---|---|
| Ghostty | conf | conf | conf | conf |
| WezTerm | toml | toml | toml | toml |
| iTerm2 | itermcolors | itermcolors | itermcolors | itermcolors |
| Alacritty | toml | toml | toml | toml |
| kitty | conf | conf | conf | conf |
| Windows Terminal | json | json | json | json |
| Pi | json | json | json | json |
| Editor | Flavor |
|---|---|
| VS Code | Veridis |
| Sublime Text | Veridis |
| Zed | Veridis |
| Neovim | Veridis |
Fetch a generated theme straight to its standard location — no clone, no Python, no build step:
curl -fsSL https://raw.githubusercontent.com/sainzs/random-access-themes/main/scripts/get.sh | bash -s -- ghosttyTargets: alacritty · wezterm · ghostty · kitty · iterm2 · windows-terminal · pi · all. The pi target installs every theme in the family — all sixteen — not just one. Add --dry-run to preview, or pin a release with RAT_REF=v0.1.2. Existing files are backed up before they are overwritten. See scripts/get.sh.
bash scripts/install.sh ghosttyWrites the full config to ~/.config/ghostty/config and stubs the macOS Library config to prevent duplicate entries.
cp themes/wezterm/random-access-theme.toml ~/.config/wezterm/colors/Then in wezterm.lua:
config.color_scheme = "Random Access Theme"bash scripts/install.sh iterm2Then: Profiles > Colors > Color Presets > Import and select the .itermcolors file.
# In alacritty.toml
[import]
paths = ["/path/to/themes/alacritty/random-access-theme.toml"]echo "include /path/to/themes/kitty/random-access-theme.conf" >> ~/.config/kitty/kitty.confAdd the scheme from themes/windows-terminal/random-access-theme.json into the "schemes" array in your settings JSON.
bash scripts/install.sh pi --theme reckoner-scopeLinks all ten themes into ~/.pi/agent/themes/ and sets that one active. Then
/reload. By hand, if you prefer:
for t in themes/pi/*.json; do ln -sf "$PWD/$t" ~/.pi/agent/themes/; doneCheck that the theme actually took. pi resolves a theme by the name field
inside the JSON, not by filename, and if the name in settings.json does not
resolve initTheme falls back to its built-in dark silently — no warning,
no log line, and a dark theme is plausible enough that you can look straight at
the fallback for weeks. A theme with a / in it, a package-qualified name, a
typo: all identical from the outside.
python3 -c "import json;print(json.load(open('$HOME/.pi/agent/settings.json'))['theme'])"
ls ~/.pi/agent/themes/ | sed 's/.json$//'The first must appear in the second. themes/pi/ holds ten: the four flavors and
the six phosphor tubes in docs/phosphor-themes.md.
Bonus configs for tools that inherit ANSI colors or benefit from explicit theming:
| Tool | File | What it does |
|---|---|---|
| tmux | integrations/tmux.conf |
Status bar and pane border colors |
| fzf | integrations/fzf-export.sh |
FZF_DEFAULT_OPTS color env vars |
| bat | integrations/bat-config |
Syntax highlighting theme |
| delta | integrations/gitconfig-delta |
Git diff colors |
| Starship | integrations/starship.toml |
Prompt styling |
| eza | integrations/eza-export.sh |
EZA_COLORS env vars |
Flagship Random Access palette — all colors stay in a green-family range, including ANSI remaps.
| Role | Hex | Purpose |
|---|---|---|
| bg | #000000 |
Pure OLED black |
| text | #d8efe9 |
Primary text — green-tinted near-white |
| subtle | #9cb7af |
Secondary text, labels |
| dimText | #6f8d86 |
Comments, disabled |
| mint | #00ffb2 |
Hero accent, cursor |
| green | #4ade80 |
Functions, success |
| teal | #35d5c5 |
Quotes, borders |
| jade | #66e3c4 |
Keywords |
| aqua | #8bf5dd |
Numbers, highlights |
| emerald | #26c994 |
Errors (no warm red) |
| lime | #a2e5b8 |
Strings, warnings |
All foreground colors pass WCAG AA against #000000. Most reach AAA.
Pi shows how hard the model is being driven as one escalating colour, six levels of it. Escalation is chroma, not lightness. Each ramp is derived in HSL from the palette's quiet text up to its hero accent, holds the accent's hue for the whole climb, and stops at the accent — never past it. A phosphor driven harder gets more vivid, not more white.
It used to be six fixed palette slots — subtle, emerald, teal, jade,
mint, aqua — the same list for every flavor, which was not a ramp at all: it
fell at minimal, fell again at high, and finished on aqua at 75% lightness.
Amnesiac was worse, ending at 89% having crossed 208° of hue, so asking for more
reasoning turned the indicator pale and then a different colour entirely.
| flavor | off | xhigh | hue held |
|---|---|---|---|
| Random Access | #6f8d84 |
#00ffb2 |
0° |
| Veridis | #71817c |
#00ffb2 |
1° |
| Voyager | #718180 |
#2ccfc0 |
2° |
| Amnesiac | #717481 |
#7a93ff |
1° |
make validate enforces it across every theme in themes/pi/, flavors and
phosphors alike: no level above 74% lightness, none darker than the level below
it, and no more than 40° of hue across the ramp. The check came from the reckoner
project, where it was written after watching the top level go white on a screen
recording.
Requirements: Python 3.9+, pyyaml
pip install pyyaml| Command | What it does |
|---|---|
make generate |
Regenerate terminal themes from palette YAML |
make visuals |
Regenerate README SVG visuals from palette YAML |
make validate |
Structural + freshness + drift checks |
make contrast |
Full WCAG contrast report |
make check |
Generate + validate + contrast |
make phosphor-exports |
Derive phosphor terminal exports from themes/pi/reckoner-*.json |
make phosphor |
Regenerate the phosphor screenshots in assets/phosphor/ |
make release |
Build release artifacts to dist/ |
Installing to this machine is scripts/install.sh, which takes --theme <name>
(default reckoner-scope), links every pi theme, writes the Ghostty config from
themes/ghostty/<theme>.conf, and backs up anything it replaces:
bash scripts/install.sh --dry-run # see it first
bash scripts/install.sh --theme reckoner-wopr
bash scripts/install.sh pi # one target onlyGhostty colours are read from the generated export rather than written into the installer. They used to be a heredoc in that script — a second copy of the flagship palette that no generator touched and no check compared, in the one file whose job is to be the last word on what lands on a machine.
The source-of-truth map lives in docs/manifest.md, and the public preview flow is documented in docs/demo.md.
Each flavor has its own palette file in palette/. Edit the YAML, then regenerate the assets you changed.
README visuals in assets/*.svg are generated by scripts/render_repo_visuals.py.
The canonical palette is also exported as reusable design tokens for web and UI projects:
| Artifact | Path | Use case |
|---|---|---|
| W3C-style tokens | tokens/design-tokens.json |
All four flavors in one importable file |
| CSS variables | tokens/random-access-theme.css |
Web projects using the flagship palette |
| Tailwind config | tokens/tailwind.js |
Tailwind extend colors snippet |
Run make tokens to regenerate them after editing a palette.
random-access-themes is the design system of the Random Access agent toolchain — four small packages that compose into one maintainer surface:
| Package | Layer | What it does |
|---|---|---|
| santiagosainz-skills | Workflow | Portable maintainer skills: review, planning, debug, verify, handoff |
| reckoner | Memory | Agent memory, auto-verification, and guardrails |
| registro | Reporting | Agent work report CLI and dashboard |
| random-access-themes | Design system | OLED-black themes and tokens shared across the toolchain |
See CONTRIBUTING.md. The only files that should be edited manually are the palette YAML files in palette/ plus repo docs / scripts. Theme files in themes/ and README SVGs in assets/ are generated.
MIT for everything original here.
The five day-cycle themes are ports and keep their upstream licences — Tokyo
Night is Apache-2.0, the rest MIT. See NOTICE for the copyright
holders and the record of what was changed.
