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 2026Releases
latest 60-
4.5.131 Jul 2026Release notes
Open source →What's Changed
- Bump to 4.5.1: sign and verify both XCFramework layers by @FeodorFitsner in #245
Full Changelog: v4.5.0...v4.5.1
Release notes
Open source →- iOS/macOS: the bundled
Python,dart_bridgeand stdlib extension XCFrameworks are now signed on both layers — each slice's inner.frameworkas well as the outer.xcframework. 4.5.0 signed only the outer bundle. Note this did not changeisSecureTimestamp, which still reports false — that field appears not to be reachable by signing;signed, whichITMS-91065names, is true. Seeserious_python_darwin4.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=requirefor release builds. - Bundled python-build snapshot re-pinned to 20260730 (
dart_bridge1.7.0 → 1.7.1). No Python version moved — 3.12.13 / 3.13.14 / 3.14.6 and Pyodide are unchanged from 20260729.
-
4.5.029 Jul 2026Release notes
Open source →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
Release notes
Open source →- iOS/macOS: the pre-built
Python,dart_bridgeand stdlib extension XCFrameworks are now staged byte-for-byte and never modified.SERIOUS_PYTHON_BUNDLE_IDnow namespaces only the frameworks built from your app's wheels; the pre-built ones keep the stabledev.flet.*identifiers their publisher assigned. - This corrects 4.4.2. Rewriting those identifiers was a hypothesis for the
ITMS-91065: Missing signatureApp 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. Seeserious_python_darwinfor the full explanation. - iOS: use the Swift Package Manager packaging path for App Store submissions. The CocoaPods path copies inner
.frameworkbundles 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(warndefault /require/off) andSERIOUS_PYTHON_EXPECTED_TEAM_IDenv vars verify those publisher signatures during packaging. Setrequirefor release builds. - Bundled python-build snapshot re-pinned to 20260729 (
dart_bridge1.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. Seeserious_python_darwin4.5.0.
-
4.4.227 Jul 2026Release notes
Open source →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
Release notes
Open source →- iOS: new
SERIOUS_PYTHON_BUNDLE_IDenv var namespaces the generated frameworks' bundle identifiers under your app (com.example.myapp.-ssl) instead of a sharedorg.python.*default identical in every app built with serious_python.flet buildsets it for you; set it yourself for a manual two-step build, in both places you setSERIOUS_PYTHON_SITE_PACKAGES. - iOS: the bundled Python frameworks (
_ssl,_hashliband every other native extension) now carry the build-provenance keys Xcode stamps into a real framework'sInfo.plist, instead of a minimal hand-written one. - Both are hypotheses under test for the
ITMS-91065: Missing signatureApp 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. Seeserious_python_darwin4.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_bridge1.6.1 are unchanged from 20260726.
-
4.4.126 Jul 2026Release notes
Open source →What's Changed
- Bump to 4.4.1: OpenSSL privacy manifest for iOS _ssl/_hashlib by @FeodorFitsner in #241
Full Changelog: v4.4.0...v4.4.1
Release notes
Open source →- iOS: the bundled
_ssland_hashlibframeworks 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 theITMS-91065: Missing signatureApp Store rejection reported in flet-dev/flet#6724, which remains under investigation. Seeserious_python_darwin4.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_bridge1.6.1 are unchanged from 20260725.
-
4.4.025 Jul 2026Release notes
Open source →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
Release notes
Open source →- iOS/macOS: fix built iOS apps crashing at startup with
Failed to lookup symbol 'serious_python_run'.dart_bridgenow ships as a dynamic framework, so the FFI entry points Dart and Python resolve viadlsymstay exported; previously it was static-linked into the app executable, which exports nothing. Release/device builds only. Seeserious_python_darwin4.4.0. - Bundled python-build snapshot re-pinned to 20260725 (
dart_bridge1.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.
-
4.3.620 Jul 2026Release notes
Open source →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
Release notes
Open source →- 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 onsys.meta_path, which is per-interpreter, and was installed only in the main interpreter. Seeserious_python_android4.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(). Seeserious_python_windows4.3.6 and flet-dev/flet#6641. - Bundled python-build snapshot re-pinned to 20260720 (
dart_bridge1.5.0 → 1.5.1, which carries the Windows fix above). Python versions (3.12.13 / 3.13.14 / 3.14.6) are unchanged.
-
4.3.419 Jul 2026Release notes
Open source →What's Changed
- Bump to 4.3.4: Android
flet debugstale-code fix (flet #6682) by @FeodorFitsner in #235 - Re-pin python-build to 20260719: desktop _pyrepl restored (pydoc/pdb, #236) by @FeodorFitsner in #237
Full Changelog: v4.3.3...v4.3.4
Release notes
Open source →- 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) importspydocorpdb._pyreplwas pruned from the desktop stdlib as a dev-only module, but 3.14'spydoc/pdbimport it at module load. Seeserious_python_windows/serious_python_linux4.3.4 and flet-dev/serious-python#236. - Bundled python-build snapshot re-pinned to 20260719; the only change vs 20260714 is the desktop
_pyreplun-prune above. All runtime versions (Python 3.12.13 / 3.13.14 / 3.14.6,dart_bridge1.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. Seeserious_python_android4.3.4 and flet-dev/flet#6682.
- Bump to 4.3.4: Android
-
4.3.316 Jul 2026Release notes
Open source →What's Changed
- Fix Windows build failure on non-UTF-8 locales (C4819/C2220) by @FeodorFitsner in #234
Full Changelog: v4.3.2...v4.3.3
Release notes
Open source →- Windows: fix
flet build windowsfailing on non-UTF-8 system locales (e.g. Simplified-Chinese Windows, code page 936/GBK) witherror C2220(escalated fromwarning 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/WXmade it fatal. The character is removed and the plugin now builds with/utf-8. Seeserious_python_windows4.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.
-
4.3.214 Jul 2026Release notes
Open source →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
Release notes
Open source →- 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@rpathreferences are reconciled to the relocated framework paths (#223). Seeserious_python_darwin4.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__.sorefmarker. Seeserious_python_android4.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) anddart_bridge(1.5.0) are unchanged from 4.3.1. - Android: fix 3.13/3.14 apps crashing with
SIGSYSbefore any app code runs on x86_64 (and other ABIs with a 32-bit-styleSYS_open) — mimalloc's rawopen(2)syscall is forbidden by Android's seccomp policy. Seeserious_python_android4.3.2. - iOS/Android:
_pyreplis no longer pruned from the mobile stdlib — Python 3.14'spdbimports it at module load, so anything importingpdb(e.g. pytest's debugging plugin) failed withModuleNotFoundError: No module named '_pyrepl'. Seeserious_python_darwin/serious_python_android4.3.2. - iOS:
import multiprocessing(e.g. via scikit-learn/joblib) no longer fails withModuleNotFoundError: No module named '_posixshmem'— the_posixshmemextension is now built into the iOS runtimes alongside_multiprocessing. Seeserious_python_darwin4.3.2.
-
4.3.110 Jul 2026Release notes
Open source →- Android: fix
flet build apk --arch x86_64(or any--archsubset not includingarm64-v8a) producing an APK with an emptysitepackages.zip— the app shipped without its Python dependencies and the first import failed at startup. Seeserious_python_android4.3.1.
- Android: fix
-
4.3.009 Jul 2026Release notes
Open source →- Desktop multiprocessing support (flet-dev/flet#4283).
dart_bridge1.5.0 addsserious_python_is_mp_invocation/serious_python_main(+_wwide-char variants on Windows): host apps call them first thing inmainto 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 thePYTHONHOME/PYTHONPATHthe parent already stamped process-wide. PYTHONINSPECT=1is 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 deliversdart_bridge1.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 windowsfailing withfile 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). Seeserious_python_windows4.3.0.
- Desktop multiprocessing support (flet-dev/flet#4283).
-
4.2.102 Jul 2026Release notes
Open source →- iOS/macOS: ctypes packages that ship plain
.dylibshared libraries (e.g.llama-cpp-python'slibllama/libggml) now load on the iOS simulator. Such.dylibs are now packaged as per-slice xcframeworks (previously only.soC-extensions were), so they carry a simulator slice instead of shipping the device build and failingdlopenwithincompatible platform (have 'iOS', need 'iOS-simulator'); their install-name is preserved so multi-lib packages still resolve their sibling libs. Seeserious_python_darwin4.2.1. - iOS: the
_multiprocessingextension is now built into the runtime (importable, not spawnable) viaflet-dev/python-build20260701. Bundled Python versions are unchanged from 4.2.0 (3.12.13 / 3.13.14 / 3.14.6).
- iOS/macOS: ctypes packages that ship plain
-
4.2.001 Jul 2026Release notes
Open source →- Android:
armeabi-v7a(32-bit ARM) is now bundled for Python 3.13 and 3.14, not just 3.12 —flet-dev/python-build20260630publishes 32-bit ARM runtimes for those minors (built withdart_bridge1.4.1). Thepackagecommand's hardcoded "3.12-only"armeabi-v7askip is replaced by a manifest-driven check against each minor'sPythonRelease.androidAbis, so the wheel fan-out (and the Android plugin'sabiFilters) follow whatever python-build publishes per minor. - Bundle 3.12.13 / 3.13.14 / 3.14.6 (python-build
20260630; CPython-standalone20260623); Pyodide 0.27.7 / 0.29.4 / 314.0.1 (3.14 bumped 314.0.0 → 314.0.1).
- Android:
-
4.1.129 Jun 2026Release notes
Open source →- 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) withModuleNotFoundError: No module named '_sysconfigdata__android_<arch>-linux-android'. Seeserious_python_android4.1.1.
- Android: fix two startup crashes — apps crashing on launch on Android 8.1 and below (API < 28) due to an unguarded
-
4.1.025 Jun 2026Release notes
Open source →- 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_android4.1.0.
- 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
-
4.0.022 Jun 2026Release notes
Open source →- 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.zipextraction. On Android the app ships as a storedapp.zipasset 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 existingextract.zip. Web (Pyodide) is unchanged. Thepackagecommand stages the processed app intoSERIOUS_PYTHON_APP(symmetric withSERIOUS_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 noassetPathargument (it resolves the app viaprepareApp()), 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 runsmain.pyc/main.py(orappFileName). - Breaking change: the
app.zipasset convention and the runtime zip-extraction API are removed —SeriousPython.run("app/app.zip"),extractAssetZip, andextractFileZipno longer exist. Repackage withdart run serious_python:main package <app> -p <platform>and callSeriousPython.run()with no arguments. - Android: the runtime payload moved to
<application-support>/flet/{app, stdlib.zip, sitepackages.zip, extract/}(resolved viagetApplicationSupportDirectory(); the customgetFilesDirmethod channel is dropped). User data in the sibling<application-support>/datasurvives app updates. - Swift Package Manager (darwin) staging in the
packagecommand — on by default. For iOS/macOS thepackagecommand runs the host-side equivalent of the podspecprepare_command(which SPM has no hook for) by resolvingserious_python_darwin'sdarwin/dir (SERIOUS_PYTHON_DARWIN_DIRoverride, else the project'spackage_config.json), invokingprepare_spm.sh, and writing theSP_NATIVE_SETcache-bust key tobuild/.serious_python_spm_key(overridable viaSERIOUS_PYTHON_SPM_KEY_FILE) for the caller to export into theflutter buildenvironment. SPM is Flutter's default darwin integration since 3.44, so this happens by default — setSERIOUS_PYTHON_DARWIN_SPMto a falsy value (0/false/no/off) to opt out and build with CocoaPods (the podspec stages then). Seeserious_python_darwin4.0.0.
- 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
-
3.0.018 Jun 2026Release notes
Open source →- New in-process transport (dart_bridge FFI).
SeriousPython.runcan now run the embedded interpreter in-process through thedart_bridgeFFI bridge instead of talking to it over a socket. The Python lifecycle (initialize / run / teardown) is absorbed into thedart_bridgenative library on every platform —dart_bridge.xcframework(iOS/macOS),libdart_bridge.so(Android/Linux), anddart_bridge.dll/dart_bridge.pyd(Windows) — and a newPythonBridgeAPI exposes a MsgPack control channel plus dedicated binary data channels between Dart and Python. See thebridge_exampleapp. The bundleddart_bridgeis 1.4.0. - Android native packaging — memory-mapped from the APK. Python extension modules are relocated into
jniLibsand loaded directly from the APK (mmap, no extraction) by a custom importer that resolves them from.sorefmarkers; pure Python ships in stored, ABI-common asset zips read viazipimport(no per-ABI duplication). Apps no longer needuseLegacyPackaging/keepDebugSymbols— the brittle per-app packaging config is gone. SetSERIOUS_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 beforesiteruns. - Breaking change: requires Flutter 3.44.2 / Dart 3.12+. The Android plugin moves to AGP 8.11.1,
compileSdk36, 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-keyedmanifest.json, generated bydart 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, anddart_bridgeversion all derive from it.SERIOUS_PYTHON_FULL_VERSION,SERIOUS_PYTHON_BUILD_DATE, andDART_BRIDGE_VERSIONremain as rarely-needed escape hatches. The native build configs (Androidbuild.gradle, Darwin podspec, Linux/WindowsCMakeLists.txt) read the generatedpython_versions.properties, and a CI job fails if the snapshots drift from the manifest. This replaces the per-config hardcoded defaults and theflet build-exportedSERIOUS_PYTHON_FULL_VERSION/SERIOUS_PYTHON_BUILD_DATEintroduced 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-versioncan't mix C-extension ABIs (bad magic number/unknown slot ID). - Cache downloaded Python distributions and
dart_bridgeartifacts under$FLET_CACHE_DIR(default~/.flet/cache) across all platforms. - Remove the scaffold
getPlatformVersionmethod from the platform plugins. - Drop the
x86(32-bit Intel) Android ABI — Flutter no longer produces it. Android builds targetarm64-v8a+x86_64(plusarmeabi-v7aon Python 3.12); thex86wheel 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_abisinpython_versions.propertiesandPythonRelease.androidAbisin the generated Dart) instead of the hardcodedif pythonVersion == "3.12"branch inserious_python_android/android/build.gradle.kts. Drives bothdefaultConfig.ndk.abiFiltersand the per-ABI download/copy fan-out; adding a future minor only needs the one-line manifest edit. - Breaking change: the
configurecommand (and the bare in-place version-switching machinery, includingstageDarwinRuntime) is removed. Switching the bundled Python version between builds is now handled by a clean rebuild —flet buildwipes its build dir on a version change, and the Darwindist_ios/dist_macosversion marker re-extracts the runtime — so a separateserious_python configurestep 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 underpyemscripten_2025_0_wasm32; corrected topyemscripten-2025.0-wasm32soflet build web --python-version 3.13matches native wheels.
- New in-process transport (dart_bridge FFI).
-
2.0.007 Jun 2026Release notes
Open source →- Breaking change: the
packagecommand's default Python is now the latest supported stable (3.14), up from the previously implicit 3.12. Scripts that randart run serious_python:main package …without--python-versionwill now download CPython 3.14, install 3.14 wheels, and use the matching Pyodide / Android platform tags. Pin explicitly with--python-version 3.12(orSERIOUS_PYTHON_VERSION=3.12) to preserve the old behavior. - Breaking change: Android
sysconfig.get_platform()tag format changed fromandroid-24-arm64-v8atoandroid-24-arm64_v8a(and similarly forarmeabi-v7a). The emitted wheel tag (android_24_arm64_v8a) is unchanged, but anything reading the rawsysconfig.get_platform()string fromsitecustomize.pyshould switch separators. - Breaking change: Windows host arch identifier dropped the
-sharedsuffix (x86_64-pc-windows-msvc-shared→x86_64-pc-windows-msvc); follows astral-sh/python-build-standalone, which only publishes the combined (already shared)install_only_strippedbuild. - Multi-version Python support. The
packagecommand accepts--python-version(orSERIOUS_PYTHON_VERSIONenv 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_pythonReleasestable. Adding a future pre-release line (e.g. 3.15 beta) is a one-row append withprerelease: true; the Flet CLI uses that flag to keep open-endedrequires-pythonspecifiers (>=3.14) on stable, while still letting--python-version 3.15or==3.15.*opt in. - The Emscripten pip platform tag is now derived per Python release (e.g.
pyodide-2024.0-wasm32for 0.27.7,pyemscripten-2026.0-wasm32for 314.0.0a2), via apyodide_platform_tagfield in the version registry. The previous staticpyodide-2024.0-wasm32entry inplatforms["Emscripten"]has been removed. sitecustomize.pynow shimsplatform.android_verso the new pip / packaging that ships with python-build-standalone 20260602+ can compute Android wheel tags on Python 3.12 hosts (whereandroid_verdidn't exist) and on Python 3.13+ hosts (where it returnsapi_level=0off-device).- Skip 32-bit Android ABIs (
armeabi-v7a,x86) when Python ≥ 3.13 — PEP 738 dropped 32-bit Android support, andflet-dev/python-buildno longer publishes those runtimes for those versions.
- Breaking change: the
-
1.0.106 Jun 2026Release notes
Open source →Improvements
- Cache downloaded Python distribution tarballs (
python-android-dart-<py>-<abi>.tar.gz) across builds. ThedownloadDistArchive_*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 useonlyIfModified true+useETag "all"so subsequent builds issue a conditional GET (If-None-Match/If-Modified-Since) againstobjects.githubusercontent.cominstead 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 existingv<py>release), the validators flip and the cache refreshes automatically; otherwise the build skips the download entirely.tempAndMove trueguards against partial downloads being kept in the cache (flet-dev/flet#6555, #208) by @FeodorFitsner.
Bug fixes
- Cache downloaded Python distribution tarballs (
-
1.0.012 May 2026Release notes
Open source →- Breaking change:
--platformargument valuePyodidehas been renamed toEmscriptento match whatplatform.system()returns in the Pyodide runtime, so PEP 508 markers likeplatform_system != 'Emscripten'work consistently.
- Breaking change:
-
0.9.1203 May 2026 -
0.9.1101 Mar 2026 -
0.9.1021 Feb 2026Release notes
Open source →- Android: Add debug logs and deduplicate FFI imports.
- Android: Invalidate extracted assets when version keys change.
-
0.9.931 Jan 2026Release notes
Open source →- Add zipDirectoryPosix to create POSIX-compliant app archives on Windows.
- Enforce C++20 standard for
serious_pythonplugin build. - Fix: Normalize
WINDIRpath for bundled DLLs in CMake. - Fix Logcat logging crash on some Android devices.
-
0.9.822 Dec 2025 -
0.9.718 Dec 2025 -
0.9.602 Dec 2025 -
0.9.501 Dec 2025 -
0.9.421 Oct 2025 -
0.9.319 Oct 2025Release notes
Open source →- Fix: Hidden files in site-packages are skipped when building macOS app.
- Fix: Do not delete package metadata in
.dist-infodirectories (#164).
-
0.9.211 Mar 2025Release notes
Open source →- Breaking change: multiple
--requirementsoptions ofpackagecommand 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.
- Breaking change: multiple
-
0.9.105 Mar 2025Release notes
Open source →- Fix
serious_pythonto work on macOS 12 Monterey and built with Xcode 14.
- Fix
-
0.9.020 Feb 2025Release notes
Open source →- Set
MinimumOSVersionto13.0for generated Python frameworks. - iOS and macOS packaging: Python system libraries are put into
python.bundleto 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
--cleanupoption replaced with two separate--cleanup-appand--cleanup-packagesoptions. - New packaging options
--cleanup-app-filesand--cleanup-package-filesto specify a list of globs to exclude files and directories from app and site packages. - New packaging
--skip-site-packagesoption to skip site packages installation for faster re-builds. - Packaging
--archoption accepts a list now.
- Set
-
0.8.707 Jan 2025 -
0.8.606 Jan 2025Release notes
Open source →- Added
com.flet.serious_python_android.PythonActivityholder class withmActivityholding a reference to an app MainActivity. Needed forplyer. - Android plugin sets
MAIN_ACTIVITY_HOST_CLASS_NAMEenvironment variable with the name of activity holder class name (com.flet.serious_python_android.PythonActivity). - Android plugin sets
MAIN_ACTIVITY_CLASS_NAMEenvironment variable with a class name of an app MainActivity. - Android plugin sets
ANDROID_NATIVE_LIBRARY_DIRenvironment variable with the path to a directory containing app .so libraries. Needed for patchingctypes.find_library. - Changed behavior of
SERIOUS_PYTHON_ALLOW_SOURCE_DISTRIBUTIONSenvironment variable that should contain a comma-separated list of packages to allow installation from source distribution. - Fixed: iOS
site-packagestoxcframeworksmigration script supports bothlibrary.soandlibrary.{something}.so.
- Added
-
0.8.501 Jan 2025 -
0.8.405 Dec 2024Release notes
Open source →- Copy
site-packages/fluttercontents toSERIOUS_PYTHON_FLUTTER_PACKAGES. - Added
SERIOUS_PYTHON_ALLOW_SOURCE_DISTRIBUTIONSvariable to allow pip installing from source distributions.
- Copy
-
0.8.303 Dec 2024 -
0.8.228 Oct 2024 -
0.8.115 Oct 2024 -
0.8.008 Oct 2024Release notes
Open source →- 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_PACKAGESenvironment 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.txtorpyproject.tomlanymore, but all requirements should be passed explicitly via--requirementsoption. The value of--requirementsoption is passed "as is" topipcommand. For example,--requirements flet,numpy==2.1.1install two requirements directly, or--requirements -r,requirements.txtinstalls deps from a file. - MacOS packaging includes Python binaries for both
arm64andx86_64architectures. Can limit to only one architecture with--archoption. - New options to enable compilation and cleanup of app and packages .py files:
--compile-app,--compile-packagesand--cleanup. - Packaging for
webis 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
builddirectory, 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.
-
0.7.121 Jun 2024 -
0.7.015 Jan 2024Release notes
Open source →runPython()method to support running Python script.- Updated
flet_exampleto catch program output and errors,sys.exit()support. packagecommand to read dependencies frompyproject.toml.
-
0.6.121 Dec 2023Release notes
Open source →--excludeoption forpackagecommand - to exclude directories and files from Python app package.- Re-create temp Python distributive directory on every run of
packagecommand.
-
0.6.013 Dec 2023Release notes
Open source →--verboseflag - verbose output.--mobileflag - (removes.so) from app dest archive.--webflag for packaging for pyodide.--find-linksoption for installing pip dependencies from alternative sources (indexes).--dep-mappingsfor rewritingfletdependency to eitherflet-embedorflet-pyodide.--req-depsfor adding required dependencies likeflet-embedorflet-pyodide.--platformoption for use withsitecustomize.pyto tweak pip to pull platform-specific packages.- More structured regular output.
- Bump deps versions.
-
0.5.125 Nov 2023 -
0.5.024 Nov 2023 -
0.4.102 Nov 2023 -
0.3.125 Sep 2023 -
0.2.419 Sep 2023Release notes
Open source →- Fix _Py_HashRandomization_Init error on Windows.
- Reliably re-download Python executable.
-
0.2.304 Aug 2023Release notes
Open source →- Android fixes to make it work on some devices when installed via Play Store.
-
0.2.202 Aug 2023Release notes
Open source →- Exclude
x86from supported ABIs. - Fixed: Packaging python app using the packaging command raising an error on windows (#8).
- Exclude
-
0.2.127 Jul 2023 -
0.2.026 Jul 2023 -
0.1.520 Jun 2023Release notes
Open source →- SeriousPython.run() should be split into two methods to return temp dir with unpacked python app (#6).
-
0.1.417 Jun 2023 -
0.1.317 Jun 2023Release notes
Open source →- Add app's path to
PYTHONPATH. - Compile Python app to a bytecode.
- Compile Python system standard libraries to a bytecode.
- Add app's path to
-
0.1.209 Jun 2023Release notes
Open source →- Package dist
site-packagesto a zip, so publishing to App Store doesn't fail.
- Package dist
-
0.1.108 Jun 2023Release notes
Open source →- Fixed issue with setting current directory on Python start.
- Added
--preflag toserious_python:mainCLI. - Added Flet example.
- Hid internal implementation behind
srcdir.
-
0.1.007 Jun 2023