Comparisons¶
See below how pyrig compares to other tools.
Legend: ✅ yes · ➖ partial (see cell for how) · ❌ no · — not applicable (no such mechanism exists at all)
| Feature | pyrig | Cookiecutter | Copier | cruft | PyScaffold | Nitpick | projen |
|---|---|---|---|---|---|---|---|
| Keeps itself in sync automatically — no manifest or template file to maintain, nothing to remember to re-run | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Never overwrites or removes what you've already changed | ➖ resets values it declares as required if you hand-edit them | — | ➖ 3-way merge; unresolved conflicts need manual fixing | ➖ diff-merge with skip globs; leftovers become .rej files |
➖ untouched files only; can't remove a feature once added | ➖ only touches keys declared in the style file | ➖ direct edits are disallowed by design, not preserved |
| Ships linting, formatting, type checking, and tests configured out of the box | ✅ | ➖ only if the chosen template includes it | ➖ only if the chosen template includes it | ➖ inherits whatever the underlying Cookiecutter template includes | ➖ ships tox/pre-commit scaffolding, not preconfigured linters | ➖ via opt-in presets (black, flake8, isort, mypy, …) | ➖ depends on the project type and components chosen |
| Generates CI/CD pipelines | ✅ | ➖ only if the chosen template includes it | ➖ only if the chosen template includes it | ➖ inherits whatever the underlying Cookiecutter template includes | ➖ via an opt-in extension (e.g. --cirrus), not by default |
➖ has a GitHub Actions preset, but only enforces declared keys | ➖ for supported project types only |
| Generates GitHub repo protection rules | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Gives your project a working CLI, maintained automatically | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Generates and maintains test-file skeletons that mirror your source code | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Customized by writing code, not flags, prompts, or template edits | ✅ | ➖ hook scripts run at generation time, not ongoing | ➖ hook/migration scripts run at generation time, not ongoing | ➖ inherits Cookiecutter's hook scripts, still one-shot | ❌ | ❌ | ✅ |
| Has a plugin/extension ecosystem for adding new capabilities, not just per-project tweaks | ✅ | ➖ custom Jinja extensions only, no formal package ecosystem | ➖ custom Jinja extensions only, no formal package ecosystem | ❌ | ✅ | ❌ | ✅ |
| Takes input (prompts or flags) to customize content at generation time | ❌ | ✅ | ✅ | ✅ | ✅ | — | ❌ |
| Shows what changed as part of updating an existing project | ❌ | — | ✅ | ➖ as a git-style merge diff, not a structured 3-way summary | ❌ | ✅ | ❌ |
| Removes settings that become obsolete between versions | ❌ | — | ✅ | ➖ via diff/merge, unless the file is in the skip list |
❌ | ❌ | ✅ |
Ratings reflect each tool's built-in, documented mechanisms — a template author using a first-class feature like a hook script or preset counts — not a hypothetical amount of custom scripting layered on top to route around a tool's actual limits.
For the full story behind pyrig's own "➖", see How Merging Works.
For pyrig's own trade-offs, see Drawbacks.