Stop polling for what changed.
StateStream keeps one source of truth in sync across services, browsers and edge nodes. Every change is a numbered patch in an append-only log, so any client can catch up after a dropped connection, replay a session, or rewind to the exact moment something went wrong. We're finishing the boring parts first.
- delivery
- Ordered, exactly-once per subscriber. Resume from any
seqyou've seen — no full refetch. - wire format
- JSON Patch over WebSocket, SSE fallback, plain HTTP for anything that can't hold a socket.
- storage
- Append-only segments, compacted into snapshots in the background. Writers never wait for compaction.
- rewind
- Read state as of any
seqor timestamp inside your retention window. Diff two points in time. - conflicts
- Resolved by the server, in order, with the losing write kept in the log so you can see what happened.
- clients
- TypeScript first (6.8 kB gz). Go and Python after launch.
- self-host
- One binary plus Postgres for metadata. Same API as hosted.
What it is not.
A database. Keep yours. StateStream sits next to it and streams what changed.
A queue you have to babysit. No partitions to rebalance, no consumer groups to explain to the new hire.
CRDT magic. We picked a single ordered log on purpose. It's boring, debuggable, and it doesn't surprise you at 2 a.m.
— the people on call for it
- Ordered delivery survives network partitions in our fault-injection harness
- Client resumes cleanly after 24 hours offline
- Compaction without write stalls
- TypeScript client under 7 kB gzipped
- Rewind API works across compacted segments
- Fan-out p99 under 10 ms across three regionscurrently 14 ms
- Billing you can predict without a spreadsheetpricing model drafted, not tested
- Docs a tired person can follow during an incidenthalf written, all rewritten twice
Five of eight. The last three are the hard ones.
Fan-out p99 is 14 ms between Frankfurt, Saigon and Virginia. It was 31 ms in September. The last four milliseconds are going to cost more than the first seventeen.tags: latency, fan-out
Rewind now works on compacted segments. "Just replay from the nearest snapshot" turned out to have eleven edge cases. We wrote a test for each one and named them after the people who found them.tags: rewind, storage
TypeScript client dropped below 7 kB gzipped after we deleted our own event emitter. Nobody noticed it was gone, which is the best review a piece of code can get.tags: client
The 24-hour-offline resume test has been green for thirty nights straight. Moving it from "flaky" to "boring", where it belongs.tags: reliability
First external alpha team onboarded. They found three bugs in under an hour, two of them in the error messages. Good.tags: alpha
Ask for a seat in the next wave.
We let teams in a few at a time so we can actually answer when something breaks. Tell us what you'd stream and we'll prioritise the workloads that will hurt us most usefully.