Skip to main content

Simple Python package

Publish to PyPI

This repository is a minimal template for publishing a small Python package to PyPI using GitHub Actions and trusted publishing.

Quick start

  1. Fork this repository on GitHub and mark your fork as a template via the repo settings (once)
  2. Try and/or remove the demo files from your fork: src/lorenz.py & notebooks/lorenz_demo.ipynb (once)
  3. Create a pending publisher on PyPI.org (each new project)
  4. Create a new repository for your project from your template fork on GitHub (each new project)
  5. Update pyproject.toml to reflect your new project's metadata (each new project)
  6. Commit and push your code (each code update)
  7. Tag and publish a release on GitHub - this will trigger the workflow to publish the current commit to PyPI (each code update)

Project structure

.
├── .devcontainer/               # Dev container config
├── .git/                        # Local Git metadata
├── .github/                     # GitHub configuration
│   └── workflows/
│       └── publish-to-pypi.yml  # Builds package and publishes to PyPI
├── .gitignore                   # Files and folders Git should ignore
├── LICENSE                      # Package license
├── pyproject.toml               # Package metadata, build system, and dependencies
├── README.md                    # Project overview and setup instructions
├── requirements.txt             # Dev/test dependencies for local usage
├── notebooks/
│   └── lorenz_demo.ipynb        # Example notebook demonstrating the package
└── src/
	└── lorenz.py                # Example module shipped in the package

Usage

1. Fork and mark the template (once)

  1. Fork this repository.
  2. In the fork, open Settings → General → Template repository and enable it.

2. Try or remove the demo (once)

This repository ships a tiny demo package (lorenz) used to illustrate packaging and publishing. You can try it locally or remove it before starting your own project.

2.1. Try the demo locally

  1. Open your fork in a devcontainer or GitHub Codespace.

  2. Install the package in editable mode:

    pip install -e .
    
  3. Run the demo notebook notebooks/lorenz_demo.ipynb

2.2. Install the demo from PyPI

Since the demo package has been published to PyPI from this repo, you can install it via pip and use it anywhere:

pip install simple-python-package

2.3. Remove the demo from your fork

If you want a clean template fork to start new projects, simply delete the demo files:

  • src/lorenz.py
  • notebooks/lorenz_demo.ipynb

3. Create a pending publisher on PyPI (each new project)

  1. In PyPI, go to Project → Publishing → Trusted Publishers.
  2. Add a pending publisher with these values:
    • PyPI Project Name: must be unique, site-wide
    • Owner: your GitHub user or org
    • Repository: your repo name
    • Workflow: publish-to-pypi.yml
    • Environment: pypi

Do this first, before naming the GitHub repository to determine if your planned name is available on PyPI. PyPI project names must be unique site-wide. The GitHub repo and PyPI project names don't have to match, but it's nice if they do.

4. Create a new repository from your template (each new project)

  1. In your template fork, click Use this template on GitHub.
  2. Create a new repository for your project.

5. Update project metadata (each new project)

Update pyproject.toml with your project metadata:

  • Change name, authors, and description in [tool.poetry]
  • Update classifiers and keywords in [tool.poetry]
  • Update runtime dependencies in [tool.poetry.dependencies]
  • Replace or remove [tool.poetry.urls]

6. Commit and push (each code update)

Use the repo to develop your project as you normally would. Place Python modules to be published as part of your package in the src/ directory. Commit and push your code to GitHub.

7. Tag and publish a release (each code update)

  1. Create a GitHub release tag that matches your current version under [tool.poetry] in pyproject.toml (e.g., 0.1.0 or v0.1.0 - see here for information about version numbering).
  2. The Publish to PyPI workflow will build and publish automatically.

If you prefer a manual run, you can trigger the workflow from the Actions tab.

Release files for simple-python-package 0.5.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for simple-python-package 0.5.0
File Size Uploaded
simple_python_package-0.5.0.tar.gz 15.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for simple-python-package 0.5.0
File Interpreter ABI Platform
simple_python_package-0.5.0-py3-none-any.whl Python 3 none any Details

Total release size: 32.0 kB

Release files / simple_python_package-0.5.0.tar.gz

Download URL simple_python_package-0.5.0.tar.gz
Size 15.7 kB
Tags Source
SHA-256 checksum
How to use checksums
965216e77a4ca408156b81dd65baa1456ad8705093b8078271dff355ee5d7e66
BLAKE2b-256 checksum
How to use checksums
3b6bceb76e34455a556bdbcbdc450e603259dd6041a95e940bb7d1e2f6912eb7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 1, 2026.

Transparency log

Release files / simple_python_package-0.5.0-py3-none-any.whl

Download URL simple_python_package-0.5.0-py3-none-any.whl
Size 16.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b6f445535e63ca6a82b30f2510582e3b7ea2cf603ef63768ee3307196b50083b
BLAKE2b-256 checksum
How to use checksums
3ae5d80ea8bffcd722f8a1a0e3db3f0afd27585ea0394a8733fb6e985dee7028
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 1, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.5.0 This release

2 release files

0.4.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page