Skip to main content
06.08.2026

celld for Self-Hosted Durable Objects

head-image

Durable Objects are useful because they give developers a single-threaded stateful object model without asking them to design a distributed database first. The tradeoff has usually been platform dependency. celld changes that conversation by packaging a self-hosted runtime for Workers and Durable Objects that can run across your own Linux nodes.

What Is celld?

celld is an open-source daemon that embeds V8, executes Wrangler bundles, and stores each Durable Object as its own SQLite database. Those small databases are replicated to an S3-compatible bucket owned by the operator.

The bucket also holds deployments, cell state, and ownership records. Nodes coordinate through object-storage compare-and-swap so exactly one node owns a cell at a time. There is no separate membership service, failure detector, or Raft cluster to operate.

That is the part worth watching. The design makes the bucket the durable source of truth and treats runtime nodes as replaceable workers. When a cell moves or wakes up, the new owner restores its SQLite database and resumes execution.

Key Features

  • Runs Cloudflare Worker bundles and Durable Objects on your own machines
  • Uses one SQLite database per object, which naturally limits contention and blast radius
  • Replicates state to S3, R2, or another S3-compatible object store
  • Coordinates ownership through the bucket instead of a central control plane
  • Hibernates idle cells and supports opt-in pressure shedding for loaded nodes

Installation

The README documents a small installer and a container image:

curl -fsSL https://celld.dev/install.sh | sh

docker run --rm ghcr.io/denoland/celld --version

Worker projects need esbuild on PATH when using celld deploy. Asset-only projects do not.

Running a Node

A minimal node points at the shared bucket and advertises an address peers can reach:

celld deploy . --bucket s3://my-cells-bucket

celld \
  --bucket s3://my-cells-bucket \
  --listen 0.0.0.0:8080 \
  --advertise node-a.internal:8080

For R2 or MinIO, add --endpoint and --region as needed. Behind a load balancer, every node still needs a distinct advertise address for peer traffic.

Operational Tips

Treat bucket access as administrator access. The bucket contains deployments, state, leases, and peer authentication material.

Do not expose peer ports directly to the internet. The project documentation recommends trusted private networking or an encrypted overlay such as WireGuard or Tailscale. Peer requests are HMAC-authenticated and replay-protected, but the advertised network should still be private.

Use celld diagnose --bucket s3://my-cells-bucket during evaluation. It checks live peer records, reports unreachable nodes, flags unsafe advertise addresses, and prints coarse resident-cell, WebSocket, RSS, CPU, file-descriptor, pressure, and shedding samples.

Conclusion

celld is early, but the model is compelling for platform teams experimenting with stateful edge runtimes and agent backends. It avoids a large control plane, keeps state in familiar storage, and gives SREs concrete operational handles for diagnosis and pressure management.

Looking to automate infrastructure operations? Akmatori helps SRE teams reduce toil with AI agents built for real production workflows. For reliable global infrastructure, check out Gcore.

Automate incident response and prevent on-call burnout with AI-driven agents!