Skip to main content

Zero-friction Python app compiler: ship any Python project as a self-bootstrapping single-file binary.

Project description

Axe

Axe ships your Python app as a self-bootstrapping single-file binary — for every major platform, from any machine, with zero extra toolchain.

  • App developers need no Go, no cross-compilers, no Docker. Axe's wheel ships precompiled runtime stubs; axe build just glues your app onto them.
  • App users need no Python and no uv. The binary bootstraps a cached environment on first run (uv installs Python and your app) and is instant on every run after — the same runtime contract as pyapp, uv-first.

Quick start

Your project needs to be an installable package with a console script — a project created with uv init --package is already set up correctly (a bare uv init app is not packaged; axe build will tell you what to add):

$ uv init --package mycli
$ cd mycli
$ uv add --dev axe
$ axe build --all-platforms
built dist/bin/cowsay-0.1.0-linux-amd64
built dist/bin/cowsay-0.1.0-linux-arm64
built dist/bin/cowsay-0.1.0-darwin-amd64
built dist/bin/cowsay-0.1.0-darwin-arm64
built dist/bin/cowsay-0.1.0-windows-amd64.exe

Hand the binary to anyone:

$ ./cowsay-0.1.0-darwin-arm64 hello
setting up cowsay 0.1.0 (first run)...
done.
 _______
< hello >
 -------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

How it works

axe build builds your project's wheel with uv, then appends it — plus a small JSON config — to a precompiled Go runtime stub for each target platform. Building is byte concatenation, so cross-"compiling" all platforms takes seconds anywhere.

At first run the stub downloads a pinned uv (checksum-verified, cached across apps), lets uv provision the pinned CPython, installs the embedded wheel into a per-app environment keyed by payload fingerprint, and hands off to your app (execvp on Unix). Subsequent runs are a single existence check.

Configuration

Everything is optional; defaults come from [project]:

[tool.axe]
entrypoint = "mycli"          # default: the sole [project.scripts] entry
                              # also accepts "-m pkg" or "pkg.mod:func"
python = "3.12"               # default: lower bound of requires-python
uv-version = "0.10.6"         # uv the runtime bootstraps
expose = ["metadata"]         # extra `self` commands: python, python-path,
                              # cache, metadata — or "all"

CLI

$ axe build [PROJECT] [-o DIR] [-p OS/ARCH]... [--all-platforms]
$ axe platforms

Targets: linux/amd64, linux/arm64, darwin/amd64, darwin/arm64, windows/amd64.

Runtime management commands

Built binaries reserve one command group, self; everything else goes to your app:

$ myapp self remove    # wipe the installation
$ myapp self restore   # wipe and reinstall
$ myapp self update    # reinstall from the embedded payload

AXE=1 is set in your app's environment so it can detect axe installs, and AXE_DEBUG=1 makes the stub verbose.

Developing axe itself

This is the one place a Go toolchain is required:

$ python scripts/build_stubs.py   # cross-compile runtime stubs (needs go)
$ uv run pytest                   # unit + end-to-end tests
$ cd runtime && go test ./...     # runtime unit tests
$ uv build                        # the wheel, stubs included

Design doc: docs/superpowers/specs/2026-07-07-axe-design.md.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

axe-0.1.1.tar.gz (12.6 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

axe-0.1.1-py3-none-any.whl (12.6 MB view details)

Uploaded Python 3

File details

Details for the file axe-0.1.1.tar.gz.

File metadata

  • Download URL: axe-0.1.1.tar.gz
  • Upload date:
  • Size: 12.6 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for axe-0.1.1.tar.gz
Algorithm Hash digest
SHA256 fc2537ba8f4b44e77ed20f2cef8f971ec2c730cd85f99dee2b2e7dcae1153367
MD5 31eddd029579842563ce011a5e9cbce0
BLAKE2b-256 ade38c62be00c946293906b87495aef918274450db68208afb770a750cb58008

See more details on using hashes here.

Provenance

The following attestation bundles were made for axe-0.1.1.tar.gz:

Publisher: publish.yml on soasme/axe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file axe-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: axe-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 12.6 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for axe-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 f87a165de79887ffd5f496668d34b824346b54a15005e677018182bb71ff7cfe
MD5 2e16fb96c48fd4e41129cea477882b87
BLAKE2b-256 a45b3dfc61a03d6cad2fb4e372a658f83d84e13dd4bc45b00a60241ff4ea4132

See more details on using hashes here.

Provenance

The following attestation bundles were made for axe-0.1.1-py3-none-any.whl:

Publisher: publish.yml on soasme/axe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page