Skip to content

Sets

A set is a named bundle of packages, files, and shell fragments. Each machine lists the sets it wants. That one indirection is what makes several Macs practical: your laptop takes core and web, the desktop takes core and work, and neither needs to know about the other’s tools.

sets/
core/
set.toml
shell/
10-path.zsh
99-dotfix-status.zsh
web/
set.toml
files/
gitconfig

set.toml declares the packages and the managed files:

description = "Base set, active on every machine"
[[files]]
source = "files/gitconfig"
target = "~/.gitconfig"
[packages]
brew = ["fzf", "htop", "ripgrep"]
cask = ["font-figtree"]
Terminal window
dotfix sets # list, marking the ones this machine uses
dotfix sets --enable web # add `web` to this machine
dotfix sets --disable web # remove it again

This writes to machines/<name>.toml, which also records anything this machine deliberately ignores.

Setting up your first Mac puts everything into core. That is a starting point, not a recommendation — the split is a judgement only you can make.

A practical order: leave the things every machine needs in core, then move whole toolchains out into their own set. Editing set.toml by hand is expected; there is no command that guesses the boundaries for you.