Arch Linux development environment managed with GNU Stow. One repo, multiple machines, unified theming.
-
Clone this repository to your home directory:
git clone https://github.com/StephenGunn/dotfiles.git ~/dotfiles cd ~/dotfiles
-
Clone the theme-switcher (separate project):
git clone https://github.com/StephenGunn/theme-switcher.git ~/projects/theme-switcher -
Run setup:
./scripts/install.sh # Install packages (core + host-specific) ./link.sh # Create symlinks + host configs + theme-switch ./scripts/install_nerd_fonts.sh # Install Nerd Fonts ./scripts/restore_systemd_services.sh # Restore systemd user services ./scripts/configure_hyprpanel.sh # Setup HyprPanel
- Git
- GNU Stow
- Hyprland — Wayland compositor (Lua config)
- HyprPanel — AGS-based desktop panel (primary)
- QuickShell — Qt6 shell components
- Waybar — Status bar (secondary/fallback)
- Rofi — Application launcher + custom menus
- Dunst — Notification daemon
- Hyprlock / Hypridle — Lock screen & idle management
- Fish — Primary shell with vi keybindings, custom aliases, Starship prompt
- Ghostty — Default terminal emulator
- Alacritty, Kitty, Wezterm — Alternative terminals
- Tmux — Terminal multiplexer
- Neovim — Primary editor (lazy.nvim, LSP)
- Lazygit — Git TUI (
ggalias) - Posting — HTTP client TUI
- Yazi — TUI file manager
- Thunar — GTK file manager (source of truth for bookmarks)
- Zoxide — Smarter
cd - fzf — Fuzzy finder
- Fastfetch — System info
- Looking Glass — GPU passthrough display client
- OBS Studio — Streaming/recording
- Waypaper — Wallpaper manager
The scripts/ directory contains setup and utility scripts:
| Script | Description |
|---|---|
install.sh |
Install packages from packages/core.md + packages/<hostname>.md |
install_nerd_fonts.sh |
Install Nerd Fonts for terminal icons |
configure_hyprpanel.sh |
Configure HyprPanel and set up autostart |
configure_sddm.sh |
Configure SDDM display manager |
setup_nvidia.sh |
NVIDIA GPU setup |
set_default_shell.sh |
Set default shell to Fish |
configure_system_defaults.sh |
Set XDG default applications |
clone_projects.sh |
Clone common project repos |
| Script | Description |
|---|---|
backup_systemd_services.sh |
Back up enabled user services |
restore_systemd_services.sh |
Restore user services from backup |
restore_system_services.sh |
Restore system-level services |
setup_systemd_backup_cron.sh |
Set up weekly automatic service backups |
| Script | Description |
|---|---|
rofi-audio-sink.sh |
Audio output device picker |
rofi-audio-source.sh |
Audio input device picker |
rofi-brightness.sh |
Display brightness control |
rofi-dev.sh |
Development project launcher |
rofi-vm.sh |
Virtual machine launcher |
rofi-streaming.sh |
Streaming mode controls |
| Script | Description |
|---|---|
streaming-mode.sh |
Toggle streaming mode |
streaming-scratchpad-daemon.sh |
Streaming scratchpad management |
streaming-widget-daemon.sh |
Streaming widget overlay |
display-toggle.sh |
Toggle displays on/off |
camera-control.sh |
Webcam controls |
webcam-expand.sh |
Expand webcam preview |
screenshot-save.sh |
Screenshot utility |
| Script | Description |
|---|---|
startup.sh |
Hyprland autostart script |
config.sh |
General tool configuration |
sync_bookmarks.sh |
Sync GTK bookmarks → Qt (one-way) |
gpu-monitor.sh |
GPU usage monitor |
hypr-theme-init.sh |
Initialize Hyprland theme on boot |
cmatrix-screensaver.sh |
CMatrix screensaver |
This repo supports multiple machines using hostname-based configs. A single branch serves all hosts.
| Hostname | Machine | Display |
|---|---|---|
jovian |
Desktop | Triple monitor (vertical + main + side) |
titan |
HP OMEN MAX 16" laptop | 2560x1600@240 |
surfarch |
Surface Pro 8 tablet | 2880x1920@120 |
streamcentre |
Streaming box | 1080p HDMI |
- Hyprland:
hosts/init.lualoadshosts/<hostname>.luaat runtime (monitors, workspaces, host-specific settings) - Hypridle:
link.shsymlinkshosts/hypridle-<hostname>.conf→hypridle.conf - Packages:
install.shreadspackages/core.md(all machines) +packages/<hostname>.md(machine-specific) - Colors:
conf/colors.lualoadscolors_override.lua(written by theme-switch), falls back to Catppuccin Mocha
-
Create host Hyprland config:
cp .config/hypr/hosts/jovian.lua .config/hypr/hosts/<hostname>.lua # Edit monitors and workspaces for your hardware
-
Create host hypridle config (optional):
cp .config/hypr/hosts/hypridle-jovian.conf .config/hypr/hosts/hypridle-<hostname>.conf
-
Create host packages (optional):
cp packages/jovian.md packages/<hostname>.md
-
Run setup:
./scripts/install.sh # Installs core.md + <hostname>.md ./link.sh # Links dotfiles + host-specific configs
dotfiles/
├── .config/
│ ├── hypr/
│ │ ├── hyprland.lua # Main Hyprland config (Lua)
│ │ ├── conf/ # Modular config
│ │ │ ├── appearance.lua
│ │ │ ├── autostart.lua
│ │ │ ├── colors.lua # Color palette (loads override)
│ │ │ ├── input.lua
│ │ │ ├── keybinds.lua
│ │ │ ├── streaming.lua
│ │ │ └── windowrules.lua
│ │ ├── hosts/ # Per-machine configs
│ │ │ ├── init.lua # Hostname dispatcher
│ │ │ ├── jovian.lua
│ │ │ ├── titan.lua
│ │ │ ├── surfarch.lua
│ │ │ └── streamcentre.lua
│ │ ├── colors_override.lua # Written by theme-switch
│ │ ├── hyprlock.conf
│ │ ├── hypridle.conf # Symlink → hosts/hypridle-<host>.conf
│ │ └── pyprland.toml
│ ├── fish/ # Shell config
│ ├── nvim/ # Neovim config
│ ├── ghostty/ # Default terminal
│ ├── hyprpanel/ # Desktop panel
│ ├── quickshell/ # Qt6 shell
│ ├── rofi/ # Launcher + menus
│ ├── looking-glass/ # GPU passthrough client
│ ├── obs-studio/ # Streaming/recording
│ ├── streaming/ # Streaming mode config
│ └── ... # alacritty, kitty, wezterm, dunst, etc.
├── packages/
│ ├── core.md # Shared packages (all machines)
│ ├── jovian.md
│ ├── titan.md
│ ├── surfarch.md
│ └── streamcentre.md
├── scripts/ # Setup & utility scripts
├── docs/ # Streaming, dev sessions, diagnostics
├── wallpapers/ # Wallpaper collection
├── link.sh # Stow linking + host config setup
└── grub/ # GRUB config
Unified theming via a separate theme-switcher project.
- Keybinding:
Super + T— opens theme selector - Command:
theme-switchortheme-switch <theme-name>
Ghostty, Neovim, Hyprland, HyprPanel, Rofi, Thunar (GTK), Yazi, Starship, Dunst, and wallpapers.
Theme-switch writes colors_override.lua which is loaded by conf/colors.lua at Hyprland reload. Each theme provides color definitions, terminal themes, panel configs, and wallpapers. See the theme-switcher repo for full documentation.
Source of truth: Thunar / GTK bookmarks (~/.config/gtk-3.0/bookmarks)
- Add in Thunar with
Ctrl+D, or edit the file directly - Sync to Qt apps:
./scripts/sync_bookmarks.sh(one-way) - Automatically used by Thunar, Firefox/Zen file dialogs, and GTK file choosers
CLAUDE.md— Instructions for Claude CodeSYSTEM_DEFAULTS.md— Default applications and XDG configBOOKMARKS_SYNC.md/GTK_BOOKMARKS.md— Bookmark sync documentationdocs/streaming-mode.md— Streaming mode setup and usagedocs/streaming-keybinds.md— Streaming keybinds referencedocs/DEV_SESSIONS.md— Dev session management