TUI theme JSON
Themes are JSON documents. Built-in presets are embedded into the binary from themes/*.json at build time (same pattern as starter agents), so curl | sh installs and single-binary releases still have the full catalog. arbiter --init also writes them to ~/.arbiter/themes/ for editing. Your config file is ~/.arbiter/tui.json; custom theme documents live in ~/.arbiter/themes/. Set ARBITER_THEMES_DIR to overlay a filesystem tree during development without rebuilding.
Quick start
Pick a built-in preset (default is high-contrast):
{
"preset": "nord"
}
Or point at a theme file:
{
"theme_file": "themes/mine.json"
}
Paths in theme_file are relative to ~/.arbiter/ unless absolute (or ~/…).
Create a custom theme
- Export a built-in preset as a starting point:
arbiter --export-theme high-contrast > ~/.arbiter/themes/mine.json
- Edit colors (
#RRGGBBhex). For a variant of an existing theme, add"preset": "nord"and only the keys you want to change; for a standalone theme, export a full file and edit it directly.
- Activate it:
{
"theme_file": "themes/mine.json"
}
Or name the file mine.json and use /theme mine / "preset": "mine" (user themes in ~/.arbiter/themes/).
arbiter --init copies all built-in theme JSON files into ~/.arbiter/themes/ (skipping files you already edited) and writes example.json as an editable copy of the default.
In-session commands
| Command | Effect |
|---|---|
/theme | Browse themes with ↑↓ live preview; Enter selects, Esc cancels. |
/theme list | Built-in presets + custom themes in ~/.arbiter/themes/ |
/theme <name> | Switch preset or custom theme; updates tui.json |
/theme save <name> | Write the current look to ~/.arbiter/themes/<name>.json |
/theme file <path> | Load a JSON file and set theme_file in tui.json |
JSON schema
Top-level keys:
| Key | Purpose |
|---|---|
preset | Built-in preset name, or basename of themes/<name>.json |
theme_file | Path to a theme JSON file (relative to ~/.arbiter/) |
bg | Pane backgrounds: base, panel, header, scroll, status, input, footer, gutter |
text | primary, muted, subtle, inverse |
accent | primary, secondary, success, warning, error, info |
border | subtle, focus, gutter, plus optional vertical / horizontal strings |
content | Markdown/scrollback: heading (array of 4), code, link, diff colors, syntax tokens, panel surfaces (code_bg, code_header_bg, code_gutter, diff_bg_*, system_fg), agent_palette (array of 12), … |
layout | Padding, column breakpoints, vertical rhythm (block_gap, panel_gap, prose_paragraph_gap), chrome density (chrome_compact_rows, scroll_pad_y, scroll_gutter_cols), show_footer, show_history_sidebar, mouse, … |
component | Prompt/footer strings |
Example partial override on a preset (in tui.json or a theme file):
{
"preset": "high-contrast",
"accent": { "primary": "#c678dd" },
"content": {
"heading": ["#61afef", "#c678dd", "#56b6c2", "#d19a66"]
},
"layout": {
"pane_padding_x": 1,
"input_padding_x": 2
}
}
All color values use "#RRGGBB". Settings in tui.json are merged on top of theme_file / preset (useful for small tweaks without duplicating a full theme).