Python developers have always had to leave their comfort zone to ship mobile or desktop apps — reach for Dart and Flutter, wrestle with Electron, or accept Kivy’s dated look. Flet 1.0, released on September 15, changes that math: write Python, ship everywhere. It now covers web, Windows, macOS, Linux, iOS, and Android from a single codebase, and with 9 million PyPI downloads and 16,000+ GitHub stars, it has moved well past the “interesting experiment” stage.
Not an Incremental Update
Flet 1.0 is a ground-up rewrite, not a point release with some new widgets. The original framework inherited its design from Pglet, a multi-language web framework. That lineage created technical debt that accumulated through the 0.x cycle. The 1.0 rewrite clears it.
Three changes define the new architecture. First, controls are now Python dataclasses — less boilerplate, stronger types, and adding new controls becomes a near-zero-maintenance task. Second, the JSON messaging layer between Python and Dart is gone; a binary MessagePack protocol replaces it, carrying the same data in 20–50% fewer bytes with faster parsing on both ends. For packaged native apps, an in-process bridge also eliminates the socket overhead between Python and Dart. Third, the UI diffing algorithm is new and produces up to 6.7x faster tree updates in the framework’s own benchmarks, with fewer unnecessary redraws.
The net result: a framework that behaves like it was built for Python from day one, not ported from something else.
The Breaking Change to Check Before Upgrading
If you have an existing Flet app, there is one change you must understand before touching your requirements.txt: the event loop model flipped.
In 0.28, sync event handlers ran on a thread pool. Blocking code — a slow database query, a file read, time.sleep() — worked fine because it ran off the main loop. In 1.0, handlers run directly on the event loop. The same loop that sends UI updates to the client. While your handler is executing, nothing else does: no repaints, no spinner updates, no clicks registered. You’ll see the OS mark the window as “not responding” and updates appear all at once when work finishes.
The fix is straightforward: switch blocking handlers to async def and use await asyncio.sleep() or await asyncio.to_thread() for CPU-bound work. Sync handlers that do fast, non-blocking work — setting a property, appending a control — are fine as-is. The official migration guide covers this and the other breaking changes, including the Tabs control being split into three separate controls and the Theme API cleanup.
A Declarative API for Those Who Wanted React in Python
The other significant addition is the new declarative interface. Alongside Flet’s existing imperative style — where you build the UI by creating and mutating control objects directly — 1.0 introduces ft.ControlBuilder: a way to describe the UI as a function of state. Update the state, the UI re-renders. No manual synchronization across event handlers.
Both styles coexist. If you have working 0.28 code and don’t want to rewrite it declaratively, you don’t have to. The declarative path is there for new projects or components where reactive state management simplifies the logic.
Six Platforms, Realistically
The six-platform claim holds up in practice. Flet ships iOS and Android builds that include pre-compiled versions of NumPy, pandas, Pillow, SciPy, and cryptography — the libraries Python data and backend developers actually use. Python 3.12, 3.13, and 3.14 are all supported in packaged apps. The roadmap for 2026–2027 adds shadcn, Fluent (Windows 11-style), macOS-native, and Yaru (Ubuntu) UI control sets, plus BLE and NFC sensor access.
For the Python developer evaluating cross-platform options in 2026: Tkinter is desktop-only and shows its age, PyQt6 doesn’t touch mobile, Kivy’s mobile support predates Flutter’s design language. Flet is, at this point, the only Python option that covers the full surface area without requiring you to write Dart or JavaScript.
If you are starting a new cross-platform project in Python, 1.0 is the first version worth building on. If you’re migrating from 0.28, read the migration guide before running pip install --upgrade flet. The event loop change will find you otherwise.
Full release notes at flet.dev/blog/flet-1-0/. Source: github.com/flet-dev/flet.













