$ curl -fsSL celld.dev/install.sh | sh$ docker run ghcr.io/denoland/celld❯ create a distributed chat app with vite, use celld.dev and exe.dev, 2 VMs| Durability | ||
|---|---|---|
| Writers per cell (epoch-fenced) | 1 | |
| Acknowledged writes lost on kill | 0 | RPO=0 |
| Durable write latency (one node, region-local) | ~90 | ms |
| Failover after node loss, 0 lost | ~20 | s |
| Speed (warm) | ||
| Stateless request p50 / p99 | 0.2 / 0.3 | ms |
| Stateless throughput / worker thread | ~94k | req/s |
| Wake a hibernated cell | ~4 | ms |
| Density & cost | ||
| RAM per resident cell | 0.47 | MB |
| Resident cells / 8 GB node | 2,500 | cells |
| Inactive cell cost | ~0 | bucket ops |
| $ / resident cell-month | ~$0.02 | |
| Compatibility | ||
| Supported services and APIs | docs → | |
| Service | What it is | Status | Example |
|---|---|---|---|
| Workers | stateless request handlers | Supported | examples/hello → |
| Durable Objects / Cells | single-threaded actors with durable storage | Supported | examples/counter → |
| Durable Object Facets | child objects inside a Durable Object | Experimental | docs → |
| KV | key-value store | Supported | examples/kv → |
| Queues | message queue | Supported | docs → |
| D1 | SQL database | Supported | examples/d1 → |
| R2 | S3-style object storage | Supported | examples/r2 → |
| Workflows | durable multi-step execution | Supported | examples/workflow → |
| Cron Triggers | scheduled handlers | Supported | examples/cron → |
| Static assets | files served from a directory | Supported | docs → |
| WebAssembly | compiled modules imported by a Worker | Supported | examples/wasm → |
| Dynamic Workers | Workers loaded at runtime | Experimental | docs → |
celld deploy reads the wrangler.json you already have; an unknown key stops the deploy rather than silently doing nothing.The bucket is the coordinator — no membership protocol, no failure detector, no consensus. Ownership is a record in your bucket, claimed with one atomic write. celld continuously replicates each cell's SQLite state to that bucket as LTX segments.
Durable Objects is a strong programming model. celld keeps that model while moving placement, state, and operational evidence into infrastructure you choose.
Two public records from the same month.

“technically impressive, operationally terrifying. Should have stayed an internal primitive.”

What changes when you run the model yourself:
A cell's identity isn't fused to a machine — ownership is a lease in your bucket, granted by compare-and-swap. Lose a node and another acquires the lease and restores the cell in seconds: your fleet reading your storage, not a vendor restoring a placement you can't see.
Your fleet still depends on its machines, network, and bucket provider. What changes is tenancy: no shared Durable Objects scheduler or placement layer can couple your application to another customer's workload.
When a cell misbehaves the evidence is on your disk — the ownership record, the SQLite and LTX files, and the logs. You answer “what happened to my cell” with sqlite3 and grep, not a status page that declines to say.
Self-hosting is not automatically more reliable. It makes the failure domain explicit and inspectable: your nodes, your bucket provider, and your operational choices.
And to be clear about the tone: we love Cloudflare — this very page is served by a Cloudflare Worker. The Durable Objects model — a single-threaded object with its own storage, addressed by name — is one of the best primitives distributed systems has gained in years, and that design is Kenton Varda's and the Cloudflare Workers team's. celld is a love letter to their idea; a primitive this good deserves to run anywhere.
A stateful distributed system that rests entirely on S3.
LTX is Litestream's replica format, from Ben Johnson