Statemate manages dotfiles, system configuration, and packages declaratively. You
describe what your machines should look like in a git repository; mate apply
makes it so.
~/dotfiles/
mate.yaml sources, profiles, packages, hooks
zsh/.zshrc → ~/.zshrc
git/.config/git/config#template → ~/.config/git/config, rendered per machine
ssh/.ssh/config#encrypted → ~/.ssh/config, decrypted
arch/etc#owner-r:root/keyd/… → /etc/keyd/…, owned by root
nvim/.mate.yaml packages: { common: [neovim] }
nvim/.matescripts/
70-plugins.sh#monthly#after run after applying, once a month
Stow-style sources. One directory per tool, deployed relative to your home
directory or anywhere else.
Knows which side changed. Two hashes per file tell your edit in the
repository apart from an application rewriting its own config, so nothing is
overwritten silently.
One repository, many machines. Auto-detected profiles pick sources, files,
variables, and packages per machine.
Templates and secrets. Go templates with sprig, age encryption, and
Bitwarden references cached locally.
Packages. Homebrew, pacman, and the AUR, declared next to the config they
belong to.
Scripts and hooks. Run setup once, on a schedule, or when particular files
change.
System files./etc and friends, with ownership and sudo handled for you.
mateinit# create or register a repository
mateadd~/.zshrc# bring a file under management
mateedit~/.zshrc# edit its source
matestatus# what would change
matediff# how it would change
mateapply# make it so
matedoctor# check the setup