$ 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 | Supported | examples/facets → |
| KV | key-value store | Supported | examples/kv → |
| Queues | message queue | Supported | examples/queues → |
| 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 | examples/static-assets → |
| Dynamic Workers | Workers loaded at runtime | Supported | examples/dynamic-worker-tails → |
| Containers | a container supervised by a Durable Object | Experimental | examples/container → |
celld deploy reads your existing wrangler.json and stops on an unknown key instead of ignoring it.Workers handle requests. Durable Objects, KV, Queues, D1, and Workflows keep their state in cells, each with its own SQLite database. Nodes share a bucket for durable storage, and a conditional bucket write assigns cell ownership. The fleet needs no membership protocol, failure detector, or consensus service.
JavaScript + SQLite per cell
JavaScript + SQLite per cell
Any number of celld instances
Durable state for every cell
SQLite + LTX · ownership · deployments
S3-compatible · Google Cloud Storage · Azure Blob Storage
celld keeps the Durable Objects programming model and gives you control over where cells run, how their state is stored, and how you investigate failures.
A review and an incident record about Durable Objects from July 2026.

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

What self-hosting changes:
A cell belongs to whichever node holds its lease in your bucket. If that node fails, another acquires the lease through compare-and-swap and restores the cell from your storage in seconds.
Your fleet still depends on its machines, network, and bucket provider. Cell scheduling and placement run within your fleet, separate from other customers' Durable Objects workloads.
You can investigate a cell's failures through its ownership record, SQLite and LTX files, and logs, using tools like sqlite3 and grep.
Self-hosting puts you in charge of your nodes, bucket provider, and operations, but it doesn't guarantee reliability.
We love Cloudflare, and this very page runs on a Cloudflare Worker. The Durable Objects model is one of the best primitives distributed systems has gained in years: a single-threaded object with its own storage, addressed by name. That design belongs to Kenton Varda and the Cloudflare Workers team.
celld is a love letter to their idea; a primitive this good deserves to run anywhere.
A stateful distributed system built on S3.
LTX is Litestream's replica format, from Ben Johnson