Copier template for Python projects with uv, ruff, ty, pytest, just, and GitHub Actions CI.
| Tool | Purpose |
|---|---|
| uv | Package management, virtualenv, Python installs |
| just | Task runner (just check runs everything) |
| ruff | Linting and formatting |
| ty | Type checking |
| pytest | Testing with coverage |
| GitHub Actions | CI on push/PR to main |
| pre-commit | Git hooks for ruff + ty on commit |
| Codecov | Coverage reporting |
Auto-populates project name, author, package name, etc:
uv tool install copier
copier copy --trust gh:aligfellow/python-template my-new-project
cd my-new-project
just setup && just checkThe --trust flag is required because the template runs git init and creates an initial commit automatically.
Then create a GitHub repo and push:
gh repo create my-new-project --public --source=. --pushOr if you prefer to create the repo on GitHub first:
git remote add origin git@github.com:your-user/my-new-project.git
git push -u origin mainPlain file copy — you rename things manually:
- Click "Use this template" on this repo page, or:
gh repo create my-new-project --template aligfellow/python-template --public --clone
- Rename
src/{{ package_name }}/to your actual package name - Update
name,description,authors, andhomepageinpyproject.toml - Update
sourcein[tool.coverage.run]to match your package name - Update
LICENSEwith your name and year
my-new-project/
├── src/
│ └── my_package/
│ ├── __init__.py
│ └── cli.py # if include_cli=true
├── tests/
│ ├── __init__.py
│ └── test_import.py
├── .github/workflows/
│ └── ci.yml
├── pyproject.toml # ruff, ty, pytest, coverage config
├── justfile # check/lint/type/test/fix/build/setup
├── .pre-commit-config.yaml # ruff on commit
├── CITATION.cff # if include_citation=true
├── .gitignore
├── LICENSE
└── README.md
| Question | Default |
|---|---|
project_name | — |
package_name | derived from project name |
description | — |
author | Alister S. Goodfellow |
github_user | aligfellow |
year | 2026 |
python_version | 3.12 |
ci_python_version | 3.14 |
include_cli | false |
include_citation | false |
If a project was created with copier copy, pull in template improvements with:
copier update --trust--trust is required because the template defines tasks (used for git init on first copy). The tasks don't run during update, but copier requires trust for any template that declares them.
For repo, go to codecov.io. Navigate to the desired repository and activate it under Configuration > General. Copy the CODECOV_TOKEN and add as a repository secret on github under Settings > Secrets and variables > Actions, naming the secret CODECOV_TOKEN.