PackageTrack
Sign in Get early access

serious_python

A cross-platform plugin for adding embedded Python runtime to your Flutter apps.

4.5.1 22K downloads/mo #2100 most downloaded on pub.dev flet-dev/serious-python

What this package is like to depend on

Last release 24 days ago

31 Jul 2026

Release timing varies

gaps range from 9 days to 2 months

Nearly every release is documented

notes for 60 of 60 stable releases

Nothing withdrawn

no release was ever pulled

3 years old

60 releases · first in 2023

30 releases in the last 12 months

see the full history below

Release timeline

60 releases · Jun 2023 to Jul 2026
2024 2025 2026
Release Pre-release

Releases

latest 60
  1. 4.5.1 31 Jul 2026
    Release notes

    What's Changed

    Full Changelog: v4.5.0...v4.5.1

    Open source →
    Release notes
    • iOS/macOS: the bundled Python, dart_bridge and stdlib extension XCFrameworks are now signed on both layers — each slice's inner .framework as well as the outer .xcframework. 4.5.0 signed only the outer bundle. Note this did not change isSecureTimestamp, which still reports false — that field appears not to be reachable by signing; signed, which ITMS-91065 names, is true. See serious_python_darwin 4.5.1.
    • Packaging now verifies both layers, so an unsigned slice fails the build instead of surfacing in an App Store submission. Set SERIOUS_PYTHON_VERIFY_PROVIDER_SIGNATURES=require for release builds.
    • Bundled python-build snapshot re-pinned to 20260730 (dart_bridge 1.7.0 → 1.7.1). No Python version moved — 3.12.13 / 3.13.14 / 3.14.6 and Pyodide are unchanged from 20260729.
    Open source →
  2. 4.5.0 29 Jul 2026
    Release notes

    What's Changed

    • Bump to 4.5.0: preserve provider XCFramework signatures through staging by @FeodorFitsner in #244

    Full Changelog: v4.4.2...v4.5.0

    Open source →
    Release notes
    • iOS/macOS: the pre-built Python, dart_bridge and stdlib extension XCFrameworks are now staged byte-for-byte and never modified. SERIOUS_PYTHON_BUNDLE_ID now namespaces only the frameworks built from your app's wheels; the pre-built ones keep the stable dev.flet.* identifiers their publisher assigned.
    • This corrects 4.4.2. Rewriting those identifiers was a hypothesis for the ITMS-91065: Missing signature App Store rejection (flet-dev/flet#6724) and it was wrong — the rejection reports on the publisher's signature of each XCFramework, which Xcode records in the IPA separately from your app's own signature, and the identifier rewrite destroyed it. See serious_python_darwin for the full explanation.
    • iOS: use the Swift Package Manager packaging path for App Store submissions. The CocoaPods path copies inner .framework bundles and cannot produce the SDK-origin signature receipts Apple's scan looks for; it now warns during the build.
    • New SERIOUS_PYTHON_VERIFY_PROVIDER_SIGNATURES (warn default / require / off) and SERIOUS_PYTHON_EXPECTED_TEAM_ID env vars verify those publisher signatures during packaging. Set require for release builds.
    • Bundled python-build snapshot re-pinned to 20260729 (dart_bridge 1.6.1 → 1.7.0). No Python version moved — 3.12.13 / 3.13.14 / 3.14.6 and Pyodide are unchanged from 20260727 — but every Apple XCFramework in that release is now signed by the Flet publishing team with a secure timestamp. See serious_python_darwin 4.5.0.
    Open source →
  3. 4.4.2 27 Jul 2026
    Release notes

    What's Changed

    • Bump to 4.4.2: Xcode build-provenance keys in iOS framework Info.plists by @FeodorFitsner in #242

    Full Changelog: v4.4.1...v4.4.2

    Open source →
    Release notes
    • iOS: new SERIOUS_PYTHON_BUNDLE_ID env var namespaces the generated frameworks' bundle identifiers under your app (com.example.myapp.-ssl) instead of a shared org.python.* default identical in every app built with serious_python. flet build sets it for you; set it yourself for a manual two-step build, in both places you set SERIOUS_PYTHON_SITE_PACKAGES.
    • iOS: the bundled Python frameworks (_ssl, _hashlib and every other native extension) now carry the build-provenance keys Xcode stamps into a real framework's Info.plist, instead of a minimal hand-written one.
    • Both are hypotheses under test for the ITMS-91065: Missing signature App Store rejection in flet-dev/flet#6724 — neither is a confirmed fix. Only new App Store submissions are affected by that rejection; existing published apps are not. See serious_python_darwin 4.4.2.
    • Bundled python-build snapshot re-pinned to 20260727. No versions moved — Python (3.12.13 / 3.13.14 / 3.14.6), Pyodide, and dart_bridge 1.6.1 are unchanged from 20260726.
    Open source →
  4. 4.4.1 26 Jul 2026
    Release notes

    What's Changed

    Full Changelog: v4.4.0...v4.4.1

    Open source →
    Release notes
    • iOS: the bundled _ssl and _hashlib frameworks now ship OpenSSL's official privacy manifest instead of an incomplete stub, correcting what they declare under Apple's third-party SDK requirements. This is a correctness fix and is not expected to resolve the ITMS-91065: Missing signature App Store rejection reported in flet-dev/flet#6724, which remains under investigation. See serious_python_darwin 4.4.1.
    • Bundled python-build snapshot re-pinned to 20260726. No versions moved — Python (3.12.13 / 3.13.14 / 3.14.6), Pyodide, and dart_bridge 1.6.1 are unchanged from 20260725.
    Open source →
  5. 4.4.0 25 Jul 2026
    Release notes

    What's Changed

    • Bump to 4.4.0: dart_bridge as a dynamic framework on Apple platforms by @FeodorFitsner in #240

    Full Changelog: v4.3.6...v4.4.0

    Open source →
    Release notes
    • iOS/macOS: fix built iOS apps crashing at startup with Failed to lookup symbol 'serious_python_run'. dart_bridge now ships as a dynamic framework, so the FFI entry points Dart and Python resolve via dlsym stay exported; previously it was static-linked into the app executable, which exports nothing. Release/device builds only. See serious_python_darwin 4.4.0.
    • Bundled python-build snapshot re-pinned to 20260725 (dart_bridge 1.5.1 → 1.6.1, which carries the dynamic-framework change above; Pyodide 3.14 314.0.2 → 314.0.3). Python versions (3.12.13 / 3.13.14 / 3.14.6) are unchanged.
    Open source →
  6. 4.3.6 20 Jul 2026
    Release notes

    What's Changed

    • Bump to 4.3.6: Windows UTF-8 startup fix (dart_bridge 1.5.1, python-build 20260720) by @FeodorFitsner in #238
    • fix(android): make PEP 734 subinterpreters work (concurrent.interpreters / InterpreterPoolExecutor) by @ndonkoHenri in #239

    Full Changelog: v4.3.4...v4.3.6

    Open source →
    Release notes
    • Android: PEP 734 subinterpreters (Python 3.14's concurrent.interpreters / InterpreterPoolExecutor) now work in built apps. Previously the main interpreter could import them, but every subinterpreter failed to import any relocated C extension (ModuleNotFoundError: _struct / _interpqueues / ...) — which broke the whole feature (its cross-interpreter transport pickles → _struct, and its queues need _interpqueues). The native-module finder lives on sys.meta_path, which is per-interpreter, and was installed only in the main interpreter. See serious_python_android 4.3.6.
    • Windows: fix startup with non-ASCII app paths or environment values — Dart FFI strings (UTF-8) are now converted to UTF-16 before being passed to the Windows CRT, so paths/env values are no longer corrupted through the process ANSI code page, and Python UTF-8 mode is enabled before Py_Initialize(). See serious_python_windows 4.3.6 and flet-dev/flet#6641.
    • Bundled python-build snapshot re-pinned to 20260720 (dart_bridge 1.5.0 → 1.5.1, which carries the Windows fix above). Python versions (3.12.13 / 3.13.14 / 3.14.6) are unchanged.
    Open source →
  7. 4.3.4 19 Jul 2026
    Release notes

    What's Changed

    Full Changelog: v4.3.3...v4.3.4

    Open source →
    Release notes
    • Windows/Linux: desktop apps on Python 3.14 no longer crash at startup with ModuleNotFoundError: No module named '_pyrepl' when the app (or a dependency, e.g. NLTK) imports pydoc or pdb. _pyrepl was pruned from the desktop stdlib as a dev-only module, but 3.14's pydoc/pdb import it at module load. See serious_python_windows / serious_python_linux 4.3.4 and flet-dev/serious-python#236.
    • Bundled python-build snapshot re-pinned to 20260719; the only change vs 20260714 is the desktop _pyrepl un-prune above. All runtime versions (Python 3.12.13 / 3.13.14 / 3.14.6, dart_bridge 1.5.0) are unchanged from 4.3.3.
    • Android: fix code edits not taking effect under flet debug android — the app kept running stale code after a re-run because the on-device extraction cache wasn't invalidated by a same-version reinstall. See serious_python_android 4.3.4 and flet-dev/flet#6682.
    Open source →
  8. 4.3.3 16 Jul 2026
    Release notes

    What's Changed

    Full Changelog: v4.3.2...v4.3.3

    Open source →
    Release notes
    • Windows: fix flet build windows failing on non-UTF-8 system locales (e.g. Simplified-Chinese Windows, code page 936/GBK) with error C2220 (escalated from warning C4819) while compiling the Windows plugin — a non-ASCII character in a source comment couldn't be decoded under GBK and the Flutter template's /WX made it fatal. The character is removed and the plugin now builds with /utf-8. See serious_python_windows 4.3.3 and flet-dev/flet#6686.
    • No runtime changes: bundled Python versions (3.12.13 / 3.13.14 / 3.14.6) and dart_bridge (1.5.0) are unchanged from 4.3.2.
    Open source →
  9. 4.3.2 14 Jul 2026
    Release notes

    What's Changed

    • Bump to 4.3.2: python-build 20260712 (Android mimalloc seccomp crash, mobile _pyrepl restored) by @FeodorFitsner in #230
    • Mobile packaging fixes: iOS interdependent-dylib frameworks + Android native-init packages by @ndonkoHenri in #232
    • Re-pin python-build to 20260714: iOS _posixshmem restored (multiprocessing imports) by @FeodorFitsner in #233

    Full Changelog: v4.3.1...v4.3.2

    Open source →
    Release notes
    • iOS: interdependent bundled dylibs (e.g. pyarrow, llama-cpp-python) no longer crash the app at launch with dyld: Library not loaded: @rpath/lib<X>.dylib — the framework install-ids and sibling @rpath references are reconciled to the relocated framework paths (#223). See serious_python_darwin 4.3.2.
    • Android: fix import <pkg> yielding an empty module for a package whose __init__ is itself the native extension (e.g. apsw) — the extension is now resolved from its <pkg>/__init__.soref marker. See serious_python_android 4.3.2.
    • Bump the bundled python-build snapshot to 20260714, fixing three on-device crashes. Bundled Python versions (3.12.13 / 3.13.14 / 3.14.6) and dart_bridge (1.5.0) are unchanged from 4.3.1.
    • Android: fix 3.13/3.14 apps crashing with SIGSYS before any app code runs on x86_64 (and other ABIs with a 32-bit-style SYS_open) — mimalloc's raw open(2) syscall is forbidden by Android's seccomp policy. See serious_python_android 4.3.2.
    • iOS/Android: _pyrepl is no longer pruned from the mobile stdlib — Python 3.14's pdb imports it at module load, so anything importing pdb (e.g. pytest's debugging plugin) failed with ModuleNotFoundError: No module named '_pyrepl'. See serious_python_darwin / serious_python_android 4.3.2.
    • iOS: import multiprocessing (e.g. via scikit-learn/joblib) no longer fails with ModuleNotFoundError: No module named '_posixshmem' — the _posixshmem extension is now built into the iOS runtimes alongside _multiprocessing. See serious_python_darwin 4.3.2.
    Open source →
  10. 4.3.1 10 Jul 2026
    Release notes
    • Android: fix flet build apk --arch x86_64 (or any --arch subset not including arm64-v8a) producing an APK with an empty sitepackages.zip — the app shipped without its Python dependencies and the first import failed at startup. See serious_python_android 4.3.1.
    Open source →
  11. 4.3.0 09 Jul 2026
    Release notes
    • Desktop multiprocessing support (flet-dev/flet#4283). dart_bridge 1.5.0 adds serious_python_is_mp_invocation / serious_python_main (+ _w wide-char variants on Windows): host apps call them first thing in main to detect CPython child command lines (--multiprocessing-fork, -c "from multiprocessing..." — spawn workers, the resource tracker, and the forkserver) and service them as a plain headless interpreter (Py_Main/Py_BytesMain, stable ABI) instead of re-launching the GUI. The exports rely on the PYTHONHOME/PYTHONPATH the parent already stamped process-wide.
    • PYTHONINSPECT=1 is no longer set by any platform implementation. It had no effect on the embedded interpreter, but it leaked into the process environment where any real interpreter child (e.g. a serviced multiprocessing worker) would inherit it and hang in interactive mode after its command completed.
    • Bump the bundled python-build snapshot to 20260708, which delivers dart_bridge 1.5.0; Pyodide for 3.14 bumped 314.0.1 → 314.0.2. Bundled Python versions are unchanged from 4.2.1 (3.12.13 / 3.13.14 / 3.14.6).
    • Windows: fix flet build windows failing with file INSTALL cannot find "C:/WINDOWS/System32/vcruntime140_1.dll" for users who build with VS Build Tools rather than full Visual Studio (a WOW64 file-system-redirection issue with the bundled 32-bit cmake). See serious_python_windows 4.3.0.
    Open source →
  12. 4.2.1 02 Jul 2026
    Release notes
    • iOS/macOS: ctypes packages that ship plain .dylib shared libraries (e.g. llama-cpp-python's libllama / libggml) now load on the iOS simulator. Such .dylibs are now packaged as per-slice xcframeworks (previously only .so C-extensions were), so they carry a simulator slice instead of shipping the device build and failing dlopen with incompatible platform (have 'iOS', need 'iOS-simulator'); their install-name is preserved so multi-lib packages still resolve their sibling libs. See serious_python_darwin 4.2.1.
    • iOS: the _multiprocessing extension is now built into the runtime (importable, not spawnable) via flet-dev/python-build 20260701. Bundled Python versions are unchanged from 4.2.0 (3.12.13 / 3.13.14 / 3.14.6).
    Open source →
  13. 4.2.0 01 Jul 2026
    Release notes
    • Android: armeabi-v7a (32-bit ARM) is now bundled for Python 3.13 and 3.14, not just 3.12 — flet-dev/python-build 20260630 publishes 32-bit ARM runtimes for those minors (built with dart_bridge 1.4.1). The package command's hardcoded "3.12-only" armeabi-v7a skip is replaced by a manifest-driven check against each minor's PythonRelease.androidAbis, so the wheel fan-out (and the Android plugin's abiFilters) follow whatever python-build publishes per minor.
    • Bundle 3.12.13 / 3.13.14 / 3.14.6 (python-build 20260630; CPython-standalone 20260623); Pyodide 0.27.7 / 0.29.4 / 314.0.1 (3.14 bumped 314.0.0 → 314.0.1).
    Open source →
  14. 4.1.1 29 Jun 2026
    Release notes
    • Android: fix two startup crashes — apps crashing on launch on Android 8.1 and below (API < 28) due to an unguarded getLongVersionCode() call, and the interpreter failing to start on a non-primary ABI (e.g. an x86_64 emulator) with ModuleNotFoundError: No module named '_sysconfigdata__android_<arch>-linux-android'. See serious_python_android 4.1.1.
    Open source →
  15. 4.1.0 25 Jun 2026
    Release notes
    • Android: run first-launch asset unpacking and native library loading off the platform main thread so they no longer block vsync — boot-time animations (e.g. a splash / boot screen spinner) stay smooth while the app starts. Also ship consumer ProGuard rules that keep the pyjnius bootstrap classes, fixing pyjnius in release (minified) Android builds. See serious_python_android 4.1.0.
    Open source →
  16. 4.0.0 22 Jun 2026
    Release notes
    • App packaging lifted into serious_python. Your Python app now ships unpacked inside the application bundle, next to the Python stdlib and site-packages, on macOS / iOS / Windows / Linux — no first-launch app.zip extraction. On Android the app ships as a stored app.zip asset inside the APK and is unpacked once (version-keyed) to the app-support files dir on the first launch after an install/update, like the existing extract.zip. Web (Pyodide) is unchanged. The package command stages the processed app into SERIOUS_PYTHON_APP (symmetric with SERIOUS_PYTHON_SITE_PACKAGES); each platform's native build copies it into the bundle (Android zips it as a stored asset).
    • New SeriousPython.prepareApp() — materializes the app (Android first-launch unpack) and returns the directory containing its entry point. SeriousPython.run() now takes no assetPath argument (it resolves the app via prepareApp()), sets the current directory to a writable per-app data dir (<application-support>/data) — not the read-only bundle — so relative file writes / SQLite work, and runs main.pyc/main.py (or appFileName).
    • Breaking change: the app.zip asset convention and the runtime zip-extraction API are removed — SeriousPython.run("app/app.zip"), extractAssetZip, and extractFileZip no longer exist. Repackage with dart run serious_python:main package <app> -p <platform> and call SeriousPython.run() with no arguments.
    • Android: the runtime payload moved to <application-support>/flet/{app, stdlib.zip, sitepackages.zip, extract/} (resolved via getApplicationSupportDirectory(); the custom getFilesDir method channel is dropped). User data in the sibling <application-support>/data survives app updates.
    • Swift Package Manager (darwin) staging in the package command — on by default. For iOS/macOS the package command runs the host-side equivalent of the podspec prepare_command (which SPM has no hook for) by resolving serious_python_darwin's darwin/ dir (SERIOUS_PYTHON_DARWIN_DIR override, else the project's package_config.json), invoking prepare_spm.sh, and writing the SP_NATIVE_SET cache-bust key to build/.serious_python_spm_key (overridable via SERIOUS_PYTHON_SPM_KEY_FILE) for the caller to export into the flutter build environment. SPM is Flutter's default darwin integration since 3.44, so this happens by default — set SERIOUS_PYTHON_DARWIN_SPM to a falsy value (0/false/no/off) to opt out and build with CocoaPods (the podspec stages then). See serious_python_darwin 4.0.0.
    Open source →
  17. 3.0.0 18 Jun 2026
    Release notes
    • New in-process transport (dart_bridge FFI). SeriousPython.run can now run the embedded interpreter in-process through the dart_bridge FFI bridge instead of talking to it over a socket. The Python lifecycle (initialize / run / teardown) is absorbed into the dart_bridge native library on every platform — dart_bridge.xcframework (iOS/macOS), libdart_bridge.so (Android/Linux), and dart_bridge.dll / dart_bridge.pyd (Windows) — and a new PythonBridge API exposes a MsgPack control channel plus dedicated binary data channels between Dart and Python. See the bridge_example app. The bundled dart_bridge is 1.4.0.
    • Android native packaging — memory-mapped from the APK. Python extension modules are relocated into jniLibs and loaded directly from the APK (mmap, no extraction) by a custom importer that resolves them from .soref markers; pure Python ships in stored, ABI-common asset zips read via zipimport (no per-ABI duplication). Apps no longer need useLegacyPackaging / keepDebugSymbols — the brittle per-app packaging config is gone. Set SERIOUS_PYTHON_ANDROID_EXTRACT_PACKAGES (comma-separated relative paths) to ship path-hungry packages extracted to disk. The dart-bridge Android binary uses the full CPython API (PyConfig) to install the importer before site runs.
    • Breaking change: requires Flutter 3.44.2 / Dart 3.12+. The Android plugin moves to AGP 8.11.1, compileSdk 36, Java 17, and the Kotlin-DSL Gradle build (build.gradle.kts).
    • Python runtime versions are now a committed snapshot of flet-dev/python-build's date-keyed manifest.json, generated by dart run serious_python:gen_version_tables. SERIOUS_PYTHON_VERSION (short, e.g. 3.14) is the single input — the full CPython version, python-build release date, Pyodide version + platform tag, and dart_bridge version all derive from it. SERIOUS_PYTHON_FULL_VERSION, SERIOUS_PYTHON_BUILD_DATE, and DART_BRIDGE_VERSION remain as rarely-needed escape hatches. The native build configs (Android build.gradle, Darwin podspec, Linux/Windows CMakeLists.txt) read the generated python_versions.properties, and a CI job fails if the snapshots drift from the manifest. This replaces the per-config hardcoded defaults and the flet build-exported SERIOUS_PYTHON_FULL_VERSION / SERIOUS_PYTHON_BUILD_DATE introduced in 2.0.0.
    • Bundle 3.12.13 / 3.13.14 / 3.14.6 (python-build 20260614); Pyodide 0.27.7 / 0.29.4 / 314.0.0 (314.0.0 GA, up from the 314.0.0a2 in 2.0.0).
    • Add dart run serious_python:main version [--json] — prints the serious_python version, the pinned python-build release, and the supported Python / Pyodide / dart_bridge matrix.
    • The embedded Darwin runtime re-extracts when the selected Python version changes (a version marker guards dist_ios / dist_macos), so a clean build after switching --python-version can't mix C-extension ABIs (bad magic number / unknown slot ID).
    • Cache downloaded Python distributions and dart_bridge artifacts under $FLET_CACHE_DIR (default ~/.flet/cache) across all platforms.
    • Remove the scaffold getPlatformVersion method from the platform plugins.
    • Drop the x86 (32-bit Intel) Android ABI — Flutter no longer produces it. Android builds target arm64-v8a + x86_64 (plus armeabi-v7a on Python 3.12); the x86 wheel platform-tag entry and the Android packaging rules referencing it are removed.
    • Android ABI list now reads from python-build's manifest (per-minor android_abis, surfaced as <short>.android_abis in python_versions.properties and PythonRelease.androidAbis in the generated Dart) instead of the hardcoded if pythonVersion == "3.12" branch in serious_python_android/android/build.gradle.kts. Drives both defaultConfig.ndk.abiFilters and the per-ABI download/copy fan-out; adding a future minor only needs the one-line manifest edit.
    • Breaking change: the configure command (and the bare in-place version-switching machinery, including stageDarwinRuntime) is removed. Switching the bundled Python version between builds is now handled by a clean rebuild — flet build wipes its build dir on a version change, and the Darwin dist_ios / dist_macos version marker re-extracts the runtime — so a separate serious_python configure step is no longer needed.
    • Bug fix: the Pyodide 0.29 wheel platform tag for the 3.13 row was pyodide-2025.0-wasm32, but Pyodide publishes 0.29 wheels under pyemscripten_2025_0_wasm32; corrected to pyemscripten-2025.0-wasm32 so flet build web --python-version 3.13 matches native wheels.
    Open source →
  18. 2.0.0 07 Jun 2026
    Release notes
    • Breaking change: the package command's default Python is now the latest supported stable (3.14), up from the previously implicit 3.12. Scripts that ran dart run serious_python:main package … without --python-version will now download CPython 3.14, install 3.14 wheels, and use the matching Pyodide / Android platform tags. Pin explicitly with --python-version 3.12 (or SERIOUS_PYTHON_VERSION=3.12) to preserve the old behavior.
    • Breaking change: Android sysconfig.get_platform() tag format changed from android-24-arm64-v8a to android-24-arm64_v8a (and similarly for armeabi-v7a). The emitted wheel tag (android_24_arm64_v8a) is unchanged, but anything reading the raw sysconfig.get_platform() string from sitecustomize.py should switch separators.
    • Breaking change: Windows host arch identifier dropped the -shared suffix (x86_64-pc-windows-msvc-sharedx86_64-pc-windows-msvc); follows astral-sh/python-build-standalone, which only publishes the combined (already shared) install_only_stripped build.
    • Multi-version Python support. The package command accepts --python-version (or SERIOUS_PYTHON_VERSION env var) to select between Python 3.12 / 3.13 / 3.14. The matching CPython-standalone build, Pyodide release, and Emscripten wheel platform tag are looked up from a new _pythonReleases table. Adding a future pre-release line (e.g. 3.15 beta) is a one-row append with prerelease: true; the Flet CLI uses that flag to keep open-ended requires-python specifiers (>=3.14) on stable, while still letting --python-version 3.15 or ==3.15.* opt in.
    • The Emscripten pip platform tag is now derived per Python release (e.g. pyodide-2024.0-wasm32 for 0.27.7, pyemscripten-2026.0-wasm32 for 314.0.0a2), via a pyodide_platform_tag field in the version registry. The previous static pyodide-2024.0-wasm32 entry in platforms["Emscripten"] has been removed.
    • sitecustomize.py now shims platform.android_ver so the new pip / packaging that ships with python-build-standalone 20260602+ can compute Android wheel tags on Python 3.12 hosts (where android_ver didn't exist) and on Python 3.13+ hosts (where it returns api_level=0 off-device).
    • Skip 32-bit Android ABIs (armeabi-v7a, x86) when Python ≥ 3.13 — PEP 738 dropped 32-bit Android support, and flet-dev/python-build no longer publishes those runtimes for those versions.
    Open source →
  19. 1.0.1 06 Jun 2026
    Release notes

    Improvements

    • Cache downloaded Python distribution tarballs (python-android-dart-<py>-<abi>.tar.gz) across builds. The downloadDistArchive_* Gradle tasks now write to a persistent cache directory — $FLET_CACHE_DIR/python-build/v<python_version>/ if the env var is set, otherwise ~/.flet/cache/python-build/v<python_version>/ — and use onlyIfModified true + useETag "all" so subsequent builds issue a conditional GET (If-None-Match / If-Modified-Since) against objects.githubusercontent.com instead of re-downloading 30–100 MB per ABI per build. When the upstream release republishes a tarball at the same URL (e.g. a Python patch update under the existing v<py> release), the validators flip and the cache refreshes automatically; otherwise the build skips the download entirely. tempAndMove true guards against partial downloads being kept in the cache (flet-dev/flet#6555, #208) by @FeodorFitsner.

    Bug fixes

    • Set PIP_REQUIRE_VIRTUALENV=false for pip install in the package command so packaging works in environments where users have globally exported PIP_REQUIRE_VIRTUALENV=true (#202, #204) by @FeodorFitsner.
    Open source →
  20. 1.0.0 12 May 2026
    Release notes
    • Breaking change: --platform argument value Pyodide has been renamed to Emscripten to match what platform.system() returns in the Pyodide runtime, so PEP 508 markers like platform_system != 'Emscripten' work consistently.
    Open source →
  21. 0.9.12 03 May 2026
    Release notes
    • Fix web packaging to skip site-packages when appropriate (#199).
    Open source →
  22. 0.9.11 01 Mar 2026
    Release notes
    • Disable user-site packages in pip environment (#195).
    Open source →
  23. 0.9.10 21 Feb 2026
    Release notes
    • Android: Add debug logs and deduplicate FFI imports.
    • Android: Invalidate extracted assets when version keys change.
    Open source →
  24. 0.9.9 31 Jan 2026
    Release notes
    • Add zipDirectoryPosix to create POSIX-compliant app archives on Windows.
    • Enforce C++20 standard for serious_python plugin build.
    • Fix: Normalize WINDIR path for bundled DLLs in CMake.
    • Fix Logcat logging crash on some Android devices.
    Open source →
  25. 0.9.8 22 Dec 2025
    Release notes
    • Fix logging on Android.
    Open source →
  26. 0.9.7 18 Dec 2025
    Release notes
    • Fix app restart on Android 10.
    • Redirect Python output to logcat.
    Open source →
  27. 0.9.6 02 Dec 2025
    Release notes
    • Make zipDirectory call asynchronous.
    Open source →
  28. 0.9.5 01 Dec 2025
    Release notes
    • Bump archive to ^4.0.7.
    • Fixed iOS framework identifier generation.
    Open source →
  29. 0.9.4 21 Oct 2025
    Release notes
    • 16 KB memory page support for Android 15+ (by @ReYaNOW).
    Open source →
  30. 0.9.3 19 Oct 2025
    Release notes
    • Fix: Hidden files in site-packages are skipped when building macOS app.
    • Fix: Do not delete package metadata in .dist-info directories (#164).
    Open source →
  31. 0.9.2 11 Mar 2025
    Release notes
    • Breaking change: multiple --requirements options of package command must be passed as --requirements DEP_1 --requirements DEP_2 ... (or -r DEP_1 -r DEP_2 ...) instead of -r DEP_1,DEP_2,... to support dependency specifications with commas, e.g. pandas>=2.2,<3.
    • Fix site-packages packaging for Pyodide platform.
    Open source →
  32. 0.9.1 05 Mar 2025
    Release notes
    • Fix serious_python to work on macOS 12 Monterey and built with Xcode 14.
    Open source →
  33. 0.9.0 20 Feb 2025
    Release notes
    • Set MinimumOSVersion to 13.0 for generated Python frameworks.
    • iOS and macOS packaging: Python system libraries are put into python.bundle to pass App Store verification.
    • On macOS, Windows, and Linux, application site packages are copied in an unpacked state to the application bundle to speed up the first launch.
    • Pyodide 0.27.2
    • Python 3.12.9
    • Packaging --cleanup option replaced with two separate --cleanup-app and --cleanup-packages options.
    • New packaging options --cleanup-app-files and --cleanup-package-files to specify a list of globs to exclude files and directories from app and site packages.
    • New packaging --skip-site-packages option to skip site packages installation for faster re-builds.
    • Packaging --arch option accepts a list now.
    Open source →
  34. 0.8.7 07 Jan 2025
    Release notes
    • Fixed: xcframeworks migration script didn't work for sub-directories.
    Open source →
  35. 0.8.6 06 Jan 2025
    Release notes
    • Added com.flet.serious_python_android.PythonActivity holder class with mActivity holding a reference to an app MainActivity. Needed for plyer.
    • Android plugin sets MAIN_ACTIVITY_HOST_CLASS_NAME environment variable with the name of activity holder class name (com.flet.serious_python_android.PythonActivity).
    • Android plugin sets MAIN_ACTIVITY_CLASS_NAME environment variable with a class name of an app MainActivity.
    • Android plugin sets ANDROID_NATIVE_LIBRARY_DIR environment variable with the path to a directory containing app .so libraries. Needed for patching ctypes.find_library.
    • Changed behavior of SERIOUS_PYTHON_ALLOW_SOURCE_DISTRIBUTIONS environment variable that should contain a comma-separated list of packages to allow installation from source distribution.
    • Fixed: iOS site-packages to xcframeworks migration script supports both library.so and library.{something}.so.
    Open source →
  36. 0.8.5 01 Jan 2025
    Release notes
    • Added Java loadLibrary to Android plugin to support pyjnius (#128).
    Open source →
  37. 0.8.4 05 Dec 2024
    Release notes
    • Copy site-packages/flutter contents to SERIOUS_PYTHON_FLUTTER_PACKAGES.
    • Added SERIOUS_PYTHON_ALLOW_SOURCE_DISTRIBUTIONS variable to allow pip installing from source distributions.
    Open source →
  38. 0.8.3 03 Dec 2024
    Release notes
    • Remove PYTHONOPTIMIZE=2 to make CFFI work.
    Open source →
  39. 0.8.2 28 Oct 2024
    Release notes
    • Copy .so libraries from {site-packages}/opt to jniLibs.
    Open source →
  40. 0.8.1 15 Oct 2024
    Release notes
    • Remove --only-binary when packaging for desktop platforms (#112)
    • Fixed: only pass string args ('script') if they are not null. (#77)
    • Fixed: script set as empty string to fix windows build error (#83)
    Open source →
  41. 0.8.0 08 Oct 2024
    Release notes
    • Not based on Kivy!
    • Fast packaging uses pre-built Python binary packages hosted on https://pypi.flet.dev and https://pypi.org. If a binary package for specific platform/arch is not found the packaging process does not make an attempt to compile it, but just exits with a meaningful error.
    • To package for iOS and Android developer should set SERIOUS_PYTHON_SITE_PACKAGES environment variable with a path to a temp directory for installed app packages. The contents of that directory is embedded into app bundle during app compilation. For macOS, Linux and Windows app packages are installed into __pypackages__ inside app package asset zip.
    • Packaging command is not looking for requirements.txt or pyproject.toml anymore, but all requirements should be passed explicitly via --requirements option. The value of --requirements option is passed "as is" to pip command. For example, --requirements flet,numpy==2.1.1 install two requirements directly, or --requirements -r,requirements.txt installs deps from a file.
    • MacOS packaging includes Python binaries for both arm64 and x86_64 architectures. Can limit to only one architecture with --arch option.
    • New options to enable compilation and cleanup of app and packages .py files: --compile-app, --compile-packages and --cleanup.
    • Packaging for web is no longer relied on a HTML document with links, but spawns its own PyPI-compatible server with links to Pyodide packages.
    • Build python distributive is cached in Flutter's build directory, not temp, to avoid re-downloading on consequent re-packages.
    • Web builds updated to Pyodide 0.26.2.
    • Packages for iOS and Android are built with Mobile Forge.
    • Python for all platforms is built with flet-dev/python-build and this CI job. Python distros for Dart and Mobile Forge uploaded to releases.
    Open source →
  42. 0.7.1 21 Jun 2024
    Release notes
    • Added namespace definition to Android Gradle build.
    • Bump dependencies.
    Open source →
  43. 0.7.0 15 Jan 2024
    Release notes
    • runPython() method to support running Python script.
    • Updated flet_example to catch program output and errors, sys.exit() support.
    • package command to read dependencies from pyproject.toml.
    Open source →
  44. 0.6.1 21 Dec 2023
    Release notes
    • --exclude option for package command - to exclude directories and files from Python app package.
    • Re-create temp Python distributive directory on every run of package command.
    Open source →
  45. 0.6.0 13 Dec 2023
    Release notes
    • --verbose flag - verbose output.
    • --mobile flag - (removes .so) from app dest archive.
    • --web flag for packaging for pyodide.
    • --find-links option for installing pip dependencies from alternative sources (indexes).
    • --dep-mappings for rewriting flet dependency to either flet-embed or flet-pyodide.
    • --req-deps for adding required dependencies like flet-embed or flet-pyodide.
    • --platform option for use with sitecustomize.py to tweak pip to pull platform-specific packages.
    • More structured regular output.
    • Bump deps versions.
    Open source →
  46. 0.5.1 25 Nov 2023
    Release notes
    • Simplified Python initialization on Android.
    Open source →
  47. 0.5.0 24 Nov 2023
    Release notes
    • Python 3.11.6 for all platforms.
    Open source →
  48. 0.4.1 02 Nov 2023
    Release notes
    • Bumping version after fixing pubspec.yaml.
    Open source →
  49. 0.3.1 25 Sep 2023
    Release notes
    • Set Flutter SDK requirements to remove publishing warnings.
    Open source →
  50. 0.2.4 19 Sep 2023
    Release notes
    • Fix _Py_HashRandomization_Init error on Windows.
    • Reliably re-download Python executable.
    Open source →
  51. 0.2.3 04 Aug 2023
    Release notes
    • Android fixes to make it work on some devices when installed via Play Store.
    Open source →
  52. 0.2.2 02 Aug 2023
    Release notes
    • Exclude x86 from supported ABIs.
    • Fixed: Packaging python app using the packaging command raising an error on windows (#8).
    Open source →
  53. 0.2.1 27 Jul 2023
    Release notes
    • Fix iOS pod.
    Open source →
  54. 0.2.0 26 Jul 2023
    Release notes
    • Android support.
    Open source →
  55. 0.1.5 20 Jun 2023
    Release notes
    • SeriousPython.run() should be split into two methods to return temp dir with unpacked python app (#6).
    Open source →
  56. 0.1.4 17 Jun 2023
    Release notes
    • Bump .podspec version.
    Open source →
  57. 0.1.3 17 Jun 2023
    Release notes
    • Add app's path to PYTHONPATH.
    • Compile Python app to a bytecode.
    • Compile Python system standard libraries to a bytecode.
    Open source →
  58. 0.1.2 09 Jun 2023
    Release notes
    • Package dist site-packages to a zip, so publishing to App Store doesn't fail.
    Open source →
  59. 0.1.1 08 Jun 2023
    Release notes
    • Fixed issue with setting current directory on Python start.
    • Added --pre flag to serious_python:main CLI.
    • Added Flet example.
    • Hid internal implementation behind src dir.
    Open source →
  60. 0.1.0 07 Jun 2023
    Release notes
    • Initial release of serious_python with iOS support.
    Open source →

Every package, every release, already written down.

The archive is open and free. Watching your own project is what we are building next.

Browse the archive