Open-source project
bytewax/bytewax avatar
bytewax/bytewax

Bytewax: Python Stream Processing With a Rust Core, Now Community-Maintained

Python Stream Processing

2,050 stars112 forksPythonApache-2.0

At a glance

What is it?
Bytewax is a Python framework for stateful stream processing built on a Rust engine, with dataflow operators, event-time windowing and connectors for Kafka, files and Redis. The project moved to community maintenance in May 2025, which is the first thing any production adopter has to weigh.
Who is it for?
Adopt Bytewax when your team writes Python, your pipeline is stateful and windowed, and you can absorb the uncertainty of a project that the original company stopped funding in May 2025. Do not adopt it if you need a vendor with a support contract or a guaranteed release cadence, because there is no longer one behind it.
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 last received commits 88 days ago.
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 Gap Bytewax Fills: Stateful Streams Without Leaving Python

Most Python teams that need streaming end up choosing between a Java or Scala engine they cannot easily extend and a hand-rolled consumer loop that loses state on restart. Bytewax targets that gap directly. The README describes it as a Python framework and Rust-based distributed processing engine for stateful event and stream processing, and says it is inspired by capabilities found in Apache Flink, Spark and Kafka Streams. The audience is data engineers and data scientists who already work in Python and want windowing, joins and recoverable state without writing JVM code or operating a separate cluster to get started.

The interesting part is where the split falls. Your transformations are ordinary Python functions. The execution engine, scheduling and state handling live in Rust. That means the code you write is testable with the Python tooling you already have, while the parts that need throughput are not written in Python. Whether that trade pays off depends on how much of your runtime is spent inside the Python callables versus inside the engine, and the README makes no performance claim either way.

The Dataflow Model and Where State Actually Lives

A Bytewax program is a dataflow graph. You construct a Dataflow object, attach inputs, chain operators, and attach outputs. The README's quickstart shows the shape: create a Dataflow named quickstart, call op.input with a TestingSource, then op.filter, then op.map, then op.inspect. Nothing runs at definition time. Execution happens when you invoke the module, which is why the same file works as a library import in a test and as a job on a cluster.

Operators are split into three groups in the README. Stateless operators are map, filter and inspect. Stateful operators are reduce, fold_window and stateful_map. Windowing covers event-time and processing-time windows, with tumbling, sliding and session variants. Joins and merges come from merge and join. The README also lists a Premium Operators category without naming what is in it, which is worth noting: if a capability is gated, the free surface is the operators named above.

The README states that Bytewax maintains distributed state, supports fault tolerance and state recovery, and handles event-time windowing. It does not describe the state backend, the checkpoint interval or the recovery protocol in the material available here. If your pipeline's correctness depends on exactly-once semantics under failure, that is a question for the operator API documentation, not the README.

Installation, the Run Command and the Deployment Path

Installation is a single PyPI package: pip install bytewax. The README points to a separate binary, waxctl, for managing deployments at scale, downloaded from bytewax.io rather than from PyPI. That split matters because waxctl is not covered by the Apache-2.0 repository licence in the way the Python package is; it is a distinct distribution with its own download page.

Running a flow locally is python -m bytewax.run quickstart.py, where the argument is the file containing the Dataflow. The README does not show flags for worker count or process count in the excerpt available, so treat the single-process form as the documented baseline and check the user guide for the distributed invocation. Deployment options listed are running locally, containerized execution, and scaling on Kubernetes. The README says you scale horizontally by running multiple workers on multiple machines and integrate with Kubernetes for dynamic scaling, monitoring and resilience, but it does not give a manifest, a Helm chart name or a replica-count recipe.

For development, TestingSource and the inspect operator let you run a flow end to end inside a test process. The README explicitly suggests using TestingSource and running flows directly in CI, and testing individual functions as normal Python code. That is a real advantage over engines where a local run requires a cluster.

Connectors: What Ships in the Box and What Does Not

Built-in connectors named in the README are Kafka (bytewax.connectors.kafka), StdIn and StdOut (bytewax.connectors.stdio), and Redis and S3. File systems and WebSockets are mentioned as sources in the dataflow description. Custom connectors are supported and documented under advanced concepts in the user guide.

The README points to a module hub for community and partner connectors. That is where the coverage question gets sharp. A connector listed in the module hub is not the same as a connector maintained in the main repository, and the README does not say who reviews, versions or supports hub entries. Before designing around a source or sink, confirm whether it lives in bytewax.connectors or in the hub, because the maintenance expectations differ and the community-maintenance notice makes that distinction more consequential than it was in 2024.

The README also labels a category of Premium Operators without listing them. Combined with the module hub, this suggests the open repository is the core engine and a set of connectors, while some surface area sits outside it. That is a normal commercial structure, but it is worth mapping before you commit, because the company that ran it is no longer commercially viable.

The Maintenance Question Is the Adoption Question

The most important paragraph in the README is the notice at the top. As of May 2025, Bytewax the company is no longer commercially viable and the original core team has stepped back from day-to-day maintenance. The project stays open source under Apache-2.0 and the notice says the maintainer pool is being actively rebuilt. It directs people who depend on Bytewax in production to issue #560 or to MAINTAINERS.md.

The release history is consistent with that story. The most recent release listed is v0.21.1 from November 2024, following v0.21.0 in August 2024 and v0.20.1 in May 2024. The repository shows a push in June 2026, so the codebase is not frozen, but the material available does not show a release after v0.21.1. A repository with recent commits and no recent tagged release is a specific pattern: fixes may be landing on main without a versioned artifact for you to pin.

For an adopter this changes the calculus. You are not buying a support relationship, because there is no vendor. You are depending on a volunteer maintainer pool whose composition is described as still being rebuilt. That is workable for internal tooling and for pipelines you can patch yourself. It is a harder case for regulated workloads where you need a named party to escalate to.

Where Bytewax Is the Wrong Tool

Bytewax is a poor fit if your streaming logic is already expressed in SQL and your team has no Python depth. The entire programming model is Python functions attached to operators, and the value proposition is that you reuse Python libraries. If that is not your team, you are paying the cost of a Python execution boundary for nothing.

It is also a poor fit when you need a managed service with an SLA. The README describes deployment on Kubernetes and via waxctl, which means you operate the cluster, the workers and the state recovery yourself. There is no hosted control plane described in this material, and the company behind the original commercial offering is gone.

A third case: short-lived batch jobs. The dataflow model, state recovery and windowing machinery exist to handle unbounded streams. If your input is a finite file that fits in memory, pandas or Polars will be less machinery for the same result. Bytewax's own quickstart uses a five-element list as its source, which is a fine teaching example but not a reason to adopt a stateful engine.

Finally, if you need exactly-once guarantees across a sink, the README does not state them. It says state recovery and fault tolerance are supported, which is not the same claim. Verify against the operator documentation before relying on it.

How It Differs From Apache Flink and Kafka Streams

Flink and Kafka Streams are the reference points the README itself names. The difference is the extension boundary. In Flink, custom operators and connectors are typically written in Java or Scala and packaged as JARs, which puts a build toolchain and a JVM between your idea and your pipeline. In Kafka Streams, the topology is a Java DSL and the state stores are tied to the Kafka ecosystem, so your input and output are Kafka topics by default.

Bytewax inverts that. The graph is built in Python, the operators take Python callables, and the connectors are Python modules you import. The Rust engine sits underneath and is not something you usually touch. The practical consequence is that a data scientist can add a scikit-learn or PyTorch step inside a map or stateful_map without a separate deployment artifact, which is the scenario the README's mention of online machine learning points at.

The cost of that inversion is that you inherit Python's runtime characteristics inside every callable, and you depend on the connector coverage the project ships rather than the much larger ecosystem that has grown around the JVM engines. Choose Bytewax for the Python boundary, not because it beats Flink on throughput. Nothing in this material supports a throughput comparison.

Licence, Upgrade Cost and What to Check First

The repository is Apache-2.0, and the README shows the licence badge pointing at the LICENSE file in the repository. Apache-2.0 permits commercial use, modification and redistribution with the usual attribution and notice requirements, and it includes a patent grant. It does not give you a support contract, a warranty, or any commitment about future releases. The waxctl binary is distributed from bytewax.io and the README does not state its licence, so if you plan to build deployment automation on waxctl, check that separately. This is a description of what the licence permits, not legal advice; get your own review if the distinction matters to your organisation.

Upgrade cost is the more concrete concern. The release cadence visible here is roughly one minor release every three to four months through 2024, then nothing after v0.21.1 in November 2024. Pinning to 0.21.x is the low-risk move. Moving to main means tracking unreleased changes with no version to point at when something breaks. For a stateful engine, that is not a trivial difference: a change in how state is serialised or how checkpoints are written can make an upgrade a migration rather than a version bump, and the material here does not document the migration path between 0.20 and 0.21.

What to verify before you commit: whether the connectors you need are in bytewax.connectors or only in the module hub, what the state recovery guarantees actually are at your chosen version, and whether anyone is currently answering on issue #560. Those three answers determine whether Bytewax is a dependency you can carry or one you will end up maintaining.

Editorial conclusion

Adopt Bytewax when your team writes Python, your pipeline is stateful and windowed, and you can absorb the uncertainty of a project that the original company stopped funding in May 2025. Do not adopt it if you need a vendor with a support contract or a guaranteed release cadence, because there is no longer one behind it. Before committing, read MAINTAINERS.md, read issue #560, and check whether the connectors you need are listed in the API docs rather than only in the module hub.

Official sources

  1. bytewax/bytewax on GitHub
  2. License: Apache-2.0
  3. Project website
  4. README
  5. Releases
Community notes

Community notes