Create a project from a versioned git template. Update it to every new version with a real three-way merge. One Rust binary, no Python.
$ rootstock update markers src/config.rs updated to v1.3.0 $ echo $? 2 $ git diff --stat .github/workflows/ci.yml | 6 ++++-- Cargo.toml | 2 +- src/config.rs | 10 ++++++---- $ sed -n 12,16p src/config.rs <<<<<<< project timeout: Duration::from_secs(30), ======= timeout: Duration::from_secs(10), retries: 3, >>>>>>> template v1.3.0
Written in Rust. Linux, macOS and Windows. It needs only git on PATH.
A three-way merge through git merge-file. Only edits that truly overlap become conflicts.
Every case that needs a person is a conflict and exit code 2. CI only has to read the code.
How updates work
The old and the new template versions are both rendered with the project's answers, and only the difference is merged into the project.
Compared
| rootstock | Copier | cargo-generate | kickstart | |
|---|---|---|---|---|
| Runtime | single binary | Python | single binary | single binary |
| Templates | Jinja (minijinja) | Jinja2 | Liquid | Tera |
| Updates generated projects | three-way | three-way | ✗ creation only | ✗ creation only |
| Conflicts as an exit code | 2 | ✗ markers only | — | — |
Checked in October 2026.
Coming from Copier
Converts a Copier template, a Copier-generated project, or both in one run. It writes nothing unless the whole conversion succeeds, and old template tags are read as they are.
Install
Every release lists the checksums in SHA256SUMS. rootstock needs git on PATH.