dirge ships two built-in palettes and supports user-defined themes
via JSON files in ~/.config/dirge/.
phosphor(default) — 80s CRT green. Errors red, warnings yellow.plain— white assistant text, cyan accents, gray dim.
Switch via theme in ~/.config/dirge/config.json:
{
"theme": "plain"
}Any value other than phosphor / plain is treated as the stem
of a theme file: dirge looks for
~/.config/dirge/<name>.theme.json. If found, its color fields
override the phosphor preset; anything not present in the
file stays phosphor. If the file is missing or malformed, dirge
falls back to phosphor with a warning rather than refusing to
start.
Every field is optional. A minimal one-color override:
{
"accent": "magenta"
}A fully-custom palette:
{
"agent": "#88ccff",
"user": "#ffaa66",
"system": "darkgray",
"tool": "darkcyan",
"perm": "yellow",
"result": "darkgray",
"critic": "#c9a9ff",
"thinking": "#8a9c90",
"error": "red",
"warn": "yellow",
"accent": "#ff66cc",
"dim": "darkgray",
"header": "cyan",
"divider": "darkgray",
"banner_primary": "#aa88ff",
"banner_secondary": "darkmagenta",
"input_bg": "#1a1a22",
"label": "MIDNIGHT"
}Each color field accepts three forms:
-
Named color (case-insensitive,
_and-separators both work):"black","red","green","yellow","blue","magenta","cyan","white","grey"(or"gray")"darkred","darkgreen","darkyellow","darkblue","darkmagenta","darkcyan","darkgrey"(or"darkgray")"reset"(terminal default)
-
Hex RGB:
"#rrggbb"(six hex digits). Renders as truecolor; terminals without truecolor support degrade gracefully. -
256-color palette index: a plain integer 0–255 (no quotes).
| Field | What it colors |
|---|---|
agent |
Assistant chat text |
user |
User message prefix (<you>) |
user_input |
The bottom input-bar text you type (defaults to white) |
system |
System messages — context loaded, compactions |
tool |
Tool chamber headers (╭─ BASH ─ …) |
perm |
Permission prompts (loud — yellow/red recommended) |
result |
Secondary result text (slash output, dim tool stdout) |
critic |
In-loop critic's review voice (<critic>) |
thinking |
Agent reasoning / "thinking" register (placeholder, Ctrl+O expand, Ctrl+R stream) |
error |
Hard errors (red recommended; keeps semantic urgency) |
warn |
Warnings (yellow recommended) |
accent |
Headers, focused picker rows, banner accent |
dim |
Placeholders, separators, low-noise hints |
header |
Right-panel headers |
divider |
Horizontal divider line |
banner_primary |
Welcome banner primary stroke |
banner_secondary |
Welcome banner border / decorations |
background |
Terminal background fill, painted behind every cell (foregrounds preserved). Use "reset" to keep the terminal's own background — that's the plain default; phosphor uses a near-black #222222. |
input_bg |
Background of the bottom input box, painted over background. Keeps the composer a dark field so user_input (white) stays readable even on a light terminal / light theme. Both presets default to #222222; use "reset" to opt out and match background. |
label |
Human-readable name shown in the banner |
- Create
~/.config/dirge/midnight.theme.jsonwith your override. - Set
theme: "midnight"in~/.config/dirge/config.json. - Restart dirge.
If something's wrong dirge prints a single warning on startup and uses phosphor:
warning: theme 'midnight' could not be loaded (parse /home/y/.config/dirge/midnight.theme.json: trailing comma at line 4); using phosphor.
Custom themes live at ~/.config/dirge/<name>.theme.json.
The error message names the file path so it's clear what dirge was trying to load.