Quick start

Add a [tool.pyappdist] section to your app’s pyproject.toml:

[project]
name = "myapp"
version = "1.0.0"

[tool.pyappdist]
name = "My App"
python = "3.12"
# manager = "uv"            # optional; auto-detected from lockfile if omitted

[[tool.pyappdist.launchers]]
name = "myapp"              # produces myapp.exe on Windows
entry = "myapp:main"        # module:callable
gui = false                 # true -> pythonw.exe (no console)
# icon = "assets/app.ico"   # optional
# args = "--profile default"# optional fixed arguments

[[tool.pyappdist.targets]]
name = "windows"
platform = "windows-x86_64"
format = "msi"
manufacturer = "Example Inc."

Each [[tool.pyappdist.targets]] entry is one output package. format is required and must match the platform’s OS — pick the one(s) you need from Output formats (msi/msix on Windows, linux on Linux, macos on macOS). See Configuration for every option.

Build everything

uv add --dev pyappdist
uv run pyappdist build            # the sole target: wheels -> runtime -> image -> launcher -> package

When several targets are defined, name the one(s) to build, e.g. uv run pyappdist build linux. See Command-line interface.

Build step by step

Each stage of the pipeline is also its own subcommand:

uv run pyappdist fetch-runtime       # python-build-standalone -> <target>/runtime
uv run pyappdist build-wheels        # app + deps -> <target>/wheelhouse
uv run pyappdist build-image         # install into the runtime + launcher(s) + portable zip
uv run pyappdist build-launchers     # (re)build launcher.exe into the image (Windows)
uv run pyappdist gen-wix             # generate the WiX .wxs from the image (MSI)

See Command-line interface for the full command reference.

Outputs

Each target’s output lands under appdist/<target>/:

wheelhouse/

The app wheel + dependency wheels (and requirements.txt).

runtime/

The extracted python-build-standalone runtime.

image/

The installed, ready-to-run app (a portable directory).

dist/

The shippable package(s) for the target’s format.

The image directory itself is a portable app. The shippable artifacts in dist/ depend on the format — see the per-format pages under Output formats.