{"id":50901616,"url":"https://github.com/doublej/cookiecutter-templates","last_synced_at":"2026-06-16T03:04:35.294Z","repository":{"id":353102747,"uuid":"1145657895","full_name":"doublej/cookiecutter-templates","owner":"doublej","description":null,"archived":false,"fork":false,"pushed_at":"2026-04-22T12:32:01.000Z","size":164,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-22T14:27:02.524Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/doublej.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-30T03:51:24.000Z","updated_at":"2026-04-22T12:32:09.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/doublej/cookiecutter-templates","commit_stats":null,"previous_names":["doublej/cookiecutter-templates"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/doublej/cookiecutter-templates","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doublej%2Fcookiecutter-templates","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doublej%2Fcookiecutter-templates/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doublej%2Fcookiecutter-templates/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doublej%2Fcookiecutter-templates/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/doublej","download_url":"https://codeload.github.com/doublej/cookiecutter-templates/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/doublej%2Fcookiecutter-templates/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34388678,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-16T02:00:06.860Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-16T03:04:33.982Z","updated_at":"2026-06-16T03:04:35.289Z","avatar_url":"https://github.com/doublej.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Cookiecutter Templates\n\nProject templates organized by language and framework.\n\n## Templates\n\n### Python\n\n| Template | Description | Options |\n|----------|-------------|---------|\n| `python/fastapi` | FastAPI web API | `python_version` |\n| `python/flask` | Flask web application | `python_version` |\n| `python/cli` | Command-line tool (Click) | `python_version` |\n\n### TypeScript\n\n| Template | Description | Options |\n|----------|-------------|---------|\n| `typescript/node-api` | Elysia API server | `include_docker` |\n| `typescript/node-cli` | Commander CLI | -- |\n| `typescript/bun-package` | Bun package starter | -- |\n| `typescript/node-lib` | Library with declarations | -- |\n| `typescript/node-worker` | Background worker | `worker_type`, `include_docker` |\n| `typescript/sveltekit` | SvelteKit web app | `include_tracking` |\n| `typescript/react` | React SPA (Vite) | `include_tracking` |\n\n### Rust\n\n| Template | Description | Options |\n|----------|-------------|---------|\n| `rust/cli` | CLI tool (clap + anyhow) | -- |\n\n### Swift\n\n| Template | Description | Options |\n|----------|-------------|---------|\n| `swift/macos` | macOS SwiftUI app | `deployment_target` |\n| `swift/ios` | iOS SwiftUI app | `deployment_target` |\n\n### Android\n\n| Template | Description | Options |\n|----------|-------------|---------|\n| `android/quest-vr` | Native Quest VR app (C++17, OpenXR, Gradle+CMake, GameActivity) | `graphics_api`, `min_sdk_version`, `target_sdk_version` |\n\n## Usage\n\n```bash\n# Install cookiecutter\nuv tool install cookiecutter\n\n# Generate a project\ncookiecutter python/fastapi\ncookiecutter typescript/node-api\ncookiecutter typescript/bun-package\ncookiecutter rust/cli\ncookiecutter swift/macos\ncookiecutter android/quest-vr\n```\n\n## Quick Start\n\n### Python (uv)\n\n```bash\ncd my-project\nuv sync\nuv run uvicorn my_project.main:app --reload  # FastAPI\nuv run flask --app my_project.app run        # Flask\nuv run my-project hello                       # CLI\n```\n\n### TypeScript (bun)\n\n```bash\ncd my-project\nbun install\nbun run dev\n```\n\n### Rust (cargo)\n\n```bash\ncd my-project\ncargo build\ncargo run -- --help\n```\n\n### Swift (SPM)\n\n```bash\ncd MyProject\nswift build\nswift run\n```\n\n## Common Variables\n\nAll templates share these variables:\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `project_name` | Human-readable project name | varies |\n| `project_slug` | Directory/package name (auto-derived) | from `project_name` |\n| `description` | Short project description | varies |\n| `author` | Author name | \"Your Name\" |\n\n## Template Standards\n\n- Hooks are safe: no `git init`, no dependency installs, no commits\n- Pre-generation validation on `project_name` and `project_slug`\n- Unified `.gitignore` baseline across all templates\n- Every template includes a `README.md` with getting started instructions\n- Every template ships a `.claude/` SessionStart hook that notifies the agent when the upstream template has advanced\n\n## Versioning\n\nEvery `cookiecutter.json` has a private `_version` field (strict `MAJOR.MINOR.PATCH`, no pre-release suffixes). The version travels into each rendered project as `template_version` in `.template-meta.json`. A SessionStart hook compares local vs. upstream and nudges the agent when upstream is newer.\n\n```bash\n# Bump a template version\nuv run tools/bump_version.py python/fastapi patch     # 1.0.0 -\u003e 1.0.1\nuv run tools/bump_version.py python/fastapi minor     # 1.0.1 -\u003e 1.1.0\nuv run tools/bump_version.py python/fastapi major     # 1.1.0 -\u003e 2.0.0\n```\n\nBump semantics: `patch` for content tweaks/dep bumps, `minor` for additions (files, recipes, options), `major` for breaking scaffold changes. CI runs `sync_check.py --enforce-bumps` on every PR and fails if a template has file changes without a `_version` bump.\n\nOpt-out per generated project: `export NO_TEMPLATE_UPDATE_CHECK=1` or `touch .claude/no-template-update-check`.\n\n## Tools\n\n| Script | Description |\n|--------|-------------|\n| `tools/render_test.py` | Render and smoke-test all templates |\n| `tools/sync_check.py` | Validate file sync across template families (`--enforce-bumps` for CI) |\n| `tools/bump_version.py` | Bump `_version` in a template's cookiecutter.json |\n| `tools/update_scaffold.py` | Diff a rendered project against its source template and optionally `--apply` the delta |\n| `tools/test_update_check.py` | Offline test for the SessionStart update-check hook |\n| `tools/inject_tracking.py` | Inject Umami tracking into rendered projects |\n\n## Contributing\n\n1. Make changes to template files\n2. `uv run tools/bump_version.py \u003ctemplate\u003e {major|minor|patch}` — bump the template you changed\n3. `uv run tools/sync_check.py` — verify cross-family and in-family sync\n4. `uv run tools/render_test.py` — verify every template still renders\n5. `uv run tools/test_update_check.py` — verify the update-check hook still behaves\n6. Test the rendered output manually for your specific changes\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdoublej%2Fcookiecutter-templates","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdoublej%2Fcookiecutter-templates","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdoublej%2Fcookiecutter-templates/lists"}