Introduction
Ursula is built by
Tonbo.
Ursula is a self-hosted, distributed server for the replayable, append-only event timelines behind document edits, agent runs, workflows, and chat. It speaks the Durable Streams Protocol over plain HTTP and SSE.
Quorum-replicated in-memory front-ends give you single-digit-millisecond appends and live tail on top of S3 durability, with no separate broker, no batched 250 ms commits, and no S3 Express bill.
- HTTP-native.
PUTcreates,POSTappends,GETreplays or tails with long-poll/SSE. Any HTTP client is a valid client. - One timeline per resource. A stream per document, session, workflow, room, or agent run, instead of a few high-throughput pipelines.
- Thread-per-core × multi-Raft. Each stream hashes to one Raft group and one owner core. Hot-path requests touch that core only, with no cross-core synchronization. Hundreds to thousands of small groups co-exist per node, so a slow follower for one group never stalls another.
- Hot ring + S3 cold tier. Writes commit at Raft quorum in an in-memory ring. Older segments flush to S3 in the background. A single
GETtransparently spans both tiers.
Run locally
For now, Ursula builds from Rust source. Pre-built release binaries are on the way.
Start a single in-memory node (fast iteration, no persistence):
cargo run --bin ursula
Create a stream, append bytes, and read them back:
curl -X PUT http://127.0.0.1:4437/demo
curl -X PUT http://127.0.0.1:4437/demo/hello
curl -X POST http://127.0.0.1:4437/demo/hello \
-H 'Content-Type: application/octet-stream' \
--data-binary 'hello world'
curl 'http://127.0.0.1:4437/demo/hello?offset=-1'
Learn more
- Why Ursula: the four properties Ursula keeps that other servers force you to trade
- Architecture: thread-per-core, multi-Raft, hot/cold tiers
- Protocol Spec: Durable Streams plus Ursula's extensions
- ursulactl: the operator CLI for a running cluster — rolling restart, status, readiness gate
Credits
- ElectricSQL for the original Durable Streams Protocol that Ursula implements.
- Loro for the snapshot and replay extension design that Ursula adopted on top of the base protocol.