
Bytewax
A Python stream processing framework on a Rust engine built on Timely Dataflow; its company wound down in 2025 and the last release is from November 2024.
- What it is
- Stream processing
- Type
- Open source
- Made by
- Community-maintained since 2025; built by Bytewax, Inc., which is no longer operating
- License
- Apache 2.0
- Facts checked
- 6 October 2026
What it is
Bytewax is a Python library with a Rust core. You describe a Dataflow of operators (map, filter, stateful_map, fold_window, join) and give them plain Python functions. python -m bytewax.run compiles that graph into Timely Dataflow, a Rust dataflow runtime that Bytewax embeds through PyO3, and every worker calls your Python code for each item. Workers are threads; you can run several in one process (-w) or start processes on several machines (-i, -a), and items that must move to another worker for a keyed step are pickled and sent over the network. Inputs stamp items with epochs, short wall-clock intervals. At each snapshot interval every stateful operator pickles its state, and internal recovery operators write those snapshots and the input positions (including Kafka offsets, which Bytewax keeps itself rather than in consumer groups) into recovery partitions, which are SQLite files. After a crash, the next run finds the newest epoch that every partition finished, rewinds state and inputs to it, and can do so with a different number of workers. Output to Kafka is at-least-once: messages from that epoch are written again.
The code is Apache 2.0. Bytewax, Inc., founded by Zander Matheson, open-sourced it in 2022 and tried to sell a paid Bytewax Platform for running dataflows on Kubernetes. In May 2025 the company was no longer commercially viable and the core team stopped maintaining the project. A year later Matheson marked the repository as community-maintained, with himself as the only listed maintainer. Commits since then have updated CI and dependencies (including PyO3 for Python 3.13 and 3.14), but as of October 2026 there has been no release since 0.21.1 on 25 November 2024, whose wheels cover Python 3.8 to 3.12. The bytewax.io website and hosted docs no longer resolve; the docs source lives in the repository.
Why teams pick it
- Python all the way: operators take ordinary Python functions, so pandas, NumPy or online-learning libraries run inside the dataflow, installed with
pipand no JVM - Stateful operators with recovery:
stateful_map, joins, and tumbling, sliding and session windows on event or processing time - Rescaling between runs: on resume, saved state follows its keys to however many workers the new run has
- The same script runs on a laptop, as several processes, or on Kubernetes with the published Helm chart
Watch out for
- No company behind it and one volunteer maintainer: the last release is 0.21.1 (November 2024), and there are no published wheels for Python 3.13 or newer
- The paid Platform is gone, the website and hosted docs are offline, and the
waxctldownloads repository is archived - Recovery partitions are SQLite files you create up front, in a count you can’t change later, and back up yourself, for example with cron or Litestream
- Kafka output is at-least-once, so sinks see duplicates after a resume and should be idempotent; a resume can also replay up to one snapshot interval
- Epochs follow each worker’s wall clock, so a cluster assumes roughly synchronized clocks
Alternatives
What all stream processing have in common →
ArroyoOpen sourceA stream processing engine in Rust: you write the pipeline as SQL, and it keeps windows and joins running with checkpointed state.
FelderaOpen sourceAn incremental view maintenance engine in Rust: you write SQL tables and views, and it keeps every view up to date by processing only the changes, based on the award-winning DBSP theory.
ksqlDBCommercialConfluent’s SQL server for Kafka: queries that run forever, turning topics into new topics and into tables you can look up.
PathwayCommercialA Python framework for streaming ETL and live RAG pipelines: you write table transformations in Python, and a Rust engine built on Differential Dataflow keeps the results up to date.
Quix StreamsOpen sourceA pure-Python library for stateful stream processing on Kafka: a pandas-like Streaming DataFrame, RocksDB state backed up to Kafka, and no cluster of its own.
Redpanda ConnectRenamedOpen sourceFormerly Benthos: one Go binary that runs a YAML pipeline of inputs, processors and outputs, with at-least-once delivery and no disk state of its own.
StreamlingCommercialGoldsky’s young Rust pipeline runtime: YAML pipelines of stateless SQL, TypeScript and plugin steps on Arrow, from Kafka or files into Postgres, ClickHouse or webhooks.Timely DataflowOpen sourceA Rust library for data-parallel dataflow with logical timestamps, loops and exact progress tracking; the engine underneath Materialize.How it fits with other technologies
Average temperature per sensor per minute, from one Kafka topic to another (Bytewax 0.21) · python
# dataflow.py
import json
from datetime import datetime, timedelta, timezone
import bytewax.operators as op
import bytewax.operators.windowing as win
from bytewax.connectors.kafka import KafkaSinkMessage
from bytewax.connectors.kafka import operators as kop
from bytewax.dataflow import Dataflow
from bytewax.operators.windowing import EventClock, TumblingWindower
BROKERS = ["kafka-1:9092"]
flow = Dataflow("sensor-averages")
msgs = kop.input("in", flow, brokers=BROKERS, topics=["sensor-readings"])
readings = op.map("parse", msgs.oks, lambda m: json.loads(m.value))
by_sensor = op.key_on("key", readings, lambda r: r["sensor_id"])
clock = EventClock(
lambda r: datetime.fromisoformat(r["ts"]), # e.g. "2026-10-06T12:00:03+00:00"
wait_for_system_duration=timedelta(seconds=10), # wait for late readings
)
windower = TumblingWindower(
length=timedelta(minutes=1),
align_to=datetime(2026, 1, 1, tzinfo=timezone.utc),
)
sums = win.fold_window(
"sum", by_sensor, clock, windower,
builder=lambda: (0.0, 0),
folder=lambda acc, r: (acc[0] + r["temp_c"], acc[1] + 1),
merger=lambda a, b: (a[0] + b[0], a[1] + b[1]),
)
def encode(item):
sensor_id, (window_id, (total, n)) = item
body = {"sensor_id": sensor_id, "window": window_id, "avg_c": total / n}
return KafkaSinkMessage(sensor_id.encode(), json.dumps(body).encode())
out = op.map("encode", sums.down, encode)
kop.output("out", out, brokers=BROKERS, topic="sensor-averages-1m")
# once: python -m bytewax.recovery recovery/ 4
# run: python -m bytewax.run dataflow:flow -w 2 -r recovery/ -s 30 -b 0Project status, October 2026#
What a new user would find today, checked 2026-10-06.
| Item | Status |
|---|---|
| Latest release | 0.21.1, 25 November 2024 (GitHub and PyPI) |
| Python versions with wheels | 3.8 to 3.12; 3.13 and 3.14 support is merged but unreleased |
| Company | Bytewax, Inc. said in May 2025 it was not commercially viable; the core team stepped back |
| Maintainers | Founder Zander Matheson, best effort, looking for more maintainers in issue #560 |
| Last commit to main | 20 June 2026 (CI and dependency upgrades); several pull requests open |
| Website, docs, `waxctl` | bytewax.io doesn’t resolve; docs source is in the repo; waxctl-downloads is archived |
| Repository | Not archived; Apache 2.0, so forks are allowed (one user publishes bytewax-fork on PyPI) |
Where Bytewax users are looking#
Alternatives named by users in the project’s own “State of the project?” issue.
Quix Streams
Apache 2.0Pure-Python library on Kafka with RocksDB state and changelog topics, released every few weeks. Needs Kafka for everything, but no cluster of its own.
Pathway
BSL 1.1Python API on a Rust engine based on Differential Dataflow, a close cousin of Timely. Free production use is limited to one machine; the licence is source-available, not open source.
Arroyo
MIT or Apache 2.0A Rust stream engine where pipelines are SQL, with checkpoints to object storage, developed by the Arroyo team at Cloudflare.
Stay on 0.21 or a fork
your own riskExisting dataflows keep running on Python 3.12 or older. The repo accepts pull requests, and a user-run fork, bytewax-fork, carries extra fixes.
See it in a real stack
No architecture uses Bytewax yet. Drop it into the playground and wire it up yourself.Open playground →Where it came from2021–2026
In the early 2020s the main stateful stream processors, such as Flink, Spark and Kafka Streams, ran on the JVM, and most meant running a cluster. Zander Matheson, who had worked on data at Heroku and GitHub, saw teams spend months on infrastructure before they could build fraud detection or monitoring, while the people writing that logic worked in Python.
His company, Bytewax, open-sourced its framework on 7 February 2022: a Python library on top of Timely Dataflow, a Rust dataflow engine, so it could scale from one machine to a cluster without a JVM. Version 0.17 in 2023 rebuilt recovery around SQLite partitions so dataflows could be rescaled, and 0.18 that December reshaped the API into stand-alone operator functions. Microsoft’s venture fund M12 invested in 2023 to support the open source and a paid Bytewax Platform.
The platform didn’t find enough customers. In May 2025 Matheson told users the company was not viable and the core team would stop maintaining the project. A year later he wrote on GitHub that Bytewax “wasn’t commercially viable and the original core team isn’t maintaining the project full-time anymore”, and set it up for community maintenance.
Why it’s built this way
- A Python API on a Rust engine
- The team wanted Python’s ecosystem for the logic and a fast, scalable back end, without making users learn another language or run another distributed system. Timely Dataflow supplied the Rust runtime and networking.
- Epochs from Timely’s progress tracking
- Timely tells every operator when an epoch is finished across the whole cluster. Bytewax uses that signal both for backpressure and to send a consistent wave of snapshots through every stateful operator.
- Its own recovery store instead of Kafka consumer groups
- To rewind every input and every operator to the same snapshot, and to change the worker count on resume, Bytewax keeps offsets and state together in SQLite recovery partitions. Version 0.17 dropped the earlier Kafka-based recovery for this design.
Timeline
- 2021
Zander Matheson starts Bytewax, Inc.
- 2022
Open-sourced on 7 February as a Python framework on Timely Dataflow
- 2023
0.17 reworks recovery and allows rescaling; M12 invests
- 2024
0.21.1 in November, the last release so far
- 2025
Company no longer viable in May; core team stops maintaining
- 2026
Repository marked community-maintained in May
- Bytewax blog: Announcing Bytewax, powerful stream processing for the rest of us (Feb 2022) · archived copy, original
- Bytewax blog: M12 invests in the future of stream processing with Bytewax (2023) · archived copy, original
- Bytewax CHANGELOG (0.17.0 recovery rework, 0.18.0 operator API)
- Bytewax docs source: Architecture (Timely Dataflow, PyO3, epochs, SQLite recovery)
- GitHub issue #560: State of the project? (Matheson’s May 2025 Slack note quoted; his May 2026 update)
- GitHub: Bytewax v0.21.1 release (Nov 2024)
Sources26 · facts checked 6 October 2026
- Bytewax README (community-maintained notice, features)
- Bytewax MAINTAINERS.md (current maintainer, past core team)
- Bytewax LICENSE (Apache 2.0)
- Bytewax Cargo.toml (timely, pyo3, rusqlite)
- Bytewax releases on GitHub
- Bytewax commit history
- Bytewax pull requests
- Matheson’s update in issue #560 (May 2026)
- PyPI: bytewax 0.21.1 files (wheels for CPython 3.8 to 3.12)
- PyPI: bytewax-fork
- Bytewax docs source: Architecture
- Bytewax docs source: Recovery (SQLite partitions, fixed count, backups, at-least-once caveat)
- Bytewax docs source: Workers and parallelization (threads, processes, pickling)
- Bytewax docs source: Kafka (offsets kept in recovery partitions, Redpanda)
- Bytewax docs source: Windowing
- Bytewax docs source: Rescaling
- Bytewax docs source: Deployment overview (Bytewax Platform, waxctl, Helm chart)
- Bytewax docs source: Metrics (OpenTelemetry tracing)
- Bytewax source: Kafka operators (at-least-once output, duplicates after resume)
- Bytewax source: windowing operators (EventClock, TumblingWindower, fold_window)
- Bytewax source: bytewax.run flags (-s snapshot and -b backup intervals required with recovery)
- GitHub: bytewax/waxctl-downloads (archived)
- Quix Streams README
- Pathway README (Rust engine based on Differential Dataflow)
- Pathway LICENSE (BSL 1.1, single-machine production grant)
- Arroyo README