Flavorpack

Ship any Python application as a single, self-contained executable.
Native launcher. Cryptographic signing. No runtime required.

One file. Runs anywhere.

Flavorpack packages Python applications into .psp executables — single files that the OS runs directly. No Python installation required. No virtual environments. No dependency conflicts.

Each package bundles a native launcher (Go or Rust), the Python runtime, your application code, and all dependencies. The launcher extracts and runs everything transparently, with intelligent caching so subsequent runs skip the extraction step entirely.

The format is language-agnostic. A single package can contain Python code, compiled native binaries, data files, and assets — whatever your application needs.

6Target platforms
2Native launchers
Ed25519Signing by default
PSPFOpen format spec
Progressive Secure Package Format.

PSPF 2025 is a polyglot binary — simultaneously a native OS executable and a structured data archive. The same file that runs on Linux runs on macOS.

Native launcher
Go or Rust binary, 1–5 MB. The OS entry point — reads its own file structure, verifies the signature, manages extraction and execution.
~1–5 MB
Index block
8,192-byte header containing package metadata offsets, slot descriptors, and the Ed25519 cryptographic signature.
8 KB
Metadata
Gzipped JSON: package name, version, build provenance, entry point, environment configuration, and SBOM attestation.
1–10 KB
Slot 0 — Runtime
The bundled execution environment — interpreter, standard library, or native runtime. Language-agnostic. Extracted to workenv on first run, cached for all subsequent runs.
varies
Slot 1 — Application code
Your package, dependencies, and any data files. Encoded per the slot's operation chain (e.g. tar+gzip). Lifecycle controls caching behavior.
varies
Slot N — Additional slots
Optional: native binaries, model weights, schemas, media, or any additional resource. Each slot is independently lifecycle-managed.
optional

Each slot is a 64-byte descriptor specifying type, encoding, offset, size, lifecycle, permissions, and platform requirements. Up to 8 chained operations per slot allow transformation pipelines (e.g. tar → gzip).

persistentCached across runs until the package version changes
cachedCached and reused; invalidated by checksum mismatch
lazyNot extracted until the slot's content is first accessed
volatileDeleted immediately after initialization — frees space
temporaryDeleted on process exit
Native execution. Zero overhead.

Every .psp package embeds a native launcher — compiled Go or Rust — that runs at OS speed before any Python code starts. The launcher owns the full execution lifecycle.

Rust launcher Default

~1 MB. Optimised for size and memory efficiency. The smallest possible footprint without sacrificing correctness. Preferred for production packages.

musl static linking on Linux Universal binary on macOS Smallest package size
Go launcher

~3–4 MB. Broader platform compatibility and faster compile times during development. Functionally identical to the Rust launcher.

Easier to build from source Wider platform reach Same PSPF compatibility
1
Locate index — reads its own size to find the index block offset. No external manifest needed.
2
Verify signature — Ed25519 check against the public key in the index. Tampered packages halt here.
3
Check cache — generates a workenv ID from package name, version, and checksum. If valid cache exists, skip extraction.
4
Extract slots — decompress and write only the slots needed, respecting lifecycle rules. Lazy slots wait until accessed.
5
Execute — set FLAVOR_* environment variables, configure the Python path, and exec the entry point. Returns the app's exit code.
Persistent caching. Fast cold starts.

Extracting a 40 MB Python runtime on every invocation would be unusable. The workenv solves this: slots are extracted once to ~/.cache/flavor/workenv/{id} and reused across runs. Checksums verify integrity on each startup.

When you update a package, the ID changes and a fresh workenv is created. Old workenvs can be pruned with flavor workenv clean.

# List cached packages
flavor workenv list

# Show cache statistics
flavor workenv info

# Remove a specific package's cache
flavor workenv remove terraform-provider-mycloud

# Clean everything older than 30 days
flavor workenv clean --older-than 30d
Signed by default. Verified on every run.

Cryptographic signing is not an option — it's the default. Every package includes an Ed25519 signature verified by the launcher before any code executes.

🔑

Ed25519 Signing

Every package is signed automatically at build time. The public key is embedded in the index block; the launcher verifies before extraction.

🔒

Multi-level Checksums

CRC32 on the index block. SHA-256 on metadata, each slot, and extracted files. Tampering at any layer is detected.

📋

SBOM Attestation

Embed a CycloneDX 1.6 Software Bill of Materials. Inspectable with flavor inspect --sbom for supply chain transparency.

🔁

Deterministic Builds

Use --key-seed to generate identical packages across CI builds — same binary, same signature, fully reproducible.

📜

Execution Policies

System and user policy files (/etc/flavor/policy.toml) enforce constraints: require signatures, block running as root, mandate SBOM.

🛡️

Path Isolation

All extraction paths are sanitized. Slot contents cannot traverse outside their designated workenv directory.

Any Python app. One file.
🔧

CLI Tools

Distribute command-line utilities without requiring users to install Python, pip, or manage virtual environments.

🏗️

Terraform Providers

Package pyvider providers as single executables compatible with Terraform's plugin protocol. The primary use case for the pyvider ecosystem.

🤖

ML & Data Apps

Bundle Python runtime, model weights, and inference code into a single portable artifact. Eliminates "works on my machine" entirely.

🏢

Enterprise Distribution

Sign packages with your organisation's keys. Enforce policies at the OS level. Distribute with cryptographic provenance.

⚙️

DevOps Tooling

Deployment scripts, configuration managers, monitoring agents — ship as single files with no runtime dependency.

🧬

Polyglot Applications

Mix Python code, compiled native binaries, and data files in one package. The slot system handles each component independently.

From source to executable.

1. Configure your manifest

pyproject.toml
[project]
name = "my-tool"
version = "1.0.0"
dependencies = ["mypackage>=1.0"]

[tool.flavor]
type          = "cli"

[tool.flavor.execution]
command = "{workenv}/bin/python"
args    = ["-m", "mypackage.cli"]

2. Pack and run

terminal
# Install Flavorpack
uv tool install flavorpack

# Package your application
flavor pack --manifest pyproject.toml \
           --output my-tool.psp

# Inspect the package
flavor inspect my-tool.psp

# Run it directly — no Python needed
./my-tool.psp --help
Cross-compile from a single machine.

Build for any supported platform without a matching machine. Linux builds use static musl linking — no glibc version requirements.

🐧
linux_amd64
Static musl — any distro
🐧
linux_arm64
Static musl — any distro
🍎
darwin_amd64
macOS 11+, Intel
🍎
darwin_arm64
macOS 11+, Apple Silicon
🪟
windows_amd64
Windows
🪟
windows_arm64
Windows
# Cross-compile for all current platforms
for platform in linux_amd64 linux_arm64 darwin_arm64 darwin_amd64; do
  flavor pack --platform $platform --output my-tool_$platform.psp
done
Different approach.

Other tools try to compile Python away. Flavorpack bundles it — intact, cached, and fast.

Flavorpack
PyInstaller
Nuitka
AppImage
Single file
No Python required
Native launcher (Go/Rust)
Cryptographic signing
Smart caching / workenv
SBOM / supply chain
Polyglot slots (native + Python)
Cross-compile
Linux (static musl)
partial
partial
Ready to ship?

Full documentation, guides, and the PSPF format specification.