grim
A grimoire for your machines. Declarative, cross-platform environment management in one Rust CLI.
One engine, your data
Section titled “One engine, your data”grim reads a grimoire — a repository of declarative configuration (a dotfiles repo is one) — and
casts it onto the current machine: installing packages across every package manager, rendering config
files from templates, and isolating per-platform install trees. The engine (grim) and your data (a
grimoire) stay separate, so the tool is reusable and your configuration is portable.
grim facts # probe the machine into typed Factsgrim stack # resolve the platform precedence stackgrim apply # render templates -> diff -> atomically place filesgrim packages # every package -> its resolved provider for this machineThe ideas
Section titled “The ideas” Platforms Named, precedence-ordered layers matched against machine facts. A dev container is just the top layer.
Apply A scoped MiniJinja templating + placement engine: render, diff, atomically write.
Packages One canonical name, many providers; the best one resolved for the current platform stack.
Secrets Optional, pluggable providers (1Password, age/sops, plain env). The core works with none.
Why it’s built this way
Section titled “Why it’s built this way”Every load-bearing choice is written down. See the decision records — separating the engine from the data, owning the file layer, banded platform precedence, and more.