{"adoption": {"forks": 101, "observed_at": "2026-08-28T04:05:07.626458+00:00", "stars": 1585}, "canonical_url": "https://ross.abutalabs.com/products/cruft", "card": {"archived": false, "artifact_type": "cli-tool", "description": "Allows you to maintain all the necessary cruft for packaging and building projects separate from the code you intentionally write. Built on-top of, and fully compatible with, CookieCutter.", "domain": ["developer-tools", "web-development"], "enriched": true, "function": ["cli", "templating", "boilerplate", "build-tool", "developer-tools"], "health_score": 30, "homepage": "https://cruft.github.io/cruft/", "language": "Python", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["cruft/cruft"], "name": "cruft/cruft", "platform": ["python", "cli", "cross-platform"], "pushed_at": "2024-12-25T14:07:35+00:00", "repo": "cruft/cruft", "stars": 1585, "tags": ["cookiecutter", "project-templates", "template-sync", "scaffolding", "project-scaffolding", "automation"], "topics": ["python", "cruft", "python3", "cookiecutter", "boilerplate", "templating", "quickly", "instantly"], "urls": [], "use_cases": ["scaffold a new python project from a cookiecutter template", "keep project boilerplate in sync with template updates", "check if a project is using the latest template version in CI", "update multiple projects when their shared template changes", "create projects from templates with interactive prompts"], "what_it_is": "Cruft is a Python CLI tool that creates projects from Cookiecutter templates and keeps them in sync with template updates over time. It is fully compatible with existing Cookiecutter templates and can validate template drift in CI pipelines.", "when_to_avoid": ["you only need one-off project generation without ongoing sync", "your templates are not Cookiecutter-based", "you need general-purpose templating beyond project scaffolding"], "when_to_choose": ["you maintain many projects generated from the same Cookiecutter template", "you want automated updates of boilerplate as the template evolves", "you need CI checks that projects stay in sync with their template"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/cruft", "repo": "cruft/cruft", "role": "main", "score": 23}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:05:07.626458+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T03:55:31.817135+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0c7be8da6c305c55bcc4f74e327de7eed650478f36327d02d78e94e1a99a5284", "fetched_at": "2026-08-28T04:05:07.626458+00:00", "kind": "readme", "missing": false, "url": "https://github.com/cruft/cruft"}, {"content_hash": "21509fb3f79f76f5385cebe2a69bafa52e78e7aaadbe381bdef34c1baf05a638", "fetched_at": "2026-08-29T11:26:13.493147+00:00", "kind": "homepage", "missing": false, "url": "https://cruft.github.io/cruft/"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:05:07.626458+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T03:55:31.817135+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0c7be8da6c305c55bcc4f74e327de7eed650478f36327d02d78e94e1a99a5284", "fetched_at": "2026-08-28T04:05:07.626458+00:00", "kind": "readme", "missing": false, "url": "https://github.com/cruft/cruft"}, {"content_hash": "21509fb3f79f76f5385cebe2a69bafa52e78e7aaadbe381bdef34c1baf05a638", "fetched_at": "2026-08-29T11:26:13.493147+00:00", "kind": "homepage", "missing": false, "url": "https://cruft.github.io/cruft/"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T03:55:31.817135+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0c7be8da6c305c55bcc4f74e327de7eed650478f36327d02d78e94e1a99a5284", "fetched_at": "2026-08-28T04:05:07.626458+00:00", "kind": "readme", "missing": false, "url": "https://github.com/cruft/cruft"}, {"content_hash": "21509fb3f79f76f5385cebe2a69bafa52e78e7aaadbe381bdef34c1baf05a638", "fetched_at": "2026-08-29T11:26:13.493147+00:00", "kind": "homepage", "missing": false, "url": "https://cruft.github.io/cruft/"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:05:07.626458+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:05:07.626458+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:05:07.626458+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T03:55:31.817135+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0c7be8da6c305c55bcc4f74e327de7eed650478f36327d02d78e94e1a99a5284", "fetched_at": "2026-08-28T04:05:07.626458+00:00", "kind": "readme", "missing": false, "url": "https://github.com/cruft/cruft"}, {"content_hash": "21509fb3f79f76f5385cebe2a69bafa52e78e7aaadbe381bdef34c1baf05a638", "fetched_at": "2026-08-29T11:26:13.493147+00:00", "kind": "homepage", "missing": false, "url": "https://cruft.github.io/cruft/"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:05:07.626458+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:05:07.626458+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T03:55:31.817135+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0c7be8da6c305c55bcc4f74e327de7eed650478f36327d02d78e94e1a99a5284", "fetched_at": "2026-08-28T04:05:07.626458+00:00", "kind": "readme", "missing": false, "url": "https://github.com/cruft/cruft"}, {"content_hash": "21509fb3f79f76f5385cebe2a69bafa52e78e7aaadbe381bdef34c1baf05a638", "fetched_at": "2026-08-29T11:26:13.493147+00:00", "kind": "homepage", "missing": false, "url": "https://cruft.github.io/cruft/"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:05:07.626458+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:05:07.626458+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:05:07.626458+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T03:55:31.817135+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0c7be8da6c305c55bcc4f74e327de7eed650478f36327d02d78e94e1a99a5284", "fetched_at": "2026-08-28T04:05:07.626458+00:00", "kind": "readme", "missing": false, "url": "https://github.com/cruft/cruft"}, {"content_hash": "21509fb3f79f76f5385cebe2a69bafa52e78e7aaadbe381bdef34c1baf05a638", "fetched_at": "2026-08-29T11:26:13.493147+00:00", "kind": "homepage", "missing": false, "url": "https://cruft.github.io/cruft/"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:05:07.626458+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:05:07.626458+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T03:55:31.817135+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0c7be8da6c305c55bcc4f74e327de7eed650478f36327d02d78e94e1a99a5284", "fetched_at": "2026-08-28T04:05:07.626458+00:00", "kind": "readme", "missing": false, "url": "https://github.com/cruft/cruft"}, {"content_hash": "21509fb3f79f76f5385cebe2a69bafa52e78e7aaadbe381bdef34c1baf05a638", "fetched_at": "2026-08-29T11:26:13.493147+00:00", "kind": "homepage", "missing": false, "url": "https://cruft.github.io/cruft/"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T03:55:31.817135+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0c7be8da6c305c55bcc4f74e327de7eed650478f36327d02d78e94e1a99a5284", "fetched_at": "2026-08-28T04:05:07.626458+00:00", "kind": "readme", "missing": false, "url": "https://github.com/cruft/cruft"}, {"content_hash": "21509fb3f79f76f5385cebe2a69bafa52e78e7aaadbe381bdef34c1baf05a638", "fetched_at": "2026-08-29T11:26:13.493147+00:00", "kind": "homepage", "missing": false, "url": "https://cruft.github.io/cruft/"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T03:55:31.817135+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0c7be8da6c305c55bcc4f74e327de7eed650478f36327d02d78e94e1a99a5284", "fetched_at": "2026-08-28T04:05:07.626458+00:00", "kind": "readme", "missing": false, "url": "https://github.com/cruft/cruft"}, {"content_hash": "21509fb3f79f76f5385cebe2a69bafa52e78e7aaadbe381bdef34c1baf05a638", "fetched_at": "2026-08-29T11:26:13.493147+00:00", "kind": "homepage", "missing": false, "url": "https://cruft.github.io/cruft/"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T03:55:31.817135+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0c7be8da6c305c55bcc4f74e327de7eed650478f36327d02d78e94e1a99a5284", "fetched_at": "2026-08-28T04:05:07.626458+00:00", "kind": "readme", "missing": false, "url": "https://github.com/cruft/cruft"}, {"content_hash": "21509fb3f79f76f5385cebe2a69bafa52e78e7aaadbe381bdef34c1baf05a638", "fetched_at": "2026-08-29T11:26:13.493147+00:00", "kind": "homepage", "missing": false, "url": "https://cruft.github.io/cruft/"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 0, "longevity": 100, "rhythm": 8}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2537, "days_push": 616, "days_rel": 616, "gap_med": null, "n_releases_24m": 1}, "score": 23, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}