A meticulously crafted, Hatsune Miku–inspired Sway desktop environment built on the Tokyo Night color palette.
- Quick Start
- Color Palette
- Typography
- Components
- Custom Scripts
- Keybindings
- Directory Structure
- Customization Guide
- Credits
# Clone the repository
git clone https://github.com/sea-deep/arch-theme.git ~/code/arch-theme
cd ~/code/arch-theme
# Run the installer (do NOT run as root)
chmod +x install.sh
./install.shThe installer will:
- Configure Pacman parallel downloads, enable the
multilibrepository, and set up thechaotic-aurpre-compiled repository. - Install
yay(AUR helper) if missing. - Install all required packages via
yay. - Back up any existing configs to
*.bak(and prevent nested backups). - Symlink everything from this repo into
~/.config/. - Set up Ly display manager, TLP, and systemd services.
- Optionally configure fingerprint authentication.
Note: After installation, reboot or log out to enter your new Sway session.
Every component in this dotfiles collection uses the same unified color palette, derived from Tokyo Night and accented with Miku Teal.
| Role | Hex | Preview | Used In |
|---|---|---|---|
| Base Background | #1a1b26 |
🟫 | Everywhere — Sway, Waybar, Kitty, Rofi, Ly |
| Deep Background | #15161e |
⬛ | Waybar borders, Rofi panel backgrounds |
| Surface / Gutter | #414868 |
🔘 | Unfocused UI elements, dim text |
| Miku Teal (Primary) | #39c5bb |
🟩 | Focused borders, active workspace, accents |
| Bright Teal | #33e0e0 |
🟦 | Hover states, Waybar border glow |
| Sky Cyan | #7dcfff |
🔵 | Links, secondary highlights, unfocused labels |
| Blue | #7aa2f7 |
🔷 | Focused input labels, secondary accents |
| Purple | #bb9af7 |
🟣 | Sway indicator color |
| Red / Error | #f7768e |
🔴 | Urgent windows, battery critical, muted audio |
| Yellow / Warning | #e0af68 |
🟡 | Warning states |
| Foreground | #c0caf5 |
⬜ | Primary text color |
| Soft Foreground | #a9b1d6 |
🩶 | Secondary text, environment switcher |
To re-theme the entire desktop, you only need to search-and-replace these hex codes across the config files. Every component references them directly — there are no magic variables or indirection layers.
This setup uses two font families with a strict separation of concerns:
| Context | Font | Weight | Where to Change |
|---|---|---|---|
| System UI | IBM Plex Sans SmBld | SemiBold (600) | sway/config line 10, gtk-3.0/settings.ini, gtk-4.0/settings.ini |
| Monospace / Code | FiraCode Nerd Font | Regular (400) | kitty/kitty.conf line 6, waybar/style.css line 4 |
The file fontconfig/conf.d/99-user-fonts.conf ensures that all applications (including web browsers) resolve generic font families to your chosen fonts:
| Generic Family | Resolves To |
|---|---|
sans-serif |
IBM Plex Sans |
serif |
IBM Plex Serif |
monospace |
FiraCode Nerd Font |
To change the system font, update the font name in the files listed above AND update
fontconfig/conf.d/99-user-fonts.confto match.
Config: sway/config
The heart of the desktop. SwayFX is used (not vanilla Sway) for blur and rounded corners.
| Setting | Value | Line |
|---|---|---|
| Font | IBM Plex Sans SmBld 10 |
10 |
| Mod Key | Super (Mod4) |
45 |
| Terminal | kitty |
52 |
| Launcher | rofi (via rofi-manager.sh) |
54 |
| Browser | zen-browser |
58 |
| File Manager | thunar |
56 |
| Wallpaper | wallpapers/satisfaction_hires_final.png |
65 |
| Display | 1920×1080 @ 60Hz, scale 1.25 | 66 |
| Border Width | 2px (no titlebars) | 30 |
| Corner Radius | 10px | 32 |
| Gaps (inner) | 2px | 70 |
| Gaps (outer) | 1px | 71 |
| Blur | Enabled, radius 7, passes 4 (frosted glass) | 41–43 |
| Shadows | Enabled, radius 20, color #15161ecc |
44–46 |
| Inactive Dimming | Enabled, 15% dim | 48–49 |
Window Border Colors (lines 35–39):
| State | Border | Background | Text |
|---|---|---|---|
| Focused | #39c5bb |
#39c5bb |
#1a1b26 |
| Focused Inactive | #414868 |
#414868 |
#c0caf5 |
| Unfocused | #24283b |
#24283b |
#a9b1d6 |
| Urgent | #f7768e |
#f7768e |
#c0caf5 |
Cursor Theme (lines 13–15):
| Setting | Value |
|---|---|
| Theme | breeze_cursors |
| Size | 24 |
To change wallpaper: Replace the PNG at
wallpapers/satisfaction_hires_final.pngor edit line 65. To change display scaling: Edit thescalevalue on line 66. To change gaps: Edit lines 70–71.
Config: waybar/config · Style: waybar/style.css
A top-mounted, rounded-pill-style bar with transparent spacing between modules.
Layout:
┌─────────────────────────────────────────────────────────┐
│ [Workspaces] [Window] [Clock] [Tray] [🔔] [HW] [⏻] │
└─────────────────────────────────────────────────────────┘
| Module | Content | Click Action |
|---|---|---|
| Workspaces | Workspace numbers | Switch workspace |
| Window | Focused window title | — |
| Clock | HH:MM AM/PM · Mon DD |
Tooltip: Calendar |
| Tray | System tray icons | — |
| Notifications (🔔) | Swaync indicator | Toggle notification panel |
| Hardware Group | Audio / Brightness / Battery | See below |
| Power (⏻) | Power icon | Opens Rofi power menu |
Hardware Group Actions:
| Sub-module | Click | Middle-Click | Scroll |
|---|---|---|---|
| Audio | Toggle Pavucontrol popup | Mute/Unmute | — |
| Brightness | — | Toggle idle inhibitor | Adjust brightness ±1% |
| Battery | Open TLP power profile menu | — | — |
Styling Quick Reference (waybar/style.css):
| Property | Value | Line |
|---|---|---|
| Font | FiraCode Nerd Font |
4 |
| Font Weight | normal | 5 |
| Font Size | 16px | 6 |
| Module Background | #1a1b26 |
23 |
| Module Border | 2px solid #15161e |
27 |
| Module Border Radius | 12px | 26 |
| Hover Border | 2px solid #33e0e0 |
63 |
| Active Workspace BG | #39c5bb |
82 |
| Active Workspace Text | #1a1b26 |
83 |
To change the bar font: Edit
waybar/style.cssline 4. To change module layout: Edit themodules-left/center/rightarrays inwaybar/config. To change accent color: Replace#39c5bband#33e0e0inwaybar/style.css.
Config: rofi/config.rasi · Power Menu: rofi/powermenu.rasi
Rofi is used for three functions, all managed through sway/rofi-manager.sh:
| Function | Keybinding | Mode |
|---|---|---|
| App Launcher | Super + D |
drun |
| Clipboard History | Super + V |
clipboard |
| Emoji Picker | Super + . |
emoji |
Key Customization Points (rofi/config.rasi):
| Setting | Value |
|---|---|
| Font | IBM Plex Sans SmBld 13 |
| Icon Theme | TokyoNight-SE |
| Display Columns | 2 |
| Window Width | 600px |
To change the launcher font: Edit the
font:line inrofi/config.rasi. To change launcher width/columns: Edit theconfigurationblock inrofi/config.rasi.
Config: kitty/kitty.conf
| Setting | Value | Line |
|---|---|---|
| Font | FiraCode Nerd Font |
6 |
| Font Size | 13pt | 10 |
| Padding | 12px | 14 |
| Opacity | 0.95 (95%) | 20 |
| Background | #1a1b26 |
23 |
| Foreground | #c0caf5 |
24 |
| Cursor | #39c5bb |
25 |
| Selection | Teal on dark | 27–28 |
| Window Decorations | Hidden | 16 |
Terminal Color Map:
| Index | Normal | Bright | Color |
|---|---|---|---|
| 0/8 | #1a1b26 |
#414868 |
Black/Gray |
| 1/9 | #f7768e |
#f7768e |
Red |
| 2/10 | #39c5bb |
#39c5bb |
Green (Miku Teal) |
| 3/11 | #e0af68 |
#e0af68 |
Yellow |
| 4/12 | #7aa2f7 |
#7aa2f7 |
Blue |
| 5/13 | #bb9af7 |
#bb9af7 |
Purple |
| 6/14 | #7dcfff |
#7dcfff |
Cyan |
| 7/15 | #a9b1d6 |
#c0caf5 |
White |
To change terminal transparency: Edit line 20 (
background_opacity). To change terminal font size: Edit line 10 (font_size).
Config: swaync/config.json · Style: swaync/style.css
Desktop notification daemon with a slide-out side panel.
To change notification styling: Edit colors in
swaync/style.css. To change notification behavior: Editswaync/config.json.
Config: ly/config.ini · PAM: ly/pam · TTY Colors: ly/set-tty-theme.sh
A lightweight, blazing-fast TUI display manager for Wayland and TTY. Styled to match the Kitty terminal palette using an automated TTY 16-color hex palette injection service (tty-theme.service).
| Setting | Value |
|---|---|
Background (bg) |
0 (#1a1b26 - Miku Dark Blue) |
Foreground (fg) |
7 (#c0caf5 - Miku Text) |
Borders (border_fg) |
6 (#39c5bb - Miku Teal) |
Active Item (active_user_fg) |
14 (#39c5bb - Bright Miku Teal) |
| Box Title | "Arch Linux" |
| Blank Empty Password | true |
PAM Configuration:
The login PAM stack requires a password on every login and automatically unlocks GNOME Keyring.
auth include system-local-login
auth optional pam_gnome_keyring.so ← Unlocks keyring with login password
session optional pam_gnome_keyring.so auto_start
To change login colors: Edit the hex values in
ly/set-tty-theme.shor the color indices inly/config.ini.
Swaylock is configured inline via CLI flags — there is no standalone swaylock/config file. The lock command and wallpaper path are defined in:
sway/idle.sh— auto-lock after idle timeoutrofi/powermenu.sh— manual lock from power menuwlogout/layout— lock button in logout overlay
Lock Wallpaper: ~/Pictures/wallpapers/satisfaction_waybar_blur_lock.png
Optional fingerprint unlock support is available via fingerprint/.
To change the lock wallpaper: Update the image path in all three files listed above.
Layout: wlogout/layout · Style: wlogout/style.css
Fullscreen logout/power overlay triggered by the Rofi power menu.
To customize: Edit button labels and actions in
wlogout/layout, and styling inwlogout/style.css.
Config: btop/btop.conf · Theme: btop/themes/miku-dark.theme
Launched with Super + Escape. Uses a custom Miku Dark theme file.
To change btop colors: Edit
btop/themes/miku-dark.theme.
Config: starship.toml
Cross-shell prompt using a powerline pill style with Nerd Font icons.
Prompt Layout:
dipak@arch ~/code/project dart flutter git:main ❯
└── teal bg ──┘└── gray bg ──┘└── purple bg ─────────┘
| Segment | Background | Foreground |
|---|---|---|
| OS + User + Host | #39c5bb |
#1a1b26 |
| Directory | #414868 |
#c0caf5 |
| Languages + Git | #bb9af7 |
#1a1b26 |
| Success prompt char | — | #39c5bb ❯ |
| Error prompt char | — | #f7768e ❯ |
To customize the prompt: Edit
starship.toml. See starship.rs for docs.
GTK-3: gtk-3.0/ · GTK-4: gtk-4.0/
| Setting | Value |
|---|---|
| GTK Theme | adw-gtk3-dark |
| Icon Theme | TokyoNight-SE |
| Cursor Theme | breeze_cursors |
| Font | IBM Plex Sans SmBld 10 |
| Sound Theme | Pop |
| Dark Mode | Enforced |
Custom color overrides are in gtk-3.0/colors.css and gtk-4.0/colors.css, using a Breeze-derived teal accent.
To change GTK font: Edit
gtk-font-namein bothgtk-3.0/settings.iniandgtk-4.0/settings.ini. To change icon theme: Editgtk-icon-theme-namein both settings files.
Config: fontconfig/conf.d/99-user-fonts.conf
Forces all applications (especially web browsers) to resolve generic font families to your chosen fonts. Without this, browsers may fall back to Times New Roman.
Additional configs handle emoji rendering:
75-joypixels.conf— JoyPixels emoji support98-remove-mono-emojis.conf— Strips monochrome emoji fallbacks99-reject-google-emoji.conf— Blocks Google Noto Color Emoji
To change browser fallback fonts: Edit
fontconfig/conf.d/99-user-fonts.conf.
Config: environment.d/qt-theming.conf · qt5ct/qt5ct.conf · qt6ct/qt6ct.conf
Environment variables force Qt apps to use qt5ct/qt6ct for consistent theming.
| Script | Location | Purpose | Triggered By |
|---|---|---|---|
rofi-manager.sh |
sway/ |
Unified launcher for Rofi (drun/clipboard/emoji) | Super+D, Super+V, Super+. |
idle.sh |
sway/ |
Swayidle configuration: dim→lock→dpms off→suspend | Auto on Sway start |
hw-notifier.py |
sway/ |
Desktop notifications for USB/power events | Systemd service |
battery.sh |
waybar/ |
Custom battery display with TLP profile indicator | Waybar module |
pavu_toggle.sh |
waybar/ |
Pavucontrol popup with global Escape-to-close | Waybar audio click |
tlp_menu.sh |
waybar/ |
Rofi dropdown for TLP power profile switching | Waybar battery click |
toggle_idle.sh |
waybar/ |
Toggle idle inhibitor on/off | Backlight middle-click |
powermenu.sh |
rofi/ |
Rofi power menu (lock/logout/reboot/shutdown) | Super+Power button |
install-miku-tray-patch.sh |
scripts/ |
Patches system tray icons to Miku theme | Manual |
apply_frosted_glass.sh |
scripts/ |
Wallpaper generator (frosted glass + lockscreen) | Manual |
An ImageMagick pipeline that takes any wallpaper and converts it into two theme-ready images:
- Desktop wallpaper — with a frosted glass blur strip along the top edge (designed so Waybar blends seamlessly into the wallpaper)
- Lock screen wallpaper — a heavily blurred, darkened variant tinted with the Tokyo Night base color (
#1a1b26at 60% opacity), downscaled to native resolution
Requirements: imagemagick must be installed (sudo pacman -S imagemagick).
Usage:
# Interactive mode
./scripts/apply_frosted_glass.sh
# CLI mode
./scripts/apply_frosted_glass.sh input.png output.pngHow the pipeline works:
┌─────────────────────────────────────────────────┐
│ 1. INPUT IMAGE │
│ ↓ │
│ 2. Auto-detect display resolution via Sway IPC │
│ (falls back to manual input if no session) │
│ ↓ │
│ 3. Resize to display resolution if needed │
│ • Option A: Crop to fill (preserves ratio) │
│ • Option B: Stretch to fit │
│ ↓ │
│ 4. Generate top bar mask: │
│ • Top: 40px solid white + 20px fade │
│ • Rest: Solid black │
│ ↓ │
│ 5. Apply 25px Gaussian blur to masked top area │
│ ↓ │
│ 6. OUTPUT: Desktop wallpaper (native res) │
│ ↓ │
│ 7. BONUS: Generate lockscreen variant │
│ • 40px blur + 60% Tokyo Night tint │
│ • Same native resolution │
└─────────────────────────────────────────────────┘
Output files:
| File | Resolution | Description |
|---|---|---|
<output>.png |
Auto-detected | Desktop wallpaper with frosted glass edges |
<output>_lock.png |
Auto-detected | Lock screen — blurred & tinted Tokyo Night |
To use a new wallpaper: Run this script on any image, then copy the outputs into
wallpapers/and update the path insway/configline 65.
| Timeout | Action |
|---|---|
| 3 minutes | Dim screen (brightness → 5%) |
| 5 minutes | Lock screen (swaylock) |
| 10 minutes | Turn off display (DPMS) |
| 15 minutes | Suspend to RAM |
To change idle timeouts: Edit the timeout values in
sway/idle.sh.
Screen sleep is automatically prevented when:
- Any audio is playing (
sway-audio-idle-inhibit) - Any window is fullscreen (YouTube, video players, etc.)
All keybindings use Super (Windows key) as the modifier.
| Keys | Action |
|---|---|
Super + Return |
Open terminal (Kitty) |
Super + D |
App launcher (Rofi) |
Super + B |
Open browser (Zen Browser) |
Super + E |
File manager (Thunar) |
Super + Z |
Open Zed editor |
Super + Shift + Z |
Open new Zed window |
Super + V |
Clipboard history |
Super + . |
Emoji picker |
Super + Escape |
System monitor (Btop) |
| Keys | Action |
|---|---|
Super + Q |
Kill focused window |
Super + F |
Toggle fullscreen |
Super + Shift + Space |
Toggle floating |
Super + Space |
Toggle focus (tiling ↔ floating) |
Super + H/J/K/L |
Move focus (Vim-style) |
Super + Shift + H/J/K/L |
Move window (Vim-style) |
Super + Arrow Keys |
Move focus (Arrow keys) |
Super + R |
Enter resize mode |
Super + S |
Stacking layout |
Super + W |
Toggle tabbed/split layout |
Super + A |
Focus parent container |
| Keys | Action |
|---|---|
Super + 1–0 |
Switch to workspace 1–10 |
Super + Shift + 1–0 |
Move window to workspace 1–10 |
| Keys | Action |
|---|---|
Super + Shift + - |
Move window to scratchpad |
Super + - |
Show/cycle scratchpad |
| Keys | Action |
|---|---|
XF86AudioMute |
Toggle mute |
XF86AudioLowerVolume |
Volume -5% |
XF86AudioRaiseVolume |
Volume +5% |
XF86AudioMicMute |
Toggle mic mute |
XF86AudioPlay/Pause |
Play/Pause media |
XF86AudioPrev/Next |
Previous/Next track |
XF86MonBrightnessDown |
Brightness -5% |
XF86MonBrightnessUp |
Brightness +5% |
| Keys | Action |
|---|---|
Super + Shift + S |
Region select → Swappy editor |
Super + Print |
Full screen → clipboard |
| Keys | Action |
|---|---|
Super + N |
Toggle notification panel |
Super + Shift + C |
Reload Sway config |
Super + Shift + E |
Exit Sway (with confirmation) |
arch-theme/
├── 🪟 sway/ # Window manager config
│ ├── config # Main Sway configuration
│ ├── idle.sh # Idle timeout handler
│ ├── rofi-manager.sh # Unified Rofi launcher
│ └── hw-notifier.py # USB/power notification daemon
│
├── 📊 waybar/ # Status bar
│ ├── config # Module layout & behavior
│ ├── style.css # Visual styling
│ ├── battery.sh # Battery + TLP status script
│ ├── pavu_toggle.sh # Audio mixer popup script
│ ├── tlp_menu.sh # Power profile switcher
│ └── toggle_idle.sh # Idle inhibitor toggle
│
├── 🔍 rofi/ # Application launcher
│ ├── config.rasi # Main Rofi theme
│ ├── powermenu.rasi # Power menu theme
│ ├── powermenu.sh # Power menu script
│ └── rofimoji-theme.rasi # Emoji picker theme
│
├── 🐱 kitty/ # Terminal emulator
│ └── kitty.conf # Colors, font, opacity
│
├── 🔔 swaync/ # Notification daemon
│ ├── config.json # Behavior settings
│ └── style.css # Visual styling
│
├── 🔒 swaylock/ # Lock screen
├── 🔑 ly/ # Display manager (login screen)
│ ├── config.ini # UI styling & behavior
│ ├── pam # PAM authentication stack
│ ├── set-tty-theme.sh # TTY 16-color hex scheme
│ └── tty-theme.service # Systemd oneshot color service
│
├── 🚪 wlogout/ # Logout overlay
│ ├── layout # Button definitions
│ └── style.css # Visual styling
│
├── 📈 btop/ # System monitor
│ ├── btop.conf # Settings
│ └── themes/miku-dark.theme # Custom Miku color theme
│
├── 🔤 fontconfig/ # System font overrides
│ └── conf.d/
│ ├── 99-user-fonts.conf # Font family aliases
│ ├── 75-joypixels.conf # Emoji font config
│ ├── 98-remove-mono-emojis.conf
│ └── 99-reject-google-emoji.conf
│
├── 🎨 gtk-3.0/ # GTK-3 theming
│ ├── settings.ini # Theme, font, icons
│ ├── colors.css # Color overrides
│ └── gtk.css # CSS overrides
│
├── 🎨 gtk-4.0/ # GTK-4 theming
│ ├── settings.ini # Theme, font, icons
│ ├── colors.css # Color overrides
│ └── gtk.css # CSS overrides
│
├── 🧰 environment.d/ # Environment variables
│ └── qt-theming.conf # Qt platform theme config
│
├── ⚙️ qt5ct/ & qt6ct/ # Qt theme configurations
├── 🖼️ icons/ # Custom icon theme (YAMIS-enlarged)
├── 📁 Thunar/ # Thunar file manager settings (custom actions/shortcuts)
├── 📁 xfce4/ # Xfce4/Thunar system registry configuration XMLs
├── 🏠 applications/ # Custom .desktop launchers
├── 📜 scripts/ # Utility scripts
├── 🖥️ systemd/ # User systemd services
├── 🌌 wallpapers/ # Wallpaper images
├── 🐚 zshrc # Zsh shell configuration
├── 🚀 starship.toml # Shell prompt configuration
├── 📋 mimeapps.list # Default application associations
├── 👆 fingerprint/ # Fingerprint auth setup
├── ⚡ etc/tlp.conf # TLP power management
└── 📦 install.sh # One-shot installer
The primary accent is Miku Teal #39c5bb. To change it:
- Search and replace
#39c5bbacross all files - Also replace the hover variant
#33e0e0 - Key files to update:
sway/config(border colors)waybar/style.css(active workspace, hover)waybar/config(icon span colors)rofi/config.rasi(selection highlight)kitty/kitty.conf(cursor, selection, color2/10)swaync/style.css(notification accent)ly/config.ini&ly/set-tty-theme.sh(focused colors)
- Replace
wallpapers/satisfaction_hires_final.pngwith your image - Or edit
sway/configline 65 to point to a different path - For the lock screen wallpaper, check
swaylock/config
- System UI font: Change
IBM Plex Sans SmBldin:sway/configline 10gtk-3.0/settings.ini→gtk-font-namegtk-4.0/settings.ini→gtk-font-namerofi/config.rasi→font:fontconfig/conf.d/99-user-fonts.conf
- Monospace font: Change
FiraCode Nerd Fontin:kitty/kitty.confline 6waybar/style.cssline 4fontconfig/conf.d/99-user-fonts.conf
- Run
fc-cache -fvafter changing fontconfig
Edit kitty/kitty.conf line 20:
background_opacity 0.95 # 0.0 = fully transparent, 1.0 = opaque
Edit the timeout values in sway/idle.sh. The current values are:
- Dim: 180s (3 min)
- Lock: 300s (5 min)
- DPMS off: 600s (10 min)
- Suspend: 900s (15 min)
- Add the module name to
modules-left/center/rightinwaybar/config - Add module configuration in the same file
- Add CSS styling in
waybar/style.css
Edit ly/config.ini and ly/set-tty-theme.sh. The PAM file at ly/pam controls authentication.
⚠️ Be careful editing PAM files. A misconfigured PAM stack can lock you out of your system. Always keep a root shell open when testing PAM changes.
- Color Scheme: Based on Tokyo Night by enkia
- Icon Theme: TokyoNight-SE (YAMIS enlarged variant)
- GTK Theme: adw-gtk3-dark
- Cursor Theme: Breeze
- Wallpaper Art: Hatsune Miku "Satisfaction" illustration
Built with 💙 on Arch Linux · Maintained by @sea-deep
