bundleup
Bundle up your Python app with everything it needs. One command turns a locked project into a
single .pyz that runs on plain Python: no install step, no network, native extensions included.
And it tells you before you ship what won't survive the trip.
Dead simple to use, but also powerful and fast: esbuild's experience, for Python.
Status: pre-alpha. Research, positioning and the test suite are done; the bundler itself isn't written yet. Nothing is published on PyPI.
Why
Python has three ways to hand a program to someone else, and the middle one is missing:
| Ship as | The other machine needs | Problem |
|---|---|---|
| Standalone executable | Nothing | Per-OS builds, code signing, antivirus |
Source + pip install / uv sync |
Python, an installer, network | The install step is where things break |
| One file that runs on the user's Python | Python | No easy, reliable tool. That's bundleup |
pex, shiv and zipapps can do parts of this. bundleup's bet is a much better experience on top of the same correct approach: no flags to get it fast, plain-language errors, and a pre-ship check. See docs/vision.md.
Where to start reading
- MISSION.md: goal, scope, what "done" means
- docs/vision.md: where bundleup fits and who it's for
- docs/roadmap.md: where it could go next
- docs/python-primer.md: Python packaging explained for JavaScript developers
- docs/adr/: decisions and why they were made
- docs/findings/2026-10-03-baseline.md: how pex, shiv and zipapps fare today
- gauntlet/: the test projects every bundler is measured against
Gauntlet
uv run gauntlet/check_native.py # control group: projects run normally
uv run gauntlet/run_bundlers.py --conditions --out run # existing bundlers, incl. hostile conditions
uv run gauntlet/report.py gauntlet/results/run.json > gauntlet/results/run.md
License
Metadata
Release files for bundleup 0.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| bundleup-0.0.1.tar.gz | 3.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| bundleup-0.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 7.5 kB
Release files / bundleup-0.0.1.tar.gz
| Download URL | bundleup-0.0.1.tar.gz |
|---|---|
| Size | 3.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fc78af9e702b73c8d0e0a25e452fe3d58e38b4e1f121178309e04cd6b1b2945f
|
|
BLAKE2b-256 checksum How to use checksums |
cd0333a5a5fecc3aebe154c08de21b6f3515e05b020ff22e13fb10cf8687d5ad
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / bundleup-0.0.1-py3-none-any.whl
| Download URL | bundleup-0.0.1-py3-none-any.whl |
|---|---|
| Size | 4.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5e97e4a024174cdf3e503b45cd5f847f280b03eac8b67234605077b4acc0804e
|
|
BLAKE2b-256 checksum How to use checksums |
8a713865314c826d79b84c29ca9bc982ce35ce6c5d4a03d3d50d6136597aae5b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|