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. PUT creates, POST appends, GET replays 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 GET transparently 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

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.