Dotfiles Management
chezmoi, yadm, GNU Stow — sync your shell config across machines.
If you SSH into many boxes, or work across laptop / desktop / dev VM, you want your dotfiles in a repo and applied automatically.
The candidates
- ★ chezmoi — Go binary; templating + secrets + per-machine variations + diffs. The default in 2026.
- ★ GNU Stow — symlink manager; minimal; old-school. Default for "I just need symlinks."
- yadm — bare git repo for
$HOME; simple. - dotbot — Python; declarative YAML; popular.
- rcm — Thoughtbot's dotfile manager.
- homemaker — Go; YAML config.
What chezmoi does well
- Templates — same
~/.gitconfigtemplate, differentuser.emailper machine. - Encrypted secrets — gopass / age / 1Password / Bitwarden integration.
- Per-machine — config differs by hostname / OS / arch.
- Dry-run + diff — see what would change before applying.
- One install command to bootstrap on a new box.
What Stow does well
- Tiny, no dependencies. Just symlinks.
- Per-package management —
stow vimsymlinks~/dotfiles/vim/.vimrcinto~. - No templating — pure mirroring.
- Best for small, single-user setups.
What yadm does well
- Just bare git — no learning curve if you know git.
- Encrypts files with age or gpg.
- OS / hostname detection for conditional behavior.
What to put in dotfiles
.zshrc/.bashrc/.profile/.config/fish/config.fish.gitconfig/.gitignore_global.tmux.conf/.config/zellij/.config/starship.toml.config/nvim//.vimrc.config/helix/.ssh/config(without keys).config/ghostty// Alacritty / kitty configs~/.config/git/- Brewfile /
mise.toml/ Homebrew bundle for installed packages
What NOT to put
- Private keys — use age / gpg encryption or 1Password integration if you must.
- Long-lived API tokens — same.
- Things specific to one project — those belong in the project repo.
Common bootstrap pattern
The repo's chezmoi.toml then handles per-machine variations on every chezmoi apply.
Tooling that pairs well
- mise / asdf — runtime versions per-project; pair with dotfiles for shell init.
- Homebrew Bundle /
brew bundle— install packages declaratively. apt-list /dnfhistory + Ansible — for system-level packages.devbox/nix-darwin— for declarative dev envs.
Patterns to adopt
- ★ Public dotfiles repo. Public-by-default forces you to keep secrets out and is a great form of "knowledge sharing." Famous engineers' public dotfiles teach a lot.
- Templates over conditionals.
{{ .email }}per machine is cleaner thanif hostname == "work-laptop". - Auto-sync on shell start — some folks
chezmoi updateweekly via cron. - Document non-obvious entries. Future-you will appreciate.
- Don't dotfile what mise / Homebrew already manages.
tool-versionsand Brewfiles are the right place for those.
Pick this if…
- Default modern dotfiles: chezmoi.
- Minimal, just symlinks: GNU Stow.
- You only know git: yadm.
- Already managing a Mac fleet: chezmoi + Brewfile + mise.