Scaffold and maintain production-ready Python projects with a rich CLI and Claude Code plugin.
Project description
This is a modern Cookiecutter template that can be used to initiate a Python project with all the necessary tools for development, testing, and deployment. It supports the following features:
- uv for dependency management
- Supports src layout
- CI/CD with GitHub Actions
- Pre-commit hooks with pre-commit
- Code quality with ruff, mypy, wemake-python-styleguide, deptry and prettier
- Publishing to PyPI by creating a new release on GitHub
- Testing and coverage with pytest and codecov
- Documentation with Docusaurus
- Compatibility testing for multiple versions of Python with tox-uv
- Containerization with Docker
- Development environment with VSCode devcontainers
Quickstart
Navigate to the directory where you want your new project and run:
uvx spinup-py my-project
Or install globally first:
uv tool install spinup-py
spinup-py my-project
Follow the guided prompts to configure your project. Once complete, a new directory my-project/ will be created with everything set up.
To retrofit an existing project with the latest tooling:
spinup-py --update /path/to/existing-project
spinup-pyis the Python sibling ofspinup-ts, the equivalent TypeScript project scaffolder.
Install from source
For local or development use (e.g. running it as a Claude Code plugin), install the checkout directly with an editable install:
uv tool install --editable .
Usage
# Scaffold a new project (bare form — positional name)
spinup-py my-project
# Same thing via the explicit subcommand
spinup-py new my-project
# Retrofit an existing project with the current tooling
spinup-py update /path/to/existing-project
# Or via the root flag (equivalent to `update`)
spinup-py --update /path/to/existing-project
# Print the installed version
spinup-py --version
Flags
| Flag / command | Description |
|---|---|
spinup-py <name> |
Scaffold a new project with the given name (runs the guided prompts). |
spinup-py new [<name>] |
Explicit subcommand for scaffolding a new project. |
spinup-py update [<dir>] |
Retrofit an existing project at <dir> (defaults to the current directory). |
--update, -u <dir> |
Root-level equivalent of update — retrofit an existing project at <dir>. |
--non-interactive, -y |
Scaffold with sensible defaults and no prompts. |
--version, -v |
Print the installed version and exit. |
Offline / custom template
By default the published CLI fetches its Cookiecutter template from GitHub (gh:joeblackwaslike/spinup-py). To use a local or custom template instead — handy when working offline or from a fork — set the SPINUP_PY_TEMPLATE environment variable to any Cookiecutter reference (a local path, a different GitHub repo, etc.):
SPINUP_PY_TEMPLATE=/path/to/template spinup-py my-project
Acknowledgements & Lineage
- This project is partially based on Florian Maas's great cookiecutter-uv repository. Many additional improvements have been added from all the projects I've worked on over the last 12 years or so.
- Florian also credits Audrey Feldroy's great cookiecutter-pypackage repository.
Feedback and contributing
My mission with this is to build the best project starter for python projects that has everything you can want, the ability to customize and/or opt out of most everything, and save you the most time!
I am only one person with very specific preferences. If you have any feedback you can email me at me@joeblack.nyc. If you find any bugs, mistakes, missed opportunities, or would like to contribute new functionality in any way, I would love to hear about it in an issue, feel free to email me the issue to get my attention.
This project is under continuous iterative improvements as I find bugs, and better and more effective ways to do things. But I can only do so much on my own, so please open an issue if you want to help/contribute and we can iterate and discuss how we can make this happen. If you find an outright bug or mistake, just open a PR and describe all the details there.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file spinup_py-0.2.0.tar.gz.
File metadata
- Download URL: spinup_py-0.2.0.tar.gz
- Upload date:
- Size: 210.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9ac32688f8c1a186aeb4af3257ff17f1852c47ca6ae36790aa4e539b65120857
|
|
| MD5 |
64d81d7c1df87bd6dd60407e946dcabd
|
|
| BLAKE2b-256 |
6eeba65dc87bedcfcaf419ca3174f5ed45bab5ee159de50a3f6ed39a9eca2d0d
|
Provenance
The following attestation bundles were made for spinup_py-0.2.0.tar.gz:
Publisher:
release-please.yml on joeblackwaslike/spinup-py
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
spinup_py-0.2.0.tar.gz -
Subject digest:
9ac32688f8c1a186aeb4af3257ff17f1852c47ca6ae36790aa4e539b65120857 - Sigstore transparency entry: 1774017956
- Sigstore integration time:
-
Permalink:
joeblackwaslike/spinup-py@f4e9371383311b851edec0334419c99d02a10ec7 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/joeblackwaslike
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-please.yml@f4e9371383311b851edec0334419c99d02a10ec7 -
Trigger Event:
push
-
Statement type:
File details
Details for the file spinup_py-0.2.0-py3-none-any.whl.
File metadata
- Download URL: spinup_py-0.2.0-py3-none-any.whl
- Upload date:
- Size: 17.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1b31bd1660ca826cc85155bb775c82cf58249bbf10b9642779e302e81683f6df
|
|
| MD5 |
d4982363c2c429d0b5401b48710aa6a0
|
|
| BLAKE2b-256 |
854b789dd40b7bbc97b20b51b563b975c60f79ae3baad51846395f159625293a
|
Provenance
The following attestation bundles were made for spinup_py-0.2.0-py3-none-any.whl:
Publisher:
release-please.yml on joeblackwaslike/spinup-py
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
spinup_py-0.2.0-py3-none-any.whl -
Subject digest:
1b31bd1660ca826cc85155bb775c82cf58249bbf10b9642779e302e81683f6df - Sigstore transparency entry: 1774018082
- Sigstore integration time:
-
Permalink:
joeblackwaslike/spinup-py@f4e9371383311b851edec0334419c99d02a10ec7 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/joeblackwaslike
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-please.yml@f4e9371383311b851edec0334419c99d02a10ec7 -
Trigger Event:
push
-
Statement type: