Skip to main content

Release pipeline for Python apps on Windows — embedded Python, launcher stub, Inno Setup installer.

Project description

snackbox

A release pipeline tool for Python apps on Windows.

Packages your Python project into a self-contained Windows release using embedded Python, a compiled launcher stub with custom icon, and an optional Inno Setup installer. No freezing, no bytecode magic — just normal Python, transparently packaged.

Installation

pipx install snackbox

Or with pip:

pip install snackbox

Quick Start

# Generate a starter config
snackbox init

# Edit snackbox.yaml to match your project

# Build a release folder
snackbox build

# Build a release + Inno Setup installer
snackbox installer

What it does

snackbox build creates a release/ folder containing:

release/
├── myapp.exe           # Compiled launcher stub (with your icon)
├── version.txt         # Version string (e.g., 1.0.0.abc1234)
├── python/             # Embedded Python environment
│   ├── python.exe
│   ├── Lib/site-packages/
│   │   └── myapp/      # Your installed package
│   └── ...
└── (your assets)       # Config files, data, etc.

snackbox installer additionally creates an Inno Setup installer .exe.

Configuration

Create snackbox.yaml in your project root:

app:
  name: "My App"
  slug: "myapp"
  version_from: "pyproject.toml"
  icon: "assets/myapp.ico"  # optional

python:
  version: "3.12.10"

build:
  wheel:
    backend: "poetry"  # or "pip", "hatch"
  extra_deps: []

launcher:
  entry_point: "myapp"    # runs: python -m myapp
  console: "yes"          # "yes", "no", or "attach"

assets:
  - "config.yaml:config.yaml"
  - "data:data"

version:
  git_hash: true
  dirty_flag: true
  save_patch: true

installer:
  enabled: true
  publisher: "Your Name"
  url: "https://github.com/you/myapp"
  install_dir: "{localappdata}\\MyApp"
  add_to_path: true
  start_menu: true

Console Modes

The launcher.console setting controls how the launcher behaves:

  • "yes" - Always show console (standard CLI app)
  • "no" - No console window (GUI app)
  • "attach" - Smart mode: attaches to existing terminal if launched from one, otherwise runs headless. Perfect for CLI tools that can also run as background services.

Commands

snackbox init              # Generate starter snackbox.yaml
snackbox build             # Build release folder
snackbox build --clean     # Rebuild embedded Python from scratch
snackbox build --force     # Force reinstall the app wheel
snackbox installer         # Build release + Inno Setup installer
snackbox cache show        # Show cache location and contents
snackbox cache clean       # Wipe the download cache
snackbox --version         # Print snackbox version

Requirements

  • Windows: Native builds work directly
  • GCC: MinGW-w64 for compiling the launcher (install via MSYS2 or scoop)
  • Inno Setup: For building installers (optional)

Cross-compilation (Linux/macOS)

Use the Docker image for cross-compilation:

docker run --rm -v $(pwd):/project ghcr.io/lanceliogs/snackbox build
docker run --rm -v $(pwd):/project ghcr.io/lanceliogs/snackbox installer

CI/CD with GitHub Actions

Build Windows installers in your GitHub pipeline using the Docker image:

name: Build Windows Installer

on:
  push:
    tags: ["v*"]

jobs:
  build-installer:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Build Windows installer
        run: |
          docker run --rm \
            -v "${{ github.workspace }}:/project" \
            ghcr.io/lanceliogs/snackbox:latest \
            installer

      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: windows-installer
          path: dist/*.exe

Uploading to GitHub Releases

Add a release job that attaches the installer to a GitHub release:

  release:
    needs: build-installer
    runs-on: ubuntu-latest
    permissions:
      contents: write

    steps:
      - uses: actions/download-artifact@v4
        with:
          name: windows-installer
          path: dist/

      - name: Create GitHub Release
        uses: softprops/action-gh-release@v2
        with:
          files: dist/*.exe

Or use the GitHub CLI directly:

      - name: Upload to release
        env:
          GH_TOKEN: ${{ github.token }}
        run: gh release upload "${{ github.ref_name }}" dist/*.exe

See examples/ for complete workflow examples.

License

MIT

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

snackbox-0.2.0.tar.gz (21.9 kB view details)

Uploaded Source

Built Distribution

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

snackbox-0.2.0-py3-none-any.whl (28.9 kB view details)

Uploaded Python 3

File details

Details for the file snackbox-0.2.0.tar.gz.

File metadata

  • Download URL: snackbox-0.2.0.tar.gz
  • Upload date:
  • Size: 21.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for snackbox-0.2.0.tar.gz
Algorithm Hash digest
SHA256 f9e6e243d676caeeb4c121bcba02953e50cbe1474a1a5f1be6d94bc8bf2c1c78
MD5 837adcb7191602bc4486640a51738ef0
BLAKE2b-256 86442b02afc5ae5a782d1fe57f65fdfb25a07fe9efc98acfafbba457a42de647

See more details on using hashes here.

Provenance

The following attestation bundles were made for snackbox-0.2.0.tar.gz:

Publisher: release.yml on Lanceliogs/snackbox

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

File details

Details for the file snackbox-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: snackbox-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 28.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for snackbox-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 216a9e51d01d2d6e09b3a82b71025c123ba6391bd7da18c078bf6c2eaae52452
MD5 f746b7c6d2dca8149301e2a0af3706ef
BLAKE2b-256 e60977e7013a566d84728a8ac5b5d8c93398933c897b294d09a3ab40f5284293

See more details on using hashes here.

Provenance

The following attestation bundles were made for snackbox-0.2.0-py3-none-any.whl:

Publisher: release.yml on Lanceliogs/snackbox

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