Every machine I set up used to be an imperative pile: a dotfiles repo with an install script, a list of brew install commands, and a few curl | sh lines that had accreted. The trouble with a pile of steps is that it only tells you what to do, never what you will have. The only way to learn the real state of a machine was to run the whole thing and see what broke, and the machine I ended up on rarely matched the one I thought I had configured.

kempt is the tool I wrote for that. It is declarative machine setup you can read before you run: a single manifest describes the software and files a machine should have, and kempt shows you exactly what it would change before it changes anything.