NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #1982 most downloaded on pub.dev
A cross-platform plugin for adding embedded Python runtime to your Flutter apps.
Last release 11 days ago
26 Sep 2026
Release timing varies
gaps range from 9 days to 2 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
3 years old
65 releases · first in 2023
One column per quarter.
Stop splitting exclude and cleanup globs on commas; prepare 5.0.0 by @FeodorFitsner in #253
Full Changelog: v4.7.2...v5.0.0
package command): --exclude, --cleanup-app-files and --cleanup-package-files no longer split their values on commas, so paths containing , and brace globs such as **/{tests,docs} can be passed. Previously a hidden file named .a,main.py passed to --exclude became two exclusions, dropping main.py, and **/{tests,docs} was split into two broken globs. Pass each value as its own option: --exclude build --exclude tests instead of --exclude build,tests. A comma-separated value is now matched as a single path, so an unmigrated command packages the files it used to exclude without failing. The Dart API and runtime are unchanged. flet build pins serious_python exactly, so existing Flet releases are unaffected (#253, flet#6839).fix(darwin): re-sign linker-signed macOS native modules while staging by @ndonkoHenri in #251
Full Changelog: v4.7.1...v4.7.2
1, so CI and flet build stop on failure while temporary files are still cleaned up (#252).90238 ("does not satisfy its designated Requirement") for bundled native modules after Xcode distribution signing (#250, #251). See serious_python_darwin 4.7.2.pod install when a Python runtime preparation script fails, preventing builds from continuing with an incomplete runtime. See serious_python_darwin 4.7.2. (#251)DartBridge.hardExit, and re-pin python-build to 20260908 by @FeodorFitsner in #248
Full Changelog: v4.7.0...v4.7.1
dart_bridge 1.10.0. (dart-bridge#21, #85)dart_bridge to 1.10.0. CPython versions remain 3.12.14 / 3.13.15 / 3.14.7. (python-build#42)Full Changelog : v4.6.0...v4.7.0
Full Changelog: v4.6.0...v4.7.0
DartBridge.hardExit(exitCode): terminate without running process teardown. dart:io's exit() runs the normal C teardown, which destroys the C++ statics inside every loaded CPython extension module. The interpreter lives on a detached thread that may still be running, so that teardown can fault it, giving a SIGSEGV on exit from an app that had already finished its work. hardExit skips it. Guard with DartBridge.canHardExit, which is false against a pre-1.9.0 libdart_bridge (the symbol is resolved softly, like isPythonInitialized and signalDartSession); hardExit is then a no-op and the caller should fall back to exit().dart_bridge 1.8.0 -> 1.9.0), which is what carries the new serious_python_hard_exit export. No CPython or Pyodide versions change; the release exists to publish the updated manifest.fix: pass --no-input and bounded timeouts to pip by @ndonkoHenri in #246
--no-input and bounded timeouts to pip by @ndonkoHenri in #246Full Changelog: v4.5.1...v4.6.0
html.parser.HTMLParser parsing (gh-153030) and quadratic behaviour in xml.etree.ElementTree XPath index predicates (gh-152674), among others.Modules/expat/expat.h, not inferred from release notes. Relevant only if your app parses untrusted XML through pyexpat / xml.etree / xml.sax; upstream will pick it up in the next 3.13/3.14 micro.dart_bridge 1.7.1 → 1.8.0).pip install no longer hangs when an index answers 401 — an authenticating mirror or proxy. pip prompted for credentials on a stdin nothing could answer, and wrote the prompt without a newline so callers never displayed it; the install blocked with Looking in indexes: ... as its last output, which flet build showed as a frozen Packaging Python app.... pip now runs with --no-input and bounded --timeout/--retries. See flet-dev/flet#5989, flet-dev/flet#5013 and flet-dev/flet#5507.Bump to 4.5.1: sign and verify both XCFramework layers by @FeodorFitsner in #245
Full Changelog: v4.5.0...v4.5.1
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.SERIOUS_PYTHON_VERIFY_PROVIDER_SIGNATURES=require for release builds.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.Bump to 4.5.0: preserve provider XCFramework signatures through staging by @FeodorFitsner in #244
Full Changelog: v4.4.2...v4.5.0
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.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..framework bundles and cannot produce the SDK-origin signature receipts Apple's scan looks for; it now warns during the build.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.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.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
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._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.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.dart_bridge 1.6.1 are unchanged from 20260726.Bump to 4.4.1: OpenSSL privacy manifest for iOS _ssl/_hashlib by @FeodorFitsner in #241
Full Changelog: v4.4.0...v4.4.1
_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.dart_bridge 1.6.1 are unchanged from 20260725.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
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.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.Bump to 4.3.6: Windows UTF-8 startup fix (dart_bridge 1.5.1, python-build 20260720) by @FeodorFitsner in #238
concurrent.interpreters / InterpreterPoolExecutor) by @ndonkoHenri in #239Full Changelog: v4.3.4...v4.3.6
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.Py_Initialize(). See serious_python_windows 4.3.6 and flet-dev/flet#6641.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.Bump to 4.3.4: Android flet debug stale-code fix (flet #6682) by @FeodorFitsner in #235
flet debug stale-code fix (flet #6682) by @FeodorFitsner in #235Full Changelog: v4.3.3...v4.3.4
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._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.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.Fix Windows build failure on non-UTF-8 locales (C4819/C2220) by @FeodorFitsner in #234
Full Changelog: v4.3.2...v4.3.3
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.dart_bridge (1.5.0) are unchanged from 4.3.2.Bump to 4.3.2: python-build 20260712 (Android mimalloc seccomp crash, mobile _pyrepl restored) by @FeodorFitsner in #230
Full Changelog: v4.3.1...v4.3.2
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.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.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.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._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.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.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 s
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.Desktop multiprocessing support (flet-dev/flet#4283). dart_bridge 1.5.0 adds serious_python_is_mp_invocation / serious_python_main (+ _w wide-char var
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.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).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.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 .d
.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._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).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 runtime
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.20260630; CPython-standalone 20260623); Pyodide 0.27.7 / 0.29.4 / 314.0.1 (3.14 bumped 314.0.0 → 314.0.1).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
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.Android: run first-launch asset unpacking and native library loading off the platform main thread so they no longer block vsync — boot-time animations
serious_python_android 4.1.0.Breaking change: the app.zip asset convention and the runtime zip-extraction API are removed — SeriousPython.run("app/app.zip"), extractAssetZip, and…
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).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).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.<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.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.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…
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.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.compileSdk 36, Java 17, and the Kotlin-DSL Gradle build (build.gradle.kts).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.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).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.dist_ios / dist_macos), so a clean build after switching --python-version can't mix C-extension ABIs (bad magic number / unknown slot ID).dart_bridge artifacts under $FLET_CACHE_DIR (default ~/.flet/cache) across all platforms.getPlatformVersion method from the platform plugins.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_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.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.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.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 ra…
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.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.-shared suffix (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_stripped build.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.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).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.Cache downloaded Python distribution tarballs (python-android-dart- - .tar.gz) across builds. The downloadDistArchive_* Gradle tasks now write to a pe
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.Breaking change: --platform argument value Pyodide has been renamed to Emscripten to match what platform.system() returns in the Pyodide runtime, so P…
--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.Fix web packaging to skip site-packages when appropriate (#199).
site-packages when appropriate (#199).Disable user-site packages in pip environment (#195).
Android: Add debug logs and deduplicate FFI imports.
Add zipDirectoryPosix to create POSIX-compliant app archives on Windows.
serious_python plugin build.WINDIR path for bundled DLLs in CMake.* Fix logging on Android.
Redirect Python output to logcat.
Make zipDirectory call asynchronous.
Fixed iOS framework identifier generation.
archive to ^4.0.7.16 KB memory page support for Android 15+ (by @ReYaNOW).
Fix: Hidden files in site-packages are skipped when building macOS app.
.dist-info directories (#164).Breaking change: multiple --requirements options of package command must be passed as --requirements DEP_1 --requirements DEP_2 ... (or -r DEP_1 -r DE…
--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 serious_python to work on macOS 12 Monterey and built with Xcode 14.
serious_python to work on macOS 12 Monterey and built with Xcode 14.Set MinimumOSVersion to 13.0 for generated Python frameworks.
MinimumOSVersion to 13.0 for generated Python frameworks.python.bundle to pass App Store verification.--cleanup option replaced with two separate --cleanup-app and --cleanup-packages options.--cleanup-app-files and --cleanup-package-files to specify a list of globs to exclude files and directories from app and site packages.--skip-site-packages option to skip site packages installation for faster re-builds.--arch option accepts a list now.Fixed: xcframeworks migration script didn't work for sub-directories.
xcframeworks migration script didn't work for sub-directories.Added com.flet.serious_python_android.PythonActivity holder class with mActivity holding a reference to an app MainActivity. Needed for plyer.
com.flet.serious_python_android.PythonActivity holder class with mActivity holding a reference to an app MainActivity. Needed for plyer.MAIN_ACTIVITY_HOST_CLASS_NAME environment variable with the name of activity holder class name (com.flet.serious_python_android.PythonActivity).MAIN_ACTIVITY_CLASS_NAME environment variable with a class name of an app MainActivity.ANDROID_NATIVE_LIBRARY_DIR environment variable with the path to a directory containing app .so libraries. Needed for patching ctypes.find_library.SERIOUS_PYTHON_ALLOW_SOURCE_DISTRIBUTIONS environment variable that should contain a comma-separated list of packages to allow installation from source distribution.site-packages to xcframeworks migration script supports both library.so and library.{something}.so.Added Java loadLibrary to Android plugin to support pyjnius (#128).
loadLibrary to Android plugin to support pyjnius (#128).Copy site-packages/flutter contents to SERIOUS_PYTHON_FLUTTER_PACKAGES.
site-packages/flutter contents to SERIOUS_PYTHON_FLUTTER_PACKAGES.SERIOUS_PYTHON_ALLOW_SOURCE_DISTRIBUTIONS variable to allow pip installing from source distributions.Remove PYTHONOPTIMIZE=2 to make CFFI work.
PYTHONOPTIMIZE=2 to make CFFI work.Copy .so libraries from {site-packages}/opt to jniLibs.
.so libraries from {site-packages}/opt to jniLibs.Remove --only-binary when packaging for desktop platforms
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/a
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.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.arm64 and x86_64 architectures. Can limit to only one architecture with --arch option.--compile-app, --compile-packages and --cleanup.web is no longer relied on a HTML document with links, but spawns its own PyPI-compatible server with links to Pyodide packages.build directory, not temp, to avoid re-downloading on consequent re-packages.Added namespace definition to Android Gradle build.
namespace definition to Android Gradle build.runPython() method to support running Python script.
runPython() method to support running Python script.flet_example to catch program output and errors, sys.exit() support.package command to read dependencies from pyproject.toml.--exclude option for package command - to exclude directories and files from Python app package.
--exclude option for package command - to exclude directories and files from Python app package.package command.--verbose flag - verbose output.
--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.Simplified Python initialization on Android.
Python 3.11.6 for all platforms.
Bumping version after fixing pubspec.yaml.
Set Flutter SDK requirements to remove publishing warnings.
Fix _Py_HashRandomization_Init error on Windows.
Android fixes to make it work on some devices when installed via Play Store.
Exclude x86 from supported ABIs.
x86 from supported ABIs.* Fix iOS pod.
* Android support.
SeriousPython.run() should be split into two methods to return temp dir with unpacked python app (#6).
Your coding agent can read these notes before it upgrades. Set up the MCP server →