Themes
Built-in themes, custom themes, and the theme schema.
atrium ships with 19 built-in themes and supports user-authored custom themes stored in ~/.atrium/themes/.
Built-in themes
- atrium (default dark), atrium High Contrast, atrium Light, atrium Light High Contrast
- Dracula, One Dark, One Light
- Catppuccin Mocha, Catppuccin Latte
- Solarized Light, Nord, Nord Light
- Gruvbox Dark, Gruvbox Light
- Tokyo Night, Tokyo Night Day
- GitHub Light
- Rosé Pine, Rosé Pine Dawn
- Monokai Pro
Switching
- UI — Settings → Theme and pick from the dropdown. Set to
autoto follow the system light/dark preference. - CLI —
atrium theme list/atrium theme switch <name>. - Config — edit
config.themein~/.atrium/config.json.
Custom themes
Drop a JSON file in ~/.atrium/themes/ to add a custom theme. atrium watches the directory and reloads themes on change (you should see it appear in the dropdown within a second).
Schema
{
"name": "my-theme",
"type": "dark",
"terminal": {
"background": "#1e1e1e",
"foreground": "#d9d9d9",
"cursor": "#ffd044",
"cursorAccent": "#000000",
"selectionBackground": "#47474780",
"black": "#000000",
"red": "#f07178",
"green": "#c3e88d",
"yellow": "#ffd044",
"blue": "#82aaff",
"magenta": "#c792ea",
"cyan": "#89ddff",
"white": "#ffffff",
"brightBlack": "#545454",
"brightRed": "#f07178",
"brightGreen": "#c3e88d",
"brightYellow": "#ffd044",
"brightBlue": "#82aaff",
"brightMagenta": "#c792ea",
"brightCyan": "#89ddff",
"brightWhite": "#ffffff"
},
"chrome": {
"surface": "#181818",
"border": "#303030",
"text": "#d9d9d9",
"textMuted": "#848484",
"accent": "#ffd044",
"hover": "rgba(217, 217, 217, 0.1)"
}
}
Required top-level fields:
name(string, unique; shown in the theme dropdown).type("dark"or"light").terminal(object) — ANSI palette and base colors for terminal panes. Minimum required:backgroundandforeground. Other keys (the 16 ANSI slots,cursor,cursorAccent,selectionBackground) are optional but recommended.chrome(object) — UI chrome colors. Minimum required:surface,border,text,textMuted,accent,hover.
#hex, rgb(), rgba(), named colors).
Saving the current theme as a custom theme
Settings → Theme → Save as custom exports the currently rendered theme (including any tweaks) to~/.atrium/themes/<name>-custom.json. If a file of that name exists, atrium auto-increments: <name>-custom.json → <name>-custom-2.json → and so on.
Deleting a custom theme
Delete the file under ~/.atrium/themes/. The theme disappears from the dropdown on the next watcher tick. Built-in themes cannot be deleted.
How themes apply
- Terminal colors are read by xterm.js — each ANSI slot maps to its rendered color.
- Chrome colors drive app-wide CSS custom properties (
--color-surface,--color-border,--color-text,--color-accent, …). Any atrium UI that respects the theme system reads from these variables. - The UI scale (see Appearance) composes with the theme — themes do not set sizes, they set colors.
- The embedded Excalidraw canvas in sketch notes inherits the active atrium theme: tool palette, canvas background, selected-tool tinting, and chrome match light, dark, and colored themes instead of always rendering Excalidraw's defaults. Sketch state is stamped with its workspace ID so a theme change is repainted without losing the drawing.
Recommendations
- Set
chrome.hoverto anrgba()value derived fromchrome.text, at ~10% alpha. This keeps hover states legible against both dark and light surfaces. - Keep
terminal.foregroundandchrome.textclose in luminance. Very different values make long terminal output feel inconsistent next to the editor. - Test the theme against a terminal running
ls --color, a Monaco file, the git panel, and a Markdown document — each exercises a different subset of the palette.
