Documentation
Serverless, durable streams.
A stream is just nova://bucket/key. Append to it forever, read it from anywhere, and keep as much history as you want at object-storage prices. Each stream is ordered and linearizable, has a committed tail, and supports live subscriptions and conditional writes.
Quick Start
producer
consumer
auto-create both ways, then a trim · pause the replay to copy any line
Use Nova
Append, read, subscribe
Model at the natural grain — a stream per tenant, device, or workflow — and drive it from Go, over HTTP, or from the shell.
How it works
The chain, the epoch, the auditor
Durability is the PUT. Ownership is epoch-fenced at the storage layer. Everything asynchronous is a duty of the auditor.
Operate it
Deploy, scale, watch
A stateless fleet in front of oxia and object storage. Drain and decommission stars, roll upgrades, alert on backlog age.
Try it
Shared terminal
nova://playground/terminal · Express · records live ~5 min · shared with every reader
you — appending as guest
everyone — live tail of the stream
nothing in the last five minutes — say something
The primitive
Five verbs, one stream.
A stream is an ordered, immutable sequence of records with contiguous sequence numbers — a gap is corruption, never intent. Creating one costs a metadata write, so every tenant, device, or workflow can have its own.
- Append
- Batched; optionally conditional on the current tail (match_seq_num) for optimistic concurrency.
- Read
- By sequence number, by timestamp, or by offset from the tail — any star serves history; the live tail follows the leader.
- Subscribe
- Ordered live tailing from any position; resumes exactly after a reconnect.
- CheckTail
- The committed tail — one past the last record — strongly consistent.
- Trim
- Advance the retention watermark. History below it is gone at once, reclaimed lazily.
Built on
Object storage
A write is acknowledged when object storage has it. There is no local durability tier to size, replicate, or rebalance, and the serving fleet holds no data.
oxia
The metastore holds naming, stream descriptors, chain records, and the auditor’s due-queues — never record data. Every mutation is a compare-and-set.
The loglet, after Delos
A stream is a chain of epoch-scoped slots committed by conditional PUTs and acknowledged at a copy quorum. One seal protocol computes each epoch’s end.