Flower (flwr): A Framework-Agnostic Federated AI Toolkit
Flower: A Friendly Federated AI Framework
At a glance
- What is it?
- Flower is a Python framework for building federated learning and federated analytics systems across heterogeneous ML stacks and edge devices. Its value is in the abstraction boundary between client-side training code and server-side aggregation, and its cost is the operational work of running a real client fleet.
- Who is it for?
- Flower is a reasonable choice if you need to coordinate training or analytics across devices or organizations that cannot share raw data, and if your team can operate a client fleet and a server process. It is the wrong tool if your data already fits on one machine, or if you need a turnkey hosted service rather than a library you assemble yourself.
- Can I use it commercially?
- Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
The problem Flower addresses: coordinating training without moving data
Federated learning exists because some datasets cannot be centralized. Medical records, on-device keyboard telemetry, and industrial sensor streams are the usual examples, and the constraint is usually legal or contractual rather than technical. Flower's README frames the project as a framework for building federated AI systems, with the stated design principles of being customizable, extendable, framework-agnostic, and understandable. Those four words describe an audience more than a feature set. If you are a researcher reproducing a published aggregation strategy, or an engineer wiring a fleet of Raspberry Pi devices into a training loop, you are the intended user. If you want a managed service that hides the fleet, you are not. The framework does not claim to solve the harder parts of production federated learning, such as device scheduling under churn, secure aggregation, or differential privacy. The tutorial series lists privacy and security as a coming topic, which is a fair signal that it is not the current focus.
How the client-server split works in practice
The architecture visible in the material is a client-server system. A server process holds the global model and a strategy object that decides how client updates are combined. Clients hold local data and run whatever training or computation code you write against it. The README's framework-agnostic claim is supported by the quickstart list, which includes TensorFlow, PyTorch, Hugging Face, PyTorch Lightning, Pandas, fastai, JAX, scikit-learn, Android via TFLite, and iOS via CoreML. That breadth is the actual mechanism: Flower does not own your model definition, your optimizer, or your data loader. It owns the transport and the aggregation contract. The listed topics include gRPC, which is the communication layer the project names for moving parameters and messages between server and clients. A strategy object is the extension point for aggregation. The tutorial series has a dedicated step for using a federated learning strategy and a further step for building one from scratch, which tells you the project expects you to replace the default rather than tune it. The Pandas quickstart is worth noting separately: it points at federated analytics, where clients compute aggregates over local data instead of training a model. That is a different workload with the same transport, and it is one of the more distinctive things in the repository.
Getting a first run: installation and the tutorial path
The package name on PyPI is flwr, and the installation documentation lives at the framework installation page linked from the README. The README does not inline the pip command, so the exact invocation should be taken from that page rather than guessed. What the README does give is the ordered tutorial series, and the order matters. It starts with a conceptual piece on what federated learning is, then a get-started guide, then writing a first Flower App, then the same with PyTorch, then applying a strategy, then writing a strategy from scratch, then custom messages on the client. Following that sequence is the fastest way to see the client-server split actually move data. The quickstart pages are framework-specific, so a PyTorch user and a scikit-learn user follow different documents from the same starting point. The repository also ships baselines, which are community-contributed reproductions of published experiments. The list includes FedProx, FedNova, FedAvgM, MOON, FedBN, FedMeta, FedPer, FedRep, HeteroFL, FjORD, DASHA, DepthFL, TAMUNA, FedXGBoost, and others. If you are evaluating Flower for research, reading one baseline end to end will tell you more about the framework's real ergonomics than any quickstart, because a baseline has to handle evaluation, configuration, and reproducibility rather than a single training call.
Where Flower is the wrong tool
The clearest failure mode is scope mismatch. If your data can be centralized, Flower adds a network boundary, a server process, and a serialization layer between you and a training loop that would otherwise be a few dozen lines of PyTorch. The README's own framing supports this reading: it describes a framework for building federated AI systems, not a general training library. A second limitation is that the material does not describe built-in privacy mechanisms. The tutorial list places privacy and security in a future installment, and the README does not claim differential privacy or secure aggregation as shipped features. If your threat model includes a curious server operator, you should treat that as something you build or add, not something the framework hands you. Third, the framework-agnostic design has a cost: because Flower does not own the model, it also cannot optimize the transfer of it. Serializing a large model per round is your problem, and the README gives no guidance on compression. Fourth, the Android and iOS quickstarts imply on-device deployment, but the material says nothing about battery, background execution limits, or app store constraints. Those are the parts that usually decide whether a mobile federated deployment ships.
Flower versus a hand-rolled PyTorch training loop
The honest alternative is not another federated framework. It is writing the aggregation yourself: run a training script on each client machine, collect the state dicts over SSH or an object store, average them in a script, and push the result back. For two or three clients on a trusted network, that is a weekend of work and it has no dependency to maintain. The difference in approach is where the abstraction sits. A hand-rolled loop hardcodes the aggregation rule, the round structure, and the transport into your training script. Flower puts the aggregation rule in a strategy object and the transport in gRPC, which means you can swap FedAvg for FedProx without touching client code, and you can add a client without editing the server's training logic. That separation is worth the dependency when the number of clients grows, when clients join and leave between rounds, or when you need to run the same experiment under several strategies to compare them. It is not worth it for a fixed set of machines running one strategy. The baselines directory is the strongest evidence for the separation paying off: it exists because people needed to swap strategies and compare results, and doing that without a framework means rewriting the harness each time.
Release cadence, licence, and upgrade cost
The release list shows framework-1.34.0, 1.35.0, and 1.36.0 landing within roughly three weeks of each other in August and September 2026, and the repository's last push is dated 2026-09-10. That is a fast cadence for a framework you build a production system on. It suggests active development, and it also means pinning a version is the sensible default rather than tracking main. The documentation URLs in the README point at a main branch path, so the docs you read may describe behaviour ahead of the version you installed. Check the version selector on the docs site against your installed flwr version before following a tutorial. The licence is Apache-2.0, which permits commercial use and modification and includes an explicit patent grant, but it also requires that you preserve notices and state changes. That is a description of the licence text, not legal advice; if you are embedding Flower in a distributed product, have counsel read the NOTICE and patent termination clauses. The other maintenance cost the material implies is the framework-agnostic promise itself: because Flower supports PyTorch, TensorFlow, JAX, scikit-learn, and more, a breaking change in any of those ecosystems can surface through Flower's integration layer rather than through your own code, and you will be waiting on a Flower release to fix it.
Who should adopt Flower, and what to verify first
Adopt Flower if you have a genuine data-residency constraint, more than a handful of clients, and a need to experiment with aggregation strategies. The baselines collection and the strategy tutorial are the parts that justify the dependency. Do not adopt it if your data is already centralized, if you need a hosted control plane, or if your primary requirement is privacy guarantees that the framework does not currently advertise. Before committing, verify four things against the repository itself rather than this article. First, run the installation page's command in a clean environment with your exact Python version. Second, open the quickstart for your framework and confirm it matches the tutorial series step you are on, since the two are separate documents. Third, read one baseline's code, ideally FedProx or FedAvgM, to see how much boilerplate sits between the framework and a working experiment. Fourth, pin flwr to a specific version and check whether the docs URL you bookmark is versioned or points at main. If all four hold up, the abstraction is doing real work for you. If the second or third fails, you are better off with a script and an object store.
Editorial conclusion
Flower is a reasonable choice if you need to coordinate training or analytics across devices or organizations that cannot share raw data, and if your team can operate a client fleet and a server process. It is the wrong tool if your data already fits on one machine, or if you need a turnkey hosted service rather than a library you assemble yourself. Before adopting it, verify the installation path for your Python and ML stack, confirm that the quickstart for your framework actually matches the version in the tutorial series, and check the release cadence in the repository's release list against your own upgrade tolerance.
Community notes