Metadata-Version: 2.4
Name: pyappdist
Version: 0.1.0
Summary: Turn a Python app into a Windows installer(msi)
Keywords: windows,installer,msi,packaging,distribution,wheel,wix
Author: Atsuo Ishimoto
Author-email: Atsuo Ishimoto <atsuoishimoto@gmail.com>
License-Expression: MIT
License-File: LICENSE
Classifier: Development Status :: 3 - Alpha
Classifier: Environment :: Console
Classifier: Environment :: Win32 (MS Windows)
Classifier: Intended Audience :: Developers
Classifier: Operating System :: Microsoft :: Windows
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Software Development :: Build Tools
Classifier: Topic :: System :: Installation/Setup
Classifier: Topic :: System :: Software Distribution
Requires-Dist: packaging>=23
Requires-Dist: pip>=26.1.1
Requires-Dist: tomlkit>=0.15.0
Requires-Dist: wheel>=0.47.0
Requires-Python: >=3.11
Project-URL: Homepage, https://github.com/atsuoishimoto/pyappdist
Project-URL: Documentation, https://pyappdist.readthedocs.io/
Project-URL: Repository, https://github.com/atsuoishimoto/pyappdist
Project-URL: Issues, https://github.com/atsuoishimoto/pyappdist/issues
Description-Content-Type: text/markdown

# pyappdist

**Turn a Python app into a Windows installer — and it just works.**

> ⚠️ **Alpha.** pyappdist is under active development. It works end-to-end today, but the
> config schema, CLI, and output layout may still change without notice.

pyappdist does **not** freeze your code. Instead of bundling Python and your app into a
single executable (and fighting hidden imports, data files, and plugins along the way),
it installs your app into a real, dedicated Python runtime — exactly the way `pip` would —
and ships that.

Because the runtime is a normal Python environment, **most apps run as-is**: no hooks, no
`--hidden-import`, no `--add-data`, no per-library workarounds. If it runs under `uv run`,
it almost certainly runs after `pyappdist build`. C extensions, `abi3` wheels, Qt plugins,
and tkinter-based GUIs work unmodified because the install layout is real.

## Quick start

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

```toml
[tool.pyappdist]
name = "My App"
python = "3.12"
target = "windows-x86_64"

[[tool.pyappdist.launchers]]
name = "myapp"              # produces myapp.exe
entry = "myapp:main"        # module:callable

[tool.pyappdist.wix]
manufacturer = "Example Inc."
```

Then add pyappdist and build:

```bash
uv add --dev pyappdist
uv run pyappdist build .    # wheels -> runtime -> image -> launcher -> wix -> MSI
```

The result lands under `appdist/dist/`: a portable `.zip` and an `.msi` installer.

## Documentation

Full documentation lives in the [`docs/`](docs/) directory (Sphinx / Read the Docs):

- [Installation & requirements](docs/installation.rst)
- [Quick start](docs/quickstart.rst)
- [How it works](docs/how-it-works.rst)
- [Configuration reference](docs/configuration.rst)
- [CLI reference](docs/cli.rst)
- [Dependency resolution](docs/dependencies.rst)
- [Code signing](docs/signing.rst)
- [Samples](docs/samples.rst)

## Status

**Alpha** — the pipeline works end-to-end, but expect breaking changes to the config
schema, CLI, and output layout as it matures.

Windows x64 is the current target. macOS/Linux packaging, auto-update, and code-signing
certificates are out of scope for now. Distributed apps are not obfuscated, and unsigned
installers will trigger a SmartScreen warning.
