Skip to content

Building packages

All release artifacts are PyInstaller onedir builds, wrapped per platform. CI builds everything on tag push (release flow); locally:

macOS (.app / DMG)

uv sync --group build
uv run pyinstaller packaging/nparseplus.spec --noconfirm   # dist/nParse+.app
codesign --force --deep -s - "dist/nParse+.app"            # ad-hoc sign
uv run dmgbuild -s packaging/dmg_settings.py "nParse+" dist/nParse+.dmg

Windows (zip)

uv sync --group build
uv run pyinstaller packaging/nparseplus.spec --noconfirm
Compress-Archive -Path dist/nparseplus -DestinationPath dist/nparseplus-win64.zip

Linux (tarball + Flatpak)

uv sync --group build
uv run pyinstaller packaging/nparseplus.spec --noconfirm
tar -C dist -czf nparseplus-linux-x86_64.tar.gz nparseplus

The Flatpak wraps the same onedir build via the manifest in packaging/flatpak/ — building it needs a Linux box with flatpak-builder (commands are in the manifest header; CI does this on release). Release builds are GPG-signed and published to an OSTree repo on GitHub Pages, which is what makes flatpak update work.

Documentation site

uv sync --group docs
uv run mkdocs serve            # live preview at http://127.0.0.1:8000
uv run mkdocs build --strict   # the CI gate

Versioned deploys use mike; CI handles them (release flow). Screenshots go in docs/assets/screenshots/ — missing ones render as placeholders, and docs/dev-notes/screenshot-checklist.md lists what's wanted.