hey there! welcome to my personal configuration files. this is where i keep my linux setup tidy, organized, and ready to roll.
- quick start deployment
- what's inside
- getting started
- structure and usage
- packages overview
- dependencies
- switching to zsh
- hyprland setup
- managing dotfiles
- claude code configuration
- troubleshooting
- wsl2 compatibility
- license
this repo uses stow for selective package deployment. deploy only what you need.
sudo pacman -S stow # arch/cachyos
sudo apt install stow # ubuntu/debian
sudo dnf install stow # fedora
sudo zypper install stow # opensuse
brew install stow # macosdeploy individual packages based on your needs:
cd ~/dotfiles
# option 1: shell configs only
stow home
# option 2: desktop setup (window manager + status bar)
stow hyprland waybar
# option 3: complete setup (all three)
stow home hyprland waybar
# option 4: just editor config
stow claudecheck that symlinks were created:
ls -la ~/.bashrc ~/.config/hypr ~/.config/waybar ~/.gitconfig
# all should be symlinks pointing to ~/dotfiles/stow -D hyprland # unlink a package
stow -R home # recreate symlinks for a packagefor complete deployment guide, see managing dotfiles section.
- shell - bash and zsh with custom aliases, functions, and history handling
- terminal - configurations for wezterm, ghostty, kitty, and alacritty
- editor - neovim setup using lazy.nvim
- system tools - git, tmux, htop, btop, neofetch, starship prompt
- hyprland - wayland window manager configuration (HyDE Catppuccin Mocha theme)
- waybar - status bar configuration (HyDE-generated)
- claude - claude code editor global configuration
here's what each stow package provides and when to deploy it:
| Package | Contents | Deploy If | Command |
|---|---|---|---|
| home | bash, zsh, git, tmux, starship, aliases, functions | using shell configs | stow home |
| hyprland | window manager, keybindings, animations, themes | using hyprland wm | stow hyprland |
| waybar | status bar, modules, styling | using waybar bar | stow waybar |
| claude | claude code global config | using claude code | stow claude |
home/ - shell and system tool configs
- bashrc, zsh config with tool integrations (starship, zoxide, fzf)
- git config with user and aliases
- tmux configuration
- wezterm and terminal emulator configs
- 70+ shell aliases and helper functions
- starship prompt configuration
- history optimization and ssh agent management
hyprland/ - window manager and desktop environment
- hyprland.conf - main window manager configuration
- keybindings.conf - all keyboard shortcuts
- animations - multiple preset animation styles
- themes - colors and appearance (catppuccin mocha)
- window rules and layout configuration
- monitor configuration template
- works with omarchy theme system for notifications
waybar/ - system status bar
- config.jsonc - bar layout and enabled modules
- style.css and theme.css - styling and colors
- 25+ modules - clock, battery, network, audio, workspace, etc.
- auto-generated by HyDE wbarconfgen.sh
- restart required after configuration changes
claude/ - editor configuration
- CLAUDE.md - global instructions for claude code
- agent configurations
- plugin configurations
- sensitive files managed locally (not synced)
git clone https://github.com/semyonfox/dotfiles.git ~/dotfiles
cd ~/dotfiles
./install.shthe installer will:
- detect your OS (arch, ubuntu, fedora, macos, wsl2)
- prompt you for each step:
- install dependencies? (core tools + CLI tools)
- install optional CLI tools? (thefuck, pyenv)
- deploy dotfiles with stow?
- switch to zsh?
- install zsh enhancements? (oh-my-zsh - asked when switching to zsh)
- backup any conflicting files automatically
- safe to re-run if something fails
installation flow:
1. Install dependencies? (y/n)
-> installs: zsh, git, tmux, neovim, stow, eza, bat, fd, ripgrep, etc.
2. Install optional CLI tools? (y/n)
-> thefuck, pyenv
3. Deploy dotfiles? (y/n)
-> creates symlinks with stow
4. Switch to zsh? (y/n)
-> if yes, asks: install oh-my-zsh? (y/n) [y]
-> changes default shell
if you prefer to run things separately:
./install-deps.sh # just install packages
./setup.sh # just deploy dotfiles
./switch-to-zsh.sh # just switch shell# install stow first, then:
git clone https://github.com/semyonfox/dotfiles.git ~/dotfiles
cd ~/dotfiles
stow homewhen you run ./install.sh or stow home, these configs are symlinked:
shell configs:
- bash:
.bashrc,.bash_aliases,.bash_functions,.bash_profile,.profile - zsh:
.zshrc,.zsh_aliases,.zsh_functions,.zprofile
application configs:
- git:
.gitconfig - tmux:
.tmux.conf - terminal:
.wezterm.lua - hyprland:
.config/hypr/(window manager) - waybar:
.config/waybar/(status bar) - other:
.config/btop,.config/ghostty,.config/htop,.config/kitty,.config/neofetch,.config/starship.toml
this repo uses GNU Stow for symlink management:
- home/ - package containing all dotfiles (
.bashrc,.config/nvim, etc.) - when you run
stow home, it creates symlinks in~that point to files inhome/ - example:
home/.bashrc→~/.bashrc
core tools (always installed):
zsh- modern shell with powerful featuresgit- version controltmux- terminal multiplexerneovim- modern vim-based editorstow- symlink manager for dotfilescurl,wget- download tools
modern cli tools (always installed):
eza- modern replacement for lsbat- cat with syntax highlightingfd- modern find alternativeripgrep- faster grepfzf- fuzzy finderzoxide- smarter cd commandstarship- customizable prompt
optional (prompted during install):
oh-my-zsh- zsh plugin frameworkthefuck- command correction toolpyenv- python version managertpm- tmux plugin manager (auto-installed)
terminal emulators (configs included, manual install):
- wezterm - config:
.wezterm.lua - ghostty - config:
.config/ghostty/ - kitty - config:
.config/kitty/ - note: these are skipped in wsl2 (use windows terminal)
after running the setup scripts, you may want to install:
-
terminal emulator (if not using wsl2)
-
nerd font for icons in terminal
# arch sudo pacman -S ttf-jetbrains-mono-nerd # ubuntu/debian mkdir -p ~/.local/share/fonts cd ~/.local/share/fonts curl -fLO https://github.com/ryanoasis/nerd-fonts/releases/download/v3.1.1/JetBrainsMono.zip unzip JetBrainsMono.zip && rm JetBrainsMono.zip fc-cache -fv
-
tmux plugins (after setup)
- open tmux and press
prefix + I(ctrl-b then I) - tpm will install configured plugins automatically
- open tmux and press
want to use zsh instead of bash? we've got you covered:
-
install zsh
sudo pacman -S zsh zsh-completions
-
switch your default shell
./switch-to-zsh.sh
or manually:
chsh -s $(which zsh) -
log out and log back in for the changes to take effect
the zsh configs mirror all the bash functionality with zsh-specific improvements like better completion and shared history across sessions.
if you're on omarchy or using hyprland, these dotfiles include a complete hyprland + waybar configuration based on the HyDE framework with Catppuccin Mocha theme.
you can deploy any combination of packages independently:
cd ~/dotfiles
# deploy individual packages
stow home # shell configs (bash, zsh, git, tmux, etc.)
stow hyprland # hyprland window manager configuration
stow waybar # waybar status bar configuration
stow claude # claude code global configuration
# deploy multiple packages at once
stow home hyprland waybar
# remove deployments if needed
stow -D hyprland # unlink just hyprland
stow -R hyprland # recreate hyprland symlinkshyprland/ - window manager and related configs
- hyprland.conf - main window manager configuration
- keybindings.conf - all keyboard shortcuts
- animations.conf and animations/ - animation presets
- windowrules.conf - window-specific behavior rules
- themes/ - color and appearance settings
- monitors.conf - display configuration (initially empty for user setup)
- userprefs.conf - user customization overrides
waybar/ - system status bar
- config.jsonc - bar layout, modules, and settings
- style.css and theme.css - bar appearance
- modules/ - individual module configurations
the mako notification daemon uses a symlink to omarchy's theme system:
~/.config/mako/config -> ~/.config/omarchy/current/theme/mako.ini
this is intentional. notifications stay in sync with your system theme through omarchy, while hyprland configuration is managed independently through these dotfiles. they work together without conflict.
-
ensure stow is installed:
sudo pacman -S stow # or use your distro's package manager -
decide which packages you need:
- shell configs only:
stow home - full desktop setup:
stow home hyprland waybar - just window manager:
stow hyprland - just status bar:
stow waybar
- shell configs only:
-
deploy from dotfiles directory:
cd ~/dotfiles stow home hyprland waybar # example: deploy all three
-
verify symlinks were created:
ls -la ~/.bashrc ~/.config/hypr ~/.config/waybar # should show symlinks pointing to ~/dotfiles/
-
for hyprland, reload config (auto-reloads on save, or):
hyprctl reload
-
for waybar, restart after any changes:
killall waybar waybar &
- HyDE (HyprDots) - hyprland framework and catppuccin mocha theme
- Omarchy - theme management system integration
for detailed configuration information, see hyprland/README.md and waybar/README.md.
list all packages in this repo:
cd ~/dotfiles
ls -d */ # shows: home/ hyprland/ waybar/ claude/ lib/deploy only what you need:
cd ~/dotfiles
# deploy just home (shell configs)
stow home
# deploy just hyprland and waybar (desktop)
stow hyprland waybar
# deploy everything
stow home hyprland waybar claude
# remove a package (unstow)
stow -D hyprland
# verify what would be deployed (dry-run)
stow -n home # show what would be symlinked
stow -n -v home # show with detailsto add a new configuration file:
# 1. copy file into package directory (maintaining directory structure)
cp ~/.newconfig home/.newconfig
# or for hyprland:
cp ~/.config/hypr/newfile.conf hyprland/.config/hypr/newfile.conf
# 2. deploy the package (creates symlink)
cd ~/dotfiles
stow home
# 3. verify symlink was created
ls -la ~/.newconfig # should show it's a symlink to home/.newconfigjust edit files directly. changes take effect immediately since they're symlinked:
nano ~/dotfiles/home/.bashrc
# the file at ~/.bashrc is also updated (it's a symlink)# unstow (remove symlinks) for a package
stow -D home # removes home package symlinks
stow -D hyprland # removes hyprland package symlinks
# restow (recreate symlinks)
stow -R home # delete and recreate all symlinks for home# see what conflicts exist
stow -n home 2>&1 | grep conflict
# check existing symlinks
ls -la ~/.bashrc ~/.config/hypr ~/.config/waybar
# verify stow installation
stow --versionthese scripts automate common tasks:
install.sh- unified installer (recommended first-time setup)install-deps.sh- standalone dependency installersetup.sh- standalone stow deployment with backupsswitch-to-zsh.sh- switch default shell to zsh
if you use claude code, there's a separate claude/ package with global instructions and configuration:
stow claudethis creates symlinks for:
~/.claude/CLAUDE.md- global instructions for claude code~/.claude/agents/- agent configurations (local)~/.claude/plugins/- plugin configurations (local)
sensitive files (.claude.json, .credentials.json, cache, history) are gitignored and managed locally.
each project can override the global instructions by adding a CLAUDE.md at its root. see claude/README.md for details.
conflict errors when stowing?
# backup existing configs first
mkdir -p ~/backup
mv ~/.bashrc ~/.gitconfig ~/.tmux.conf ~/backup/
# then try stowing again
stow homecheck if symlinks are working:
# verify all symlinks are valid
for file in .bashrc .gitconfig .tmux.conf .wezterm.lua; do
if [ -L ~/"$file" ]; then
echo "$file: symlinked to $(readlink ~/$file)"
else
echo "$file: not a symlink"
fi
donerestore original configs:
cd ~/dotfiles
stow -D home # remove all symlinks
cp ~/backup/* ~/ # restore from backupthese dotfiles are fully compatible with wsl2 (windows subsystem for linux). the setup scripts automatically detect wsl2 and adjust accordingly.
-
install wsl2 with ubuntu/debian/arch
# in powershell (windows) wsl --install -d Ubuntu # or for arch: wsl --install -d Arch
-
install dotfiles in wsl
# inside wsl terminal git clone https://github.com/semyonfox/dotfiles.git ~/dotfiles cd ~/dotfiles ./install.sh # automatically detects wsl2 and adjusts
what works:
- all shell configurations (bash/zsh)
- all cli tools (eza, bat, fd, zoxide, starship, etc.)
- tmux with full functionality
- neovim and all editor configs
- git configurations
what's different in wsl2:
- terminal emulators: use windows terminal instead of wezterm/ghostty/kitty
- install from microsoft store:
winget install Microsoft.WindowsTerminal - configs for linux terminal emulators are skipped automatically
- install from microsoft store:
- gui applications: require x server (vcxsrv/x410) or use wslg (built-in on windows 11)
- systemd: available on ubuntu 22.04+ in wsl2, may need enabling
wsl2 optimizations:
-
configure .wslconfig (optional, on windows side) create
C:\Users\YourName\.wslconfig:[wsl2] memory=8GB # limit memory usage processors=4 # limit cpu cores swap=2GB localhostForwarding=true
-
configure wsl.conf (optional, in wsl) edit
/etc/wsl.conf:[boot] systemd=true # enable systemd (ubuntu 22.04+) [interop] appendWindowsPath=false # optional: don't pollute PATH with windows dirs [network] generateResolvConf=true
-
windows terminal integration
- configs are symlinked and work immediately
- starship prompt works perfectly in windows terminal
- font recommendation: install a nerd font (jetbrains mono nf, fira code nf)
-
performance tips
- keep project files in linux filesystem (
~/projects) not windows (/mnt/c/) - use git from linux, not windows
- wsl2 has near-native linux performance when files are in
~
- keep project files in linux filesystem (
known issues:
- clipboard integration: install
xclipor use windows terminal's native clipboard - some aliases reference
pacman(arch-specific) - they'll error on ubuntu/debian (harmless) .wezterm.luaconfig exists but wezterm should be run on windows side, not in wsl
recommended setup:
# 1. install windows terminal
# 2. set default profile to your wsl distro
# 3. install a nerd font in windows
# 4. run the dotfiles setup as shown above
# 5. configure windows terminal to use installed fontfor more wsl2 help: https://learn.microsoft.com/en-us/windows/wsl/
mit - feel free to fork this, steal code, or learn from my messy experiments.
big thanks to these folks for some great inspiration: