Skip to content

Theming

blxshell uses matugen to generate Material Design 3 color schemes from your wallpaper.

  1. You set a wallpaper (manually or with Super + W)
  2. Matugen extracts dominant colors from the image
  3. Generates Material Design 3 palette with complementary shades
  4. Updates all configs automatically:
    • Hyprland (~/.config/hypr/colors.conf)
    • Quickshell (~/.config/quickshell/Colors.json)
    • GTK (~/.config/gtk-*/colors.css)
    • Terminal (PLACEHOLDER: Ghostty config)
    • Rofi, Fuzzel, etc.

Press Super + W to cycle through wallpapers in:

  • PLACEHOLDER: Default wallpaper directory
  • ~/.local/wallpapers/ (if you added them)
Terminal window
# Generate colors from any image
matugen image /path/to/wallpaper.png

The colors will update across your entire system!

View generated colors:

Terminal window
cat ~/.config/hypr/colors.conf
cat ~/.config/quickshell/Colors.json

Material Design 3 provides these color roles:

  • surface - Main background
  • surfaceContainer - Elevated surfaces
  • surfaceDim / surfaceBright - Dimmed/brightened variants
  • primary - Primary accent color
  • onPrimary - Text on primary
  • primaryContainer - Primary containers
  • onPrimaryContainer - Text on containers
  • secondary - Secondary accent
  • onSecondary - Text on secondary
  • secondaryContainer / onSecondaryContainer
  • tertiary - Tertiary accent
  • onTertiary - Text on tertiary
  • tertiaryContainer / onTertiaryContainer
  • error / onError - Error states
  • outline / outlineVariant - Borders and dividers

Colors are prefixed with $ in Hyprland configs:

# Example from visual/general.conf
general {
col.inactive_border = $on_primary
col.active_border = $primary $surface_container $primary
}

Edit ~/.config/matugen/config.toml:

[config]
# Color scheme variant
# Options: scheme-tonal-spot, scheme-content, scheme-expressive, scheme-fidelity
scheme = "scheme-content"
# Mode: dark or light
mode = "dark"
# Contrast: -1.0 to 1.0
contrast = 0.0
[templates]
# PLACEHOLDER: Add template paths

scheme-content (default)

  • Colors match the wallpaper closely
  • High fidelity to source image
  • Best for photography

scheme-tonal-spot

  • Creates harmonious tones
  • Less literal interpretation
  • Better for abstract wallpapers

scheme-expressive

  • Bold, vibrant colors
  • High saturation
  • Energetic feel

scheme-fidelity

  • Balanced between content and tonal
  • Preserves image essence with harmony
Terminal window
# Expressive colors
matugen image wallpaper.png --mode dark --scheme scheme-expressive
# Tonal spot
matugen image wallpaper.png --mode dark --scheme scheme-tonal-spot
# Light mode
matugen image wallpaper.png --mode light

Use color picker to generate from a hex color:

Terminal window
# Generate from hex color instead of image
matugen color "#FF5733"

Manually edit ~/.config/hypr/colors.conf:

# Override specific colors
$primary = #your_color
$surface = #your_color

Create a template override in matugen config.

PLACEHOLDER: Add example template override

Terminal window
matugen color "#88C0D0"
Terminal window
matugen color "#CBA6F7" --scheme scheme-tonal-spot
Terminal window
matugen color "#D79921" --scheme scheme-expressive
Terminal window
matugen color "#7AA2F7"

blxshell applies colors to GTK apps automatically.

~/.config/gtk-3.0/gtk.css - Auto-generated

~/.config/gtk-4.0/gtk.css - Auto-generated

Install GTK theme manager:

Terminal window
yay -S nwg-look # Wayland GTK theme switcher

PLACEHOLDER: How are terminal colors configured?

Edit PLACEHOLDER: ~/.config/ghostty/config:

# PLACEHOLDER: Terminal color config

Colors update automatically from Colors.json.

To force specific colors, edit widgets:

~/.config/quickshell/bar/Bar.qml
Rectangle {
color: col.surface // Uses auto-generated color
// Or hardcode:
// color: "#191113"
}

Quickshell widgets inherit colors from Colors.json.

View current palette:

Terminal window
cat ~/.config/quickshell/Colors.json

Create app-specific color overrides:

~/.config/hypr/rules/windowrules.conf
windowrule = bordercolor $tertiary, ^(firefox)$
windowrule = bordercolor $secondary, ^(code)$

PLACEHOLDER: Auto-switch dark/light based on time?

Script idea:

#!/bin/bash
# Switch theme based on time
hour=$(date +%H)
if [ $hour -ge 6 ] && [ $hour -lt 18 ]; then
matugen image wallpaper.png --mode light
else
matugen image wallpaper.png --mode dark
fi

Organize wallpapers by theme:

Terminal window
~/.local/wallpapers/
├── nature/
├── minimal/
├── dark/
└── light/

PLACEHOLDER: Can launcher select from specific folder?

Reload Hyprland:

Terminal window
hyprctl reload

Restart Quickshell:

Terminal window
killall qs && qs &

Check if GTK theme is set:

Terminal window
gsettings get org.gnome.desktop.interface gtk-theme

Force reload:

Terminal window
gsettings set org.gnome.desktop.interface gtk-theme 'Default'
gsettings set org.gnome.desktop.interface gtk-theme 'Adwaita'

Try different scheme:

Terminal window
matugen image wallpaper.png --scheme scheme-tonal-spot

Or pick a dominant color manually:

Terminal window
matugen color "#extracted_color"