Skip to main content
Use Theme in otter-settings to choose a color scheme, layout, and spacing scale independently. Running applications share the resolved otter-theme graph.

Theme files

The root file is $XDG_CONFIG_HOME/otter-shell/theme.conf, defaulting to ~/.config/otter-shell/theme.conf. It selects three layer files and global appearance settings:
Absolute paths, ~/ paths, and paths relative to the root theme file are supported. Settings preserves custom layer paths when you edit an unrelated field. User theme.conf takes precedence over /etc/otter-shell/theme.conf; compiled defaults provide the final fallback. The loader also supports migrating older flat theme files. For new configuration, use the selected layer files instead of obsolete colors_*, icons_theme, csd_*, or transparency_background_blur root keys.

Colors

A color file contains these roles:
Settings has 11 built-in color presets: Otter Shell, Catppuccin Mocha/Latte/Frappe/Macchiato, Nord, Gruvbox Dark/Light, Dracula, Tokyo Night, and One Dark. A preset writes preset-colors.conf and selects it through colors_path without replacing layout or spacing. Islands is the bar_islands global, not a twelfth color preset.

Layout and density

Choose Current or Bank as layout. Current uses 4 px standalone control and panel radii. Bank uses status markers, 2 px control radii, 6 px panel radii, a wider navigation column, and a dock panel. Layout selection does not replace your colors. Generic list selection uses tonal fill rather than adding a second focus indicator. Choose Compact, Standard, or Spacious for density. Changing colors does not change these dimensions. For custom layout files, supported fields include:
decoration accepts server, client, client_floating, or none. window_buttons uses : to separate left and right groups, with s for minimize, b for maximize, and c for close. Actual server decorations depend on compositor support.

Fonts and icons

font_family and font_size in theme.conf control shared UI typography. Terminal fonts and ANSI palette remain application settings in otter-term.conf; use Terminal in Settings for those. Set icon_theme to an XDG icon theme name or absolute theme directory. For example:
An empty value leaves icon selection to the application’s default resolver. Files follows desktop GTK/KDE icon preferences, including generated Papirus folder themes from Theme Gen; an explicit icon_theme overrides that detection. otter-shell-fonts installs fallback fonts under /usr/share/fonts/otter-shell/ and depends on Inter and Noto Color Emoji font packages.

Opacity and blur

opacity is a percentage from 0 to 100. blur requests compositor background effects where supported:
Blur is off by default and is not required by either layout. Unsupported compositors still render the normal surface fills.

App overrides

Apps can override selected theme values in their own config. Missing optional color keys inherit the shared theme. Settings marks present overrides with App override and offers Reset to remove only that key. Do not assume that an empty string has the same meaning for every field. Use Settings or the application’s documented config schema.

Wallpaper-reactive colors

otter-theme-gen watches the wallpaper state from otter-wallpaper and writes generated-colors.conf. Select that file as the color source through Settings. Generated colors do not replace layout, density, typography, or decoration choices. The Theme Gen tab controls the generator and optional templates for other apps. Hyprland template output uses ~/.config/hypr/otter-theme.lua; enabling the template does not configure your compositor’s imports for you.

Hot reload

Long-running applications watch theme.conf and the selected color, layout, and spacing files. Saving a valid edit refreshes the theme. A failed reload retains the previous valid theme rather than publishing partial state. Normal reads of layered themes do not rewrite files. Loading an older flat theme can perform a one-time migration: the loader keeps a .legacy backup, writes custom color/layout/spacing files, and updates the root to select them. Settings and Theme Gen own intentional normalization and later theme changes. See Configuration overview for app-specific reload behavior.