Skip to main content

Theme System Overview

The Kanagawa dotfiles use a unified theming system that applies colors across all components:
  • Hyprland (window manager colors)
  • Waybar (status bar)
  • Wofi (application launcher)
  • Ghostty (terminal)
  • Swaync (notification center)
  • Wlogout (logout menu)
  • Neovim (text editor)
  • VSCodium (code editor)
  • Btop (system monitor)
  • Cava (audio visualizer)
All themes are managed by the theme-switcher script located at ~/.local/bin/theme-switcher.

Existing Themes

The following themes are included by default:
  • kanagawa - Warm, soft Sumi Ink palette (default)
  • gruvbox - Retro groove color scheme
  • catppuccin - Soothing pastel theme
  • everforest - Comfortable green forest theme

Creating a New Theme

Let’s walk through creating a complete new theme called “nord”.
1

Choose your color palette

First, define your color palette. Nord uses arctic, north-bluish colors:
# Nord Color Palette
bg0:     #2E3440  (Polar Night)
bg1:     #3B4252
bg2:     #434C5E
bg3:     #4C566A

fg:      #ECEFF4  (Snow Storm)

red:     #BF616A  (Aurora Red)
orange:  #D08770  (Aurora Orange)
yellow:  #EBCB8B  (Aurora Yellow)
green:   #A3BE8C  (Aurora Green)
aqua:    #8FBCBB  (Frost)
blue:    #88C0D0  (Frost)
purple:  #B48EAD  (Aurora Purple)
2

Create Hyprland color file

Create ~/dotfiles/config/hypr/colors/custom/nord.conf:
##############################################################
## Tema: Nord                                                ##
## Descripción: Arctic, north-bluish color palette          ##
##############################################################

# Backgrounds (Polar Night)
$bg0 = 2E3440 # Darkest
$bg1 = 3B4252 # Main background
$bg2 = 434C5E
$bg3 = 4C566A
$bg4 = 4C566A

# Foreground (Snow Storm)
$fg  = ECEFF4

# Aurora Colors
$red    = BF616A
$orange = D08770
$yellow = EBCB8B
$green  = A3BE8C
$aqua   = 8FBCBB
$blue   = 88C0D0
$purple = B48EAD
$pink   = B48EAD

# Greys
$grey0 = 4C566A
$grey1 = 4C566A
$grey2 = 434C5E
Color values in Hyprland conf files are hex without the # symbol.
3

Create Waybar CSS colors

Create ~/dotfiles/config/waybar/colors/custom/nord.css:
/**************************************************************
** Tema: Nord                                                **
** Descripción: Arctic, north-bluish color palette          **
**************************************************************/

/* Backgrounds (Polar Night) */
@define-color bg0 #2E3440; /* Darkest */
@define-color bg1 #3B4252; /* Main background */
@define-color bg2 #434C5E;
@define-color bg3 #4C566A;
@define-color bg4 #4C566A;

/* Foreground (Snow Storm) */
@define-color fg  #ECEFF4;

/* Aurora Colors */
@define-color red    #BF616A;
@define-color orange #D08770;
@define-color yellow #EBCB8B;
@define-color green  #A3BE8C;
@define-color aqua   #8FBCBB;
@define-color blue   #88C0D0;
@define-color purple #B48EAD;
@define-color pink   #B48EAD;

/* Greys */
@define-color grey0 #4C566A;
@define-color grey1 #4C566A;
@define-color grey2 #434C5E;
CSS color files use @define-color and include the # symbol.
4

Create Wofi CSS colors

Create ~/dotfiles/config/wofi/colors/custom/nord.css:
/**************************************************************
** Tema: Nord                                                **
** Descripción: Arctic, north-bluish color palette          **
**************************************************************/

/* Same format as Waybar */
@define-color bg0 #2E3440;
@define-color bg1 #3B4252;
@define-color bg2 #434C5E;
@define-color bg3 #4C566A;
@define-color bg4 #4C566A;

@define-color fg  #ECEFF4;

@define-color red    #BF616A;
@define-color orange #D08770;
@define-color yellow #EBCB8B;
@define-color green  #A3BE8C;
@define-color aqua   #8FBCBB;
@define-color blue   #88C0D0;
@define-color purple #B48EAD;
@define-color pink   #B48EAD;

@define-color grey0 #4C566A;
@define-color grey1 #4C566A;
@define-color grey2 #434C5E;
5

Create Ghostty terminal colors

Create ~/dotfiles/config/ghostty/colors/custom/nord:
palette = 0=#2e3440
palette = 1=#bf616a
palette = 2=#a3be8c
palette = 3=#ebcb8b
palette = 4=#88c0d0
palette = 5=#b48ead
palette = 6=#8fbcbb
palette = 7=#eceff4
palette = 8=#4c566a
palette = 9=#bf616a
palette = 10=#a3be8c
palette = 11=#ebcb8b
palette = 12=#88c0d0
palette = 13=#b48ead
palette = 14=#8fbcbb
palette = 15=#eceff4

background = #2e3440
foreground = #eceff4
cursor-color = #eceff4
selection-background = #434c5e
selection-foreground = #eceff4
Ghostty uses a simple key = value format with # for hex colors.
6

Create Swaync notification colors

Create ~/dotfiles/config/swaync/colors/custom/nord.css:
/* Same CSS format as Waybar and Wofi */
@define-color bg0 #2E3440;
@define-color bg1 #3B4252;
@define-color bg2 #434C5E;
@define-color bg3 #4C566A;
@define-color bg4 #4C566A;

@define-color fg  #ECEFF4;

@define-color red    #BF616A;
@define-color orange #D08770;
@define-color yellow #EBCB8B;
@define-color green  #A3BE8C;
@define-color aqua   #8FBCBB;
@define-color blue   #88C0D0;
@define-color purple #B48EAD;
@define-color pink   #B48EAD;

@define-color grey0 #4C566A;
@define-color grey1 #4C566A;
@define-color grey2 #434C5E;
7

Create Wlogout colors

Create ~/dotfiles/config/wlogout/colors/custom/nord.css:
/* Same CSS format as other components */
@define-color bg0 #2E3440;
@define-color bg1 #3B4252;
@define-color bg2 #434C5E;
@define-color bg3 #4C566A;
@define-color bg4 #4C566A;

@define-color fg  #ECEFF4;

@define-color red    #BF616A;
@define-color orange #D08770;
@define-color yellow #EBCB8B;
@define-color green  #A3BE8C;
@define-color aqua   #8FBCBB;
@define-color blue   #88C0D0;
@define-color purple #B48EAD;
@define-color pink   #B48EAD;

@define-color grey0 #4C566A;
@define-color grey1 #4C566A;
@define-color grey2 #434C5E;
8

Create Btop theme

Create ~/dotfiles/config/btop/themes/custom/nord.theme:
# Nord theme for btop

theme[main_bg]="#2e3440"
theme[main_fg]="#eceff4"
theme[title]="#eceff4"
theme[hi_fg]="#88c0d0"
theme[selected_bg]="#434c5e"
theme[selected_fg]="#88c0d0"
theme[inactive_fg]="#4c566a"
theme[proc_misc]="#ebcb8b"
theme[cpu_box]="#88c0d0"
theme[mem_box]="#a3be8c"
theme[net_box]="#b48ead"
theme[proc_box]="#bf616a"
theme[div_line]="#4c566a"
theme[temp_start]="#a3be8c"
theme[temp_mid]="#ebcb8b"
theme[temp_end]="#bf616a"
theme[cpu_start]="#a3be8c"
theme[cpu_mid]="#ebcb8b"
theme[cpu_end]="#bf616a"
theme[free_start]="#a3be8c"
theme[free_mid]="#ebcb8b"
theme[free_end]="#bf616a"
theme[cached_start]="#a3be8c"
theme[cached_mid]="#ebcb8b"
theme[cached_end]="#bf616a"
theme[available_start]="#a3be8c"
theme[available_mid]="#ebcb8b"
theme[available_end]="#bf616a"
theme[used_start]="#a3be8c"
theme[used_mid]="#ebcb8b"
theme[used_end]="#bf616a"
theme[download_start]="#a3be8c"
theme[download_mid]="#ebcb8b"
theme[download_end]="#bf616a"
theme[upload_start]="#a3be8c"
theme[upload_mid]="#ebcb8b"
theme[upload_end]="#bf616a"
9

Create Cava visualizer theme

Create ~/dotfiles/config/cava/themes/custom/nord:
[color]
gradient = 1
gradient_count = 6
gradient_color_1 = '#a3be8c'
gradient_color_2 = '#8fbcbb'
gradient_color_3 = '#88c0d0'
gradient_color_4 = '#88c0d0'
gradient_color_5 = '#b48ead'
gradient_color_6 = '#bf616a'
10

Update theme-switcher script

Edit ~/dotfiles/scripts/theme-switcher to add your theme to the case statement:
# Around line 30-56, add your theme:
case $THEME in
kanagawa)
  VSCODIUM_THEME="Kanagawa Wave"
  NVIM_THEME="kanagawa"
  NOTIFY_ICON="🌊"
  ;;
# ... other themes ...
nord)
  VSCODIUM_THEME="Nord"
  NVIM_THEME="nord"
  NOTIFY_ICON="❄️"
  ;;
*)
  echo "❌ Error: Tema no reconocido."
  exit 1
  ;;
esac
Make sure the VSCODIUM_THEME matches an installed VSCodium theme name exactly, and NVIM_THEME matches your Neovim theme.
11

Add matching wallpaper (optional)

Add a wallpaper for your theme to ~/dotfiles/config/hypr/wallpapers/:
# Name it starting with your theme name
cp /path/to/your/wallpaper.png ~/dotfiles/config/hypr/wallpapers/nord-mountains.png
The theme switcher will automatically find wallpapers that start with your theme name.
12

Restow and test

cd ~/dotfiles
stow -v -R -t ~/.config config
stow -v -R -t ~/.local/bin scripts

# Test your theme
theme-switcher nord

Color Variable Naming Convention

All theme files should use these standardized variable names:

Background Colors

bg0  - Darkest background (shadows, deep backgrounds)
bg1  - Main background (primary background color)
bg2  - Secondary background (hover states)
bg3  - Tertiary background (active elements)
bg4  - Lightest background (highlights)

Foreground Colors

fg   - Primary text color

Accent Colors

red     - Error states, danger actions
orange  - Warnings, secondary highlights
yellow  - Caution, information
green   - Success, positive actions
aqua    - Utility color
blue    - Primary accent, links, focus
purple  - Special elements
pink    - Alternative accent

Neutral Colors

grey0  - Primary grey (borders, dividers)
grey1  - Secondary grey (inactive text)
grey2  - Tertiary grey (subtle elements)
Using consistent variable names allows the theme to work seamlessly across all components without editing CSS files.

Testing Your Theme

After creating your theme files:
1

Switch to the theme

theme-switcher nord
2

Verify each component

  • Hyprland: Check window borders and backgrounds
  • Waybar: Status bar should reflect new colors
  • Wofi: Open launcher with Super + Space
  • Ghostty: Open terminal with Super + T
  • Swaync: Toggle notifications with Super + N
  • Btop: Open with btop command
  • Cava: Open with cava command
3

Check hot-reload

Most components should update instantly. If not:
# Reload Hyprland
hyprctl reload

# Restart Waybar
killall waybar && waybar &

# Reload Ghostty
killall -SIGUSR2 ghostty

# Reload Swaync
swaync-client -rs
4

Fine-tune colors

If colors don’t look right, adjust your theme files and switch again:
# Edit theme file
nvim ~/dotfiles/config/hypr/colors/custom/nord.conf

# Reapply theme
theme-switcher nord

Editor Themes

Neovim

For Neovim themes, install the colorscheme plugin and it will automatically be applied:
-- In ~/.config/nvim/lua/plugins/colorscheme.lua
return {
  {
    "shaunsingh/nord.nvim",
    lazy = false,
    priority = 1000,
  },
}
The theme_bridge.lua file is automatically updated by the theme switcher.

VSCodium

Install the matching theme extension from Open VSX:
  1. Open VSCodium
  2. Go to Extensions (Ctrl+Shift+X)
  3. Search for “Nord Theme”
  4. Install it
  5. The theme switcher will automatically select it

Committing Your Theme

Once your theme is complete and tested:
cd ~/dotfiles
git add -A
git commit -m "Add Nord theme support"
git push

Next Steps

Customization

Learn how to customize other aspects of your setup

Troubleshooting

Fix common theme and configuration issues

Build docs developers (and LLMs) love