Themes

spotatui comes with several built-in theme presets. Access them via Alt-, (Ctrl-, on macOS) > Theme.

Built-in Presets

Preset Description
Default (Cyan) Original spotatui theme
Terminal (ANSI) Uses your terminal's ANSI colors
Pookie Pink Bright pink theme
Spotify Official Spotify green (#1DB954)
Vesper Minimal dark theme with warm orange accents
Dracula Popular dark purple/pink theme
Nord Arctic, bluish color palette
Solarized Dark Classic dark theme
Monokai Vibrant colors on dark background
Gruvbox Warm retro groove colors
Gruvbox Light Light variant with warm colors
Gruvbox Cove Gruvbox dark on bg0, green accent, aqua second, yellow only for warnings
Catppuccin Mocha Popular pastel dark theme
Tokyo Night The Tokyo Night palette

Custom Themes

You can create custom themes in config.yml in the spotatui app config directory ($XDG_CONFIG_HOME/spotatui when XDG_CONFIG_HOME is set to an absolute path, or ~/.config/spotatui when it is unset or not absolute):

theme:
  preset: "Custom"             # Use the color keys below
  active: "137, 180, 250"      # Current playing song
  banner: "180, 190, 254"      # The "spotatui" banner
  error_border: "243, 139, 168"
  error_text: "243, 139, 168"
  hint: "249, 226, 175"
  hovered: "203, 166, 247"
  inactive: "108, 112, 134"
  playbar_background: "30, 30, 46"
  playbar_progress: "166, 227, 161"
  playbar_progress_text: "166, 227, 161"
  playbar_text: "205, 214, 244"
  selected: "137, 180, 250"
  text: "205, 214, 244"
  header: "255, 255, 255"
  background: "30, 30, 46"
  highlighted_lyrics: "166, 227, 161"

spotatui writes preset: into config.yml every time you save settings. The color keys only apply when preset is Custom, or when there is no preset: line at all. With a named preset such as preset: "Nord", that preset's colors win and the color keys are ignored, so set preset: "Custom" before editing colors by hand.

Preset names must match the names in the table above exactly, case and parentheses included ("Default (Cyan)", "Tokyo Night"). Any other value is treated as Custom.

Color Values

Always use RGB strings for consistent colors across different terminals:

text: "205, 214, 244"    # RGB format: "red, green, blue" (0-255)

Note: Terminal color names like Red, Cyan, etc. are also supported but render differently depending on your terminal's color scheme. For consistent themes, use RGB values.

Player Bar Visualizer (desktop app and browser GUI)

The spectrum or waveform behind the player bar of the desktop app and the browser GUI takes its colors from the cover of the song that plays. Every part of its look can be changed in visualizer.yml, in the same directory as config.yml (see Custom Themes). The player bar visualizer is on Linux and Windows only, so other systems do not read this file.

spotatui never writes this file, so your comments stay. The app reads it again within a second of each save, so you can tune the look while music plays. A key that is missing keeps its default. A value of the wrong type keeps its default, a number out of range is moved to the nearest end of its range, and the status line shows each problem.

Every key with its default:

colors: cover            # cover | accent | a list of colors (see below)
fallback: accent         # accent | a list of colors; used when the song has no cover
count: 5                 # 1-8 colors taken from the cover
order: luminance         # luminance (dark bass to light treble) | hue | share (largest area first)
reverse: false
greys: false             # true keeps black, white and grey from a cover that also has colors
min_distance: 0.08       # 0-0.5; how different two cover colors must be (OKLab distance)
min_share: 0.01          # 0-0.5; the smallest part of the cover a color may fill
min_saturation: 0        # 0-1; raises the saturation of colored stops, greys stay grey
luminance_floor: 0.22    # 0-1; lifts dark colors so the bars stay visible
luminance_ceiling: 0.35  # 0-1; keeps the white text readable, 1 turns it off
interpolation: srgb      # srgb | linear | oklab
fade_ms: 800             # 0-5000; how long the colors take to change to a new cover

spectrum:                # sizes in pixels (0-20), alphas from 0 to 1
  gap: 2
  cap_height: 2          # 0 hides the peak caps
  cap_gap: 2
  glow_side: 2
  glow_end: 3
  foot_alpha: 0.28
  top_alpha: 0.08
  glow_alpha: 0.12       # 0 turns the glow off
  glow_top_alpha: 0.036
  cap_alpha: 0.7
  pulse_alpha: 0.35      # 0 turns the bass pulse off
  pulse_height: 0.5      # 0-1; the pulse's height as a share of the bar
  pulse_bands: 0.125     # 0.01-1; the share of the bands, from the bass up, that drives the pulse
  fall_per_second: 3     # 0.1-60; full heights a bar falls each second
  peak_hold: 0.35        # 0-10; seconds a cap hangs
  peak_gravity: 2.4      # 0-100

waveform:
  reach: 0.46            # 0-0.5; how far the wave swings, as a share of the bar's height
  fill_alpha: 0.14
  point_spacing: 8       # 1-64; pixels per point
  min_points: 75         # 2-320; the wave never has more than 320 points
  lines:                 # [mirror -2-2, width 0-40, alpha 0-1], drawn in order, at most 8
    - [-0.6, 1, 0.18]
    - [1, 9, 0.06]
    - [1, 4, 0.16]
    - [1, 1.6, 0.85]

A color is "#rgb", "#rrggbb", "r, g, b" or one of the color names above. A fixed gradient in your own colors:

colors: ["#1e1e2e", "#cba6f7", "#f38ba8", "#fab387"]
luminance_floor: 0
luminance_ceiling: 1

The floor, the ceiling and min_saturation also apply to a list, so set them to 0, 1 and 0 to keep your colors exact. colors: accent gives the amber look of earlier releases; of these three keys, only the ceiling changes it.

The cover gradient works for Spotify, YouTube, Qobuz, Subsonic and local files with embedded art. Radio and Apple Music have no cover, so they use fallback.

Contributing Themes

Want to add a new theme preset? See CONTRIBUTING.md and check out ThemePreset in src/core/theme.rs for examples.

Edit on GitHub