Tooling

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 ~/.gitconfig template, different user.email per 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 managementstow vim symlinks ~/dotfiles/vim/.vimrc into ~.
  • 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

# Install chezmoi + apply your dotfiles in one command
sh -c "$(curl -fsLS get.chezmoi.io)" -- init --apply your-github-username

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 / dnf history + 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 than if hostname == "work-laptop".
  • Auto-sync on shell start — some folks chezmoi update weekly via cron.
  • Document non-obvious entries. Future-you will appreciate.
  • Don't dotfile what mise / Homebrew already manages. tool-versions and 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.

On this page