Skip to content
Nokkvi

Customizing Themes

Nokkvi comes with 21 built-in themes, but you can easily create your own using simple TOML files.

Custom themes are stored in:

~/.config/nokkvi/themes/

Any .toml file placed in this directory will automatically appear in the Settings menu (default: ` backtick). Built-in themes are seeded to this directory on first launch, so you can open any of them as a starting point.

A theme file has a name field and two palette sections — [dark] and [light] — each containing the same color keys. This lets the same file drive both light and dark mode, toggled by the light_mode setting.

name = "My Theme"
[dark.background]
hard = "#1d2021"
default = "#282828"
# ...
[dark.foreground]
bright = "#fbf1c7"
# ...
[light.background]
hard = "#f9f5d7"
default = "#fbf1c7"
# ...

All keys have defaults — you only need to specify the ones you want to override. The defaults come from the built-in Adwaita theme.


All color values are 6-digit hex strings ("#rrggbb").

The background scale runs from darkest (hard) to lightest (level4). The UI layers components on this scale to create depth.

KeyDark defaultLight defaultUsed for
hard#1d1d20#ffffffWindow chrome, outermost container
default#222226#fafafbMain view background
soft#2e2e32#ebebedPanel backgrounds, sidebar
level1#2e2e32#ebebedSlot row backgrounds
level2#36363a#dedddaHovered row, secondary surfaces
level3#3d3846#c0bfbcDividers, input borders
level4#5e5c64#9a9996Disabled/muted surface fills

The foreground scale runs from brightest text to near-invisible muted text.

KeyDark defaultLight defaultUsed for
bright#ffffff#000000Primary text, titles
level1#f6f5f4#241f31Standard body text
level2#deddda#3d3846Secondary text, metadata
level3#c0bfbc#5e5c64Tertiary text, timestamps
level4#9a9996#77767bPlaceholder text, hints
gray#77767b#9a9996Muted icons, decorative elements

Accent colors drive interactive elements — the progress bar, focused item, playing indicator, and link color.

KeyDark defaultLight defaultUsed for
primary#3584e4#3584e4Default accent: progress bar, toggles, links
bright#62a0ea#62a0eaHover state, brighter highlight
border_dark#000000#1a5fb4Dark border around accent elements
border_light#1c71d8#99c1f1Light border / glow around accent elements
now_playing#3584e4#1c71d8Color of the now-playing row indicator; defaults to primary if empty
selected#3584e4#3584e4Color of the center/selected slot; defaults to bright if empty

Used for error states, destructive action indicators, and conflict badges.

KeyDark defaultLight default
base#e01b24#c01c28
bright#f66151#ed333b

Used for enabled status indicators and success toasts.

KeyDark defaultLight default
base#26a269#26a269
bright#33d17a#33d17a

Used for warning toasts and capture prompts.

KeyDark defaultLight default
base#e5a50a#e5a50a
bright#f6d32d#f6d32d

Used for star rating fills.

KeyDark defaultLight default
base#e5a50a#e5a50a
bright#f6d32d#f6d32d

Each mode ([dark.visualizer] / [light.visualizer]) has its own set of visualizer colors. See the Visualizer Reference for how gradient_mode maps these onto bars and lines.

KeyDark defaultLight defaultDescription
border_color#1d1d20#ffffffBar border / LED segment gap color
border_opacity1.00.0Bar border opacity (0.0 to 1.0)
led_border_opacity1.00.0Border opacity in LED bar mode
bar_gradient_colors["#3584e4", "#1c71d8", "#62a0ea"]1–8 hex colors used for the bar gradient
peak_gradient_colors["#ed333b", "#ff7800", "#f6d32d"]1–8 hex colors used for peak indicators
[dark.visualizer]
border_color = "#1d2021"
border_opacity = 1.0
led_border_opacity = 0.8
bar_gradient_colors = ["#b8bb26", "#98971a", "#d8a657"]
peak_gradient_colors = ["#fb4934", "#fabd2f"]

You don’t need to specify every key. Any omitted key falls back to the built-in Adwaita defaults. Here’s a theme that only changes the accent color:

name = "Cobalt Accent"
[dark.accent]
primary = "#0088cc"
bright = "#33aaee"
border_light = "#005f99"
now_playing = "#0077bb"
selected = "#0088cc"
[light.accent]
primary = "#0077bb"
bright = "#0088cc"
border_light = "#005f99"
now_playing = "#005f99"
selected = "#0077bb"

A complete theme file with all sections filled out:

name = "Gruvbox Dark"
[dark.background]
hard = "#1d2021"
default = "#282828"
soft = "#32302f"
level1 = "#3c3836"
level2 = "#504945"
level3 = "#665c54"
level4 = "#7c6f64"
[dark.foreground]
bright = "#fbf1c7"
level1 = "#ebdbb2"
level2 = "#d5c4a1"
level3 = "#bdae93"
level4 = "#a89984"
gray = "#928374"
[dark.accent]
primary = "#458588"
bright = "#83a598"
border_dark = "#076678"
border_light = "#689d6a"
now_playing = "#458588"
selected = "#83a598"
[dark.danger]
base = "#cc241d"
bright = "#fb4934"
[dark.success]
base = "#98971a"
bright = "#b8bb26"
[dark.warning]
base = "#d79921"
bright = "#fabd2f"
[dark.star]
base = "#d79921"
bright = "#fabd2f"
[dark.visualizer]
border_color = "#1d2021"
border_opacity = 1.0
led_border_opacity = 0.8
bar_gradient_colors = ["#b8bb26", "#fabd2f", "#83a598"]
peak_gradient_colors = ["#fb4934", "#fabd2f"]
[light.background]
hard = "#f9f5d7"
default = "#fbf1c7"
soft = "#f2e5bc"
level1 = "#ebdbb2"
level2 = "#d5c4a1"
level3 = "#bdae93"
level4 = "#a89984"
[light.foreground]
bright = "#282828"
level1 = "#3c3836"
level2 = "#504945"
level3 = "#665c54"
level4 = "#7c6f64"
gray = "#928374"
[light.accent]
primary = "#076678"
bright = "#458588"
border_dark = "#076678"
border_light = "#83a598"
now_playing = "#076678"
selected = "#458588"
[light.danger]
base = "#9d0006"
bright = "#cc241d"
[light.success]
base = "#79740e"
bright = "#98971a"
[light.warning]
base = "#b57614"
bright = "#d79921"
[light.star]
base = "#b57614"
bright = "#d79921"
[light.visualizer]
border_color = "#fbf1c7"
border_opacity = 0.0
led_border_opacity = 0.0
bar_gradient_colors = ["#458588", "#076678", "#83a598"]
peak_gradient_colors = ["#cc241d", "#d79921"]