Skip to main content

Overview

Themes let you change the visual appearance of Jarvis without editing individual color/font/effect fields. A theme is a file that specifies overrides to the default configuration.
Themes use the ThemeOverrides structure. All sections are optional—only the fields you specify will override the defaults.

Built-in Themes

Jarvis ships with 8 built-in themes:

jarvis-dark

Default dark theme (Catppuccin Mocha palette)

jarvis-light

Light theme variant

catppuccin-mocha

Catppuccin Mocha community theme

dracula

Dracula color scheme

gruvbox-dark

Gruvbox dark palette

nord

Nord arctic color palette

solarized-dark

Solarized dark

tokyo-night

Tokyo Night colors

Using a Built-in Theme

config.toml
[theme]
name = "dracula"

Custom Themes

Custom themes can be YAML or TOML files. Set theme.name to either:
  • A theme name (looked up in theme search paths)
  • A direct file path (e.g., /path/to/my-theme.yaml)

Theme Search Paths

Themes are resolved in this priority order:
1

User config directory

~/.config/jarvis/themes/
2

Relative to executable

<exe_dir>/resources/themes/
3

Current working directory

./resources/themes/
For each directory, the following extensions are tried: .toml, .yaml, .yml.If the theme name contains a / or ends in .yaml, .yml, or .toml, it is treated as a direct file path.

Theme File Format

YAML Theme Example

my-theme.yaml
name: my-theme
colors:
  primary: "#ff6b6b"
  secondary: "#4ecdc4"
  background: "#0d1117"
  panel_bg: "rgba(13,17,23,0.9)"
  text: "#e6edf3"
  text_muted: "#7d8590"
  border: "#21262d"
  border_focused: "rgba(255,107,107,0.15)"
  success: "#3fb950"
  warning: "#d29922"
  error: "#f85149"
font:
  family: "JetBrains Mono"
  size: 14
  ligatures: true
  nerd_font: true
  font_weight: 400
visualizer:
  orb_color: "#ff6b6b"
  orb_secondary_color: "#4ecdc4"
background:
  hex_grid_color: "#ff6b6b"
  solid_color: "#0d1117"
effects:
  scanline_intensity: 0.05
  bloom_intensity: 1.0
  glow_color: "#ff6b6b"
  glow_width: 2.0
terminal:
  cursor_style: beam
  cursor_blink: true
window:
  opacity: 0.95
  blur: true

TOML Theme Example

my-theme.toml
name = "my-theme"

[colors]
primary = "#ff6b6b"
background = "#0d1117"
text = "#e6edf3"

[font]
family = "Fira Code"
size = 14

[effects]
scanline_intensity = 0.05

[window]
opacity = 0.9

Overridable Theme Sections

Colors Section

colors.primary
string
default:"#cba6f7"
Primary accent color (Mauve)
colors.secondary
string
default:"#f5c2e7"
Secondary accent color (Pink)
colors.background
string
default:"#1e1e2e"
Main background color (Base)
colors.panel_bg
string
default:"rgba(30,30,46,0.88)"
Panel background with alpha
colors.text
string
default:"#cdd6f4"
Primary text color
colors.text_muted
string
default:"#6c7086"
Muted/secondary text color (Overlay0)
colors.border
string
default:"#181825"
Border color (Mantle)
colors.border_focused
string
default:"rgba(203,166,247,0.15)"
Focused panel border glow
colors.success
string
default:"#a6e3a1"
Success state color (Green)
colors.warning
string
default:"#f9e2af"
Warning state color (Yellow)
colors.error
string
default:"#f38ba8"
Error state color (Red)

Font Section

font.family
string
default:"Menlo"
Terminal/code font family
font.size
u32
default:13
Font size in points (valid range: 8–32)
font.title_size
u32
default:14
Title font size in points (valid range: 8–48)
font.line_height
f64
Line height multiplier (valid range: 1.0–3.0)
font.nerd_font
bool
default:true
Enable Nerd Font glyph rendering
font.ligatures
bool
default:false
Enable font ligatures (e.g., ->, =>)
font.font_weight
u32
default:400
Font weight for normal text (valid range: 100–900)
font.bold_weight
u32
default:700
Font weight for bold text (valid range: 100–900)

Visualizer Section

visualizer.orb_color
string
default:"#00d4ff"
Primary orb color
visualizer.orb_secondary_color
string
default:"#0088aa"
Secondary orb color

Background Section

background.hex_grid_color
string
default:"#00d4ff"
Hex grid line color
background.solid_color
string
default:"#000000"
Solid color when mode = "solid"

Effects Section

effects.scanline_intensity
f32
Scanline darkness intensity (valid range: 0.0–1.0)
effects.vignette_intensity
f32
Vignette strength (valid range: 0.0–3.0)
effects.bloom_intensity
f32
Bloom brightness multiplier (valid range: 0.0–3.0)
effects.glow_color
string
default:"#cba6f7"
Glow color (hex)
effects.glow_width
f32
Glow width in pixels (valid range: 0.0–10.0)

Terminal Section

terminal.cursor_style
string
default:"block"
Cursor visual style: block, underline, beam
Enable cursor blinking

Window Section

window.opacity
f64
Window-level opacity (valid range: 0.0–1.0)
window.blur
bool
default:false
Enable macOS vibrancy / background blur

Creating a Custom Theme

1

Choose a format

Create a .yaml or .toml file in ~/.config/jarvis/themes/
2

Define overrides

Add only the fields you want to change from the defaults
3

Apply the theme

Set theme.name in your config.toml to your theme filename (without extension)
4

Test and iterate

Save the config and Jarvis will hot-reload with your new theme

Example: Creating a GitHub Dark Theme

name: github-dark
colors:
  primary: "#58a6ff"
  secondary: "#f78166"
  background: "#0d1117"
  panel_bg: "rgba(22,27,34,0.9)"
  text: "#e6edf3"
  text_muted: "#7d8590"
  border: "#30363d"
  border_focused: "rgba(88,166,255,0.2)"
  success: "#3fb950"
  warning: "#d29922"
  error: "#f85149"
font:
  family: "SF Mono"
  size: 13
  ligatures: false
effects:
  scanline_intensity: 0.03
  bloom_intensity: 0.7
  glow_color: "#58a6ff"
window:
  opacity: 0.98
  blur: true

Theme Preview Colors

For theme selection UI, you can include preview colors in your theme file:
name: my-theme
preview_colors:
  primary: "#ff6b6b"
  background: "#0d1117"
  text: "#e6edf3"

Theme Constants

The following theme names are built-in:
pub const BUILT_IN_THEMES: &[&str] = &[
    "jarvis-dark",
    "jarvis-light",
    "catppuccin-mocha",
    "dracula",
    "gruvbox-dark",
    "nord",
    "solarized-dark",
    "tokyo-night",
];

Advanced: Theme API

Loading a Theme Programmatically

use jarvis_config::theme::{load_theme, apply_theme};

let mut config = load_config()?;
let overrides = load_theme("dracula")?;
apply_theme(&mut config, &overrides);

Theme Structure

pub struct ThemeOverrides {
    pub name: Option<String>,
    pub colors: Option<ColorConfig>,
    pub font: Option<ThemeFontOverrides>,
    pub visualizer: Option<ThemeVisualizerOverrides>,
    pub background: Option<ThemeBackgroundOverrides>,
    pub effects: Option<ThemeEffectsOverrides>,
    pub terminal: Option<ThemeTerminalOverrides>,
    pub window: Option<ThemeWindowOverrides>,
}
All fields are Option<T>, so you only need to specify the fields you want to override.

Troubleshooting

Check the following:
  • Theme file exists in one of the search paths
  • File extension is .yaml, .yml, or .toml
  • YAML/TOML syntax is valid
  • Check logs for theme loading errors
Ensure:
  • Color values are valid CSS color strings (hex or rgba)
  • Theme is applied after config loads
  • Hot reload triggered (save config.toml)
Theme overrides must respect validation rules:
  • Font sizes: 8–32 (regular), 8–48 (title)
  • Opacity values: 0.0–1.0
  • Effects intensities: 0.0–3.0