Skip to main content

English | 한국어

pypackpack

Build a Python project once. Ship it to every platform.

License: Apache-2.0 PyPI Targets Status

Guide · Getting started · Status


💡 Why

A Python project that has to run on a phone as well as a desktop needs more than installing packages: dependencies resolved for a platform that is not the one you build on, extension modules compiled for it, and the result packaged so an app can carry it. pypackpack (ppp) does that work, so you never configure a Python, a JVM or a cross-compiler by hand.

pypackpack = crossenv + compiler + bundler + codepush

It delegates instead of reimplementing: dependency resolution and installation are uv's, and pypackpack adds targets, per-target markers and per-target install directories on top.

✨ Features

  • 🎯 Targets as triples. Android, iOS, macOS, Linux and Windows, by canonical target triple (aarch64-linux-android, arm64-apple-ios, …) or a few aliases.
  • 📦 Dependencies per target. ppp <package> add numpy --target aarch64-linux-android writes the marker uv evaluates for that target, and sync installs each target's wheels into build/crossenv/<triple>/.
  • 🐍 Pinned interpreters. ppp python install 3.14 <target> fetches a CPython build for the target and checks its SHA-256 before unpacking anything.
  • 🛠️ C/C++ extensions. ppp build generates a meson.build and compiles them.
  • 🧳 Bundles. The resource payload that python-multiplatform runs, plus single, fat and patch wheels.
  • ☕ One codebase, two front doors. The pypackpack command line, and the same work as a JVM library that toolchain (the Gradle plugin) calls.

🚀 Install

uv tool install pypackpack    # puts pypackpack and ppp on PATH
pypackpack --help             # alias: ppp
uvx pypackpack --help         # or run it without installing

The wheel carries the command line as a native binary (GraalVM Native Image), one wheel per platform: macOS 11+ on Apple silicon, Linux x86_64 and aarch64 (glibc), Windows x86_64. On any other platform the installer finds no matching wheel. There is deliberately no source distribution: building needs a JDK and GraalVM, and an sdist would install the launcher without the binary.

uv is needed at run time. When none is on PATH, pypackpack downloads one into ~/.pypackpack/uv.

Build from a checkout instead
git clone -b develop https://github.com/thisisthepy/pypackpack
cd pypackpack
./gradlew :packpack:installCliDist          # JDK 21
alias ppp="$PWD/packpack/build/install/pypackpack/bin/pypackpack"
./gradlew :packpack:nativeCompile          # the native binary; needs GraalVM as JAVA_HOME

⚡ Quick start

ppp init myapp --python 3.13
cd myapp
ppp package add packages/core
ppp target add aarch64-linux-android arm64-apple-ios

ppp core add requests                                     # every target of the package
ppp core add six --target arm64-apple-ios                 # one target only
ppp core sync --target aarch64-linux-android arm64-apple-ios \
    --python-version 3.14 --only-binary :all:          # → packages/core/build/crossenv/<triple>/

ppp build core --target aarch64-apple-darwin              # Meson; host only for now

Without --target, sync and tree use the host's target only. Put your modules in a package directory such as packages/core/src/main/core/; platform-specific code goes in src/android/, src/ios/ and so on.

☕ As a library

repositories { mavenLocal() }    // ./gradlew :packpack:publishToMavenLocal
dependencies { implementation("org.thisisthepy.python.multiplatform:packpack:0.1.0") }
BundlerInterface.create(BundleType.RESOURCE).bundle(
    BundleRequest(packageDir = packageDir, target = "aarch64-linux-android", buildLevel = "bytecode")
)

The library page of the guide covers bundling, Python installs into a directory you choose, and per-target dependency installs.

🧭 Where it fits

Repository Owns
pypackpack The work: acquiring Python, resolving dependencies, cross-compiling, bundling
toolchain The Gradle python { } block that turns into pypackpack calls
python-multiplatform The runtime: CPython embedded in Kotlin Multiplatform, which loads the resource bundle

📊 Status

An honest summary. The status page has the item-by-item contract.

Area State
Python distributions (install, list, find, uninstall; pinned SHA-256) ✅ implemented
Targets and per-target dependencies (add, remove, sync, tree) 🟡 working; part of it has no test yet
C/C++ extensions through Meson 🟡 host only, no cross-compiling yet
Bundles: resource, single, fat, patch ✅ implemented
Build levels: instant / bytecode ✅ / 🟡 (resource only)
Build levels: native / mixed ⏳ planned; semantics decided, compile slot in draft
deploy, code push, binary bundle ⏳ planned

📖 Documentation

  • Guide: getting started, targets and dependencies, Python distributions, build levels and bundles, the library API. English and 한국어.
  • 한국어 README

🤝 Contributing

Work here runs intent → spec → test → code: a behaviour change starts as a spec change, its test is written and seen failing, then the code makes it pass. The guide's contributing notes say how to run the tests.

📄 License

Apache-2.0 © thisisthepy

Metadata

Release files for pypackpack 0.2.0

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

Built distributions (wheels)

Table of built distributions (wheels) for pypackpack 0.2.0
File
pypackpack-0.2.0-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
pypackpack-0.2.0-py3-none-manylinux_2_34_x86_64.whl Python 3 none Linux glibc 2.34+ x86-64 Details
pypackpack-0.2.0-py3-none-manylinux_2_34_aarch64.whl Python 3 none Linux glibc 2.34+ ARM64 Details
pypackpack-0.2.0-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details

Total release size: 88.0 MB

Release files / pypackpack-0.2.0-py3-none-win_amd64.whl

Download URL pypackpack-0.2.0-py3-none-win_amd64.whl
Size 22.0 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
e791f380556b8dac4c311392a7ee0be097beba95342bdec5a044ef74b78f8b01
BLAKE2b-256 checksum
How to use checksums
bde8e6ff2f57c5224dddf27ab836ffc1cd9d7e8e6867f6b69c53eb969a77fe97
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 3, 2026.

Transparency log

Release files / pypackpack-0.2.0-py3-none-manylinux_2_34_x86_64.whl

Download URL pypackpack-0.2.0-py3-none-manylinux_2_34_x86_64.whl
Size 22.2 MB
Tags Linux glibc 2.34+ x86-64 Python 3
SHA-256 checksum
How to use checksums
79853f3d153ab34df28ab789ba4c98d359c679cbeeaf1532b85c7ae5de482a61
BLAKE2b-256 checksum
How to use checksums
23d8ef0c1c32657a10249e16fb5b5ed4f7646181972f41d09b70e5c5cc2d7a44
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 3, 2026.

Transparency log

Release files / pypackpack-0.2.0-py3-none-manylinux_2_34_aarch64.whl

Download URL pypackpack-0.2.0-py3-none-manylinux_2_34_aarch64.whl
Size 21.9 MB
Tags Linux glibc 2.34+ ARM64 Python 3
SHA-256 checksum
How to use checksums
e0b66d29f4d93bc8597a45df0fdb492d9ce8a7d41fe8fae14ee6c151933be76b
BLAKE2b-256 checksum
How to use checksums
a546e56e7bcbbea49344428b5d316e3b1fb99990f918c10ebfff10ac09daf15d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 3, 2026.

Transparency log

Release files / pypackpack-0.2.0-py3-none-macosx_11_0_arm64.whl

Download URL pypackpack-0.2.0-py3-none-macosx_11_0_arm64.whl
Size 21.9 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
55bede0ffe2206be24d6e9224c1361a1335dd6c543406c05542167e19a6afe59
BLAKE2b-256 checksum
How to use checksums
91e7647ce3b5ba5f9b2dda2a44fa9010ae1a7cdbe0f64a3ed31bc883c75b538e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Oct 3, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.0 This release

4 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