My personal configuration files for Linux and macOS.
This repo has evolved over time as I've switched between different setups. Here's what's actively maintained:
- hyprland - Tiling compositor config, migrated from i3-gaps
- waybar - Status bar with emoji icons
- foot - Minimal terminal emulator
- wofi - Application launcher
- mako - Notification daemon
- hyprlock - Lock screen
- hypridle - Idle management
- i3 / i3-gaps - Tiling window manager configs
- polybar - Status bar
- picom - Compositor for transparency and effects
- X11 - Xresources and other X11 bits
- aerospace - Tiling window manager for macOS
- zsh - Shell configuration
- bash - Bash configs (mostly unused now)
- tmux - Terminal multiplexer with project switcher scripts
- neovim - Text editor config
- git - Git configuration with GPG commit signing
- gnupg - GPG agent config with graphical pinentry
- fonts - Custom fonts
- opencode - OpenCode AI assistant config
I use GNU Stow to manage symlinks for configurations I need.
# Install Hyprland configs
stow -t ~ hyprland
# Install waybar
stow -t ~ waybar
# Install multiple at once
stow -t ~ zsh tmux neovim footstow -t ~ -D hyprlandMy Hyprland config is split into multiple files for organization:
hyprland.conf- Main config, monitor settings, input devicestheme.conf- Colors, gaps, borders, visual stuffkeybinds.conf- All keyboard shortcuts (uses Alt as mod key, like i3)rules.conf- Window rulesautostart.conf- Programs to launch on startup
I use per-device input config to handle natural scroll differently:
- Touchpad: natural scroll ON (swipe down = scroll down)
- External mouse: natural scroll OFF (wheel down = scroll down)
Uses wildcard matching (*touchpad*, *mouse*) so it works across different hardware.
I use Liberation Mono as my primary terminal font, with Noto Color Emoji as fallback for emoji rendering. Waybar uses the same font stack so everything looks consistent.
I have a couple of scripts that make working with tmux and projects way easier:
Fuzzy-finds projects in ~/src and opens them in tmux sessions. Each project gets its own named tmux session.
# Launch fzf to pick a project
proj
# Jump directly to a project (if there's only one match)
proj dotfiles
# Search with a query
proj hyprIn tmux, use Ctrl-b Ctrl-p to open the project switcher in a new window.
It's smart about session names - if you have multiple projects with the same name in different directories, it'll use abbreviated paths to keep them unique.
Put this in your shell config (zsh/bash) to automatically attach to a "main" tmux session when you open a terminal:
source tmux-loopWhen you close the tmux session (kill the shell), it closes the terminal too. But if you detach manually with Ctrl+b d, you drop back to a normal shell. Basically makes tmux feel more integrated.
sudo pacman -S hyprland waybar foot bemenu bemenu-wayland \
j4-dmenu-desktop mako hyprlock hypridle swww polkit-gnomesudo pacman -S noto-fonts-emoji ttf-liberation-mono ttf-dejavu \
ttf-nerd-fonts-symbols-monosudo pacman -S brightnessctl wireplumber pipewire pipewire-pulse \
grim slurp wl-clipboard pavucontrol jqsudo pacman -S tmux zsh neovim fzfGit commits are automatically signed with GPG. The pinentry config uses terminal-based prompts on Linux and native GUI on macOS.
# Linux - terminal-based passphrase entry
sudo pacman -S pinentry
# macOS - graphical passphrase entry
brew install pinentry-macAfter installing, stow the gnupg config:
stow -t ~ gnupgThe gpg-agent caches passphrases for 1 hour by default (2 hours max).
# Network manager applet
sudo pacman -S network-manager-applet- Arch Linux - Primary platform, everything works
- macOS - Aerospace config for tiling, terminal stuff works
- Other distros - Should work but might need package name adjustments