Cross-platform dotfiles for Ubuntu/WSL, Fedora/Bazzite, Arch/Omarchy and macOS, organized as GNU Stow packages.
- Repository structure
- Requirements
- Quick start (recommended)
- Manual usage with Stow
- Package lists
- Notes
- Setup guides
Most top-level folders are a Stow package: running stow <package> symlinks
its contents into $HOME, preserving the internal directory layout.
packages/, scripts/, docs/ and system/ are the exceptions — plain
utility/reference dirs, not linked by Stow.
dotfiles/
├── bash/ # .bashrc + .inputrc + .config/bash/*.sh modules (alternative shell)
├── starship/ # .config/starship.toml (prompt shared by bash and zsh)
├── zsh/ # .zshrc (slim loader) + .config/zsh/*.zsh modules
├── git/ # .gitconfig + .config/git/ignore
├── nvim/ # .config/nvim/ (LazyVim distribution)
├── tmux/ # .config/tmux/tmux.conf
├── lazygit/ # .config/lazygit/config.yml (terminal UI for git)
├── shell/ # .profile
├── claude/ # .claude/ (Claude Code settings, agents, global CLAUDE.md; shared across profiles)
├── vscode/ # settings.json (symlinked per-OS by a script)
├── wsl/ # .wslconfig (copied to the Windows profile on WSL)
├── packages/ # package lists (brew/apt/dnf/node/vscode extensions)
├── scripts/ # bootstrap + install/sync helpers
│ ├── lib/ # shared utilities (log, os_detect, sudo keep-alive…)
│ └── modules/ # one installable/optional step per file, sourced by bootstrap.sh
├── system/ # non-$HOME system files (/etc/…), installed by a script, not Stow
├── docs/ # setup guides (macOS, shell, git/ssh, lazygit, …)
└── README.md
The zsh config is modular: zsh/.zshrc is a slim loader that sources focused
files from ~/.config/zsh/ (exports, path, plugins, completion,
history, keybindings, aliases, functions, integrations). See
docs/shell-and-dotfiles.md.
git and stow (the bootstrap installs stow for you if missing):
sudo apt install git stow # Ubuntu/WSL
sudo dnf install git stow # Fedora (Bazzite ships both in the base image)
sudo pacman -S git stow # Arch/Omarchy
brew install git stow # macOSClone the repo and run the single bootstrap entry point. It detects the OS,
installs base packages, stows the config packages, syncs VS Code, installs
global node packages, and applies OS-specific extras (macOS defaults / WSL
.wslconfig).
git clone git@github.com:savaf/dotfiles.git ~/dotfiles
cd ~/dotfiles
./scripts/bootstrap.shThe bootstrap backs up any conflicting real files to
~/.dotfiles-backup/<timestamp>/ before linking.
To link (or unlink) individual packages yourself:
cd ~/dotfiles
stow bash zsh git starship nvim tmux shell lazygit claude # link everything
stow nvim # link just one package
stow -D nvim # unlink (remove symlinks)
stow -R zsh # restow (refresh) after changesReproducible package manifests live in packages/:
xargs brew install < packages/brew-cli.txt # macOS CLI
xargs brew install --cask < packages/brew-casks.txt # macOS apps
sudo xargs -a packages/apt-cli.txt apt install -y # Ubuntu/WSL CLI
grep -v '^#' packages/dnf-cli.txt | xargs sudo dnf install -y # Fedora CLI (Bazzite: rpm-ostree install)
grep -v '^#' packages/pacman-cli.txt | xargs sudo pacman -S --needed # Arch/Omarchy CLIVS Code settings (vscode/settings.json) are symlinked to the OS-specific
location by scripts/sync-vscode-settings.sh, and extensions are installed from
packages/vs-extensions.txt. See docs/vscode.md.
- WSL
.wslconfigis read by Windows from your Windows user profile, not the Linux$HOME. The bootstrap copies it toC:\Users\<you>\.wslconfig; apply changes withwsl --shutdown. - Prompt: Starship, configured in
starship/.config/starship.toml. - lazygit: launch with
lzg. See docs/lazygit.md.
Step-by-step guides for a fresh machine live in docs/:
| Guide | What it covers |
|---|---|
| shell-and-dotfiles.md | zsh modules, prompt, and applying the dotfiles with Stow |
| ubuntu-wsl.md | Ubuntu & WSL2 setup from scratch (incl. .wslconfig, fonts) |
| bazzite.md | Fedora & Bazzite (immutable) setup — dnf / rpm-ostree |
| omarchy.md | Arch & Omarchy (Hyprland) setup — pacman, default shell (zsh), bash alternative |
| macos-setup.md | macOS system preferences, apps, Homebrew, iTerm2 |
| git-and-ssh.md | Git defaults and GitHub SSH key setup |
| nodejs.md | Node.js via nvm and global modules |
| vscode.md | VS Code settings and extensions |
| nvim.md | Neovim (LazyVim) setup, requirements and basics |
| tmux.md | tmux prefix, panes/windows and copy mode |
| lazygit.md | lazygit keybindings and workflows |
| hardware.md | My machines, for reference |
| storage.md | Games / LIBRARY disks: fstab, mountpoints, Kavita |