ux
uv-based Python App Launcher - distribute Python apps as single executables.
Features
- Single binary distribution - End users don't need Python or uv installed
- Offline bundling - Embed Python interpreter and all dependencies; runs without internet access
- Cross-compilation - Build for Linux/Windows from any platform
- macOS .app bundle - Native macOS application with icon support
- Code signing & Notarization - Distribute through macOS Gatekeeper
- DMG creation - Professional macOS distribution format
Installation
Via uv (recommended)
uv tool install ux-py
Via pip
pip install ux-py
From GitHub Releases
Download from Releases
Build from source
cargo install --git https://github.com/i2y/ux
Quick Start
Basic bundling
# Bundle Python app into single binary
ux bundle --project /path/to/project --output ./dist/
Offline bundling
Bundle Python and all dependencies so the app runs without network access on the target machine:
# Embed Python interpreter and locked wheels (no internet required at runtime)
ux bundle --offline --project /path/to/project --output ./dist/
# Cross-compile an offline bundle for Linux
ux bundle --offline --target linux-x86_64 --output ./dist/
The Python interpreter is fetched from python-build-standalone for the target platform, so cross-platform offline bundles work from any host.
Cross-compilation
# Build for Linux (works from any platform)
ux bundle --target linux-x86_64 --output ./dist/
# Build for Windows (works from any platform)
ux bundle --target windows-x86_64 --output ./dist/
macOS .app bundle
# Create .app bundle
ux bundle --format app --output ./dist/
# With code signing
ux bundle --format app --codesign --output ./dist/
# With notarization (requires Apple Developer account)
ux bundle --format app --notarize --output ./dist/
# Create DMG for distribution
ux bundle --format app --codesign --dmg --output ./dist/
Configuration
Add [tool.ux] section to your pyproject.toml:
[project]
name = "myapp"
[project.scripts]
myapp = "myapp.main:main" # Entry point
[tool.ux]
entry = "myapp" # Optional: explicit entry point
include = [ # Optional: additional files to include
"assets/", # Include entire directory (trailing slash)
"config.yaml", # Include specific file
]
[tool.ux.macos]
icon = "assets/icon.png" # PNG auto-converted to ICNS
bundle_identifier = "com.example.myapp"
bundle_name = "My App"
Included files
The bundle automatically includes:
- Package directory (detected from
[project].name, e.g.,myapp/orsrc/myapp/) pyproject.toml,uv.lockREADME.md,LICENSE(if present)
Use [tool.ux].include to add extra files or directories (with trailing slash)
Supported Platforms
ux runs on macOS, Linux, and Windows. You can bundle apps for any supported target from any platform.
| Target | Bundle | PyPI |
|---|---|---|
| darwin-x86_64 | ✓ | ✓ |
| darwin-aarch64 | ✓ | ✓ |
| linux-x86_64 | ✓ | ✓ |
| linux-aarch64 | ✓ | No* |
| windows-x86_64 | ✓ | ✓ |
* Linux aarch64 is available from GitHub Releases only.
Real-world Usage
License
MIT
Metadata
Release files for ux-py 0.1.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| ux_py-0.1.6.tar.gz | 43.6 kB | With provenance | Details for ux_py-0.1.6.tar.gz |
Built distributions (wheels)
| File | Actions Reset | |||
|---|---|---|---|---|
| ux_py-0.1.6-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details for ux_py-0.1.6-py3-none-win_amd64.whl |
| ux_py-0.1.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | Python 3 | none | Linux glibc 2.17+ x86-64 | Details for ux_py-0.1.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
| ux_py-0.1.6-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details for ux_py-0.1.6-py3-none-macosx_11_0_arm64.whl |
| ux_py-0.1.6-py3-none-macosx_10_12_x86_64.whl | Python 3 | none | macOS 10.12+ x86-64 | Details for ux_py-0.1.6-py3-none-macosx_10_12_x86_64.whl |
Total release size: 10.8 MB
Release files / ux_py-0.1.6.tar.gz
| Download URL | ux_py-0.1.6.tar.gz |
|---|---|
| Size | 43.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
75ff4fb6d7b7b73a3a076fb8c50fa3a8f473d5888044106100208649aeee4ae0
|
|
BLAKE2b-256 checksum How to use checksums |
898521d6bc0e8b83faf18e7cae704cdede2852bcc707c46138a598a8a1ee3f72
|
| 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 Mar 25, 2026.
Transparency logRelease files / ux_py-0.1.6-py3-none-win_amd64.whl
| Download URL | ux_py-0.1.6-py3-none-win_amd64.whl |
|---|---|
| Size | 2.7 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
61c08e4894dafd5d489c4b1f5f88e08c2f20da1843db08de5fd1c59a5e62ab6e
|
|
BLAKE2b-256 checksum How to use checksums |
9bab26148ccdd2433f0d7d65d7ba537d3c9038b91981dd3359ce687b46db51ea
|
| 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 Mar 25, 2026.
Transparency logRelease files / ux_py-0.1.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | ux_py-0.1.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 2.8 MB |
| Tags | Linux glibc 2.17+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
b6f4210533c544e34c4f23adf8e8a8bd9a47f86ed5993be69c508075f6d4be45
|
|
BLAKE2b-256 checksum How to use checksums |
ca2d7a851cbe06f9c336074352eac7db2276533382be7054a50aaaf9d70db7cc
|
| 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 Mar 25, 2026.
Transparency logRelease files / ux_py-0.1.6-py3-none-macosx_11_0_arm64.whl
| Download URL | ux_py-0.1.6-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.5 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
8600f95a4bdc03e29a1b2a03a86717309574ff4c899fc1cec307386487243dae
|
|
BLAKE2b-256 checksum How to use checksums |
11fa30660cc2abf0ac5905ab742941d8177c570133372489c32540eaec712ef0
|
| 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 Mar 25, 2026.
Transparency logRelease files / ux_py-0.1.6-py3-none-macosx_10_12_x86_64.whl
| Download URL | ux_py-0.1.6-py3-none-macosx_10_12_x86_64.whl |
|---|---|
| Size | 2.7 MB |
| Tags | Python 3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
a5c2a91dce92a9ad036ddfa85b32e6117f6ba99291be3986e3fd79bb1060fd0e
|
|
BLAKE2b-256 checksum How to use checksums |
ed8ba2e7ce12a1678e04fa967806ed1baf9f5969de0e8a2694c3e1d08efc07b9
|
| 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 Mar 25, 2026.
Transparency logSecurity for ux-py 0.1.6
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.
Full provenance
All 5 files in this release have been uploaded with provenance metadata.
Attestation for ux_py-0.1.6.tar.gz
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 Mar 25, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.