Themes
rove bundles three themes — claude, conductor, tokyonight — and ten
more are one command away. You can also write your own.
Any ~/.rove/themes/*.json file loads at boot and appears in the theme
picker (Settings → General → Theme, or ctrl+a then ,). A user theme with
the same name as a bundled one wins.
JSON shape
A theme is a JSON object with two top-level fields:
{
"$schema": "https://raw.githubusercontent.com/sma1lboy/rove/main/packages/kobe/src/tui/context/theme/theme.schema.json",
"defs": {
"brand": "#cc785c"
},
"theme": {
"background": "#141413",
"text": "#eae7df",
"primary": "brand",
"accent": { "dark": "#cc785c", "light": "#c96442" }
}
}defs(optional): a palette of named colors thatthemeentries can reference by name. Values are hex strings.theme(required): the slot map. Each value is either a hex string (#abc,#aabbcc,#aabbccdd), a bare string referencing a key indefs, or a{ dark, light }pair for theme-mode-aware colors. Bothdarkandlightare required when you use the variant form.$schema(optional): pointer back to Rove's JSON schema for editor autocomplete. The canonical URL is the one above.
You don't have to fill every slot; Rove has fallbacks (e.g.
missing borderActive falls through to border, missing border
falls through to text). The full slot list with fallbacks lives in
packages/kobe/src/tui/context/theme-core.ts.
The canonical example is
packages/kobe/src/tui/context/theme/claude.json.
Copy it as a starting point.
CLI
# List bundled + user-installed themes
rove theme list
# Install from a URL or local path. Default name is the basename.
rove theme add https://raw.githubusercontent.com/<you>/<repo>/main/<theme>.json
rove theme add ./my-theme.json --name darkside
# Overwrite an existing user theme
rove theme add ./darkside.json --force
# Remove a user-installed theme (built-ins can't be removed)
rove theme remove darksiderove theme add validates the JSON before writing and refuses to
overwrite without --force. Invalid themes are rejected with a
one-line reason; the schema rules are the same ones the boot-time
loader applies.
Publishing on GitHub
- Commit your theme JSON to a public repo (or gist).
- Click "Raw" on GitHub and copy the URL. It should look like
https://raw.githubusercontent.com/<you>/<repo>/main/<theme>.json. - Share
rove theme add <raw-url>with anyone who wants to install it.
That's the entire distribution mechanism: no plugin manifest, no registry. The same shape is what Rove ships internally; your theme doesn't have to know it's a "user" theme.
Hosted themes
Ten more themes are hosted rather than bundled — catppuccin, dracula,
everforest, gruvbox, kanagawa, nord, opencode, osaka-jade,
rose-pine, solarized. Install any of them with one command:
rove theme add https://rove.sma1lboy.me/themes/gruvbox.jsonPreview all thirteen at https://rove.sma1lboy.me/themes.
Troubleshooting
- Theme doesn't show up: check
rove theme listto confirm the file is being read. If it's missing, re-check the file extension (.json) and the directory path printed byrove theme list. - Theme rejected at boot: Rove writes a
console.warnline to stderr with the file path and the rejection reason. Runrove doctorfor a full environment report and check the recent output above where you ranrove. - Want to override a built-in? Drop a file with the same name
(e.g.
~/.rove/themes/claude.json). User files load after bundled ones and win on collisions.