denoland / celld
git clone https://github.com/denoland/celld.git
v0.6.2 · 15d ago
self-hosted, distributed Durable Objects
+21
stars, 24h · #708
+~147
stars, 7 days · #860
+~630
stars, 30 days · #854
6.0k
★ total · +3% this week
407
forks · 71 open issues
Star history (as recorded here)
LanguageRust
LicenseApache-2.0
Created2025-04-25 (1y ago)
Last pushtoday
Watchers28
OwnerOrganization
Links
- GitHub: github.com/denoland/celld
- Homepage: https://celld.dev
- Releases · Issues · Hacker News mentions
README excerpt
# celld Self-hosted, distributed **Durable Objects**. celld is an open-source daemon that runs a Cloudflare Workers application on your own machines: Workers, Durable Objects, KV, Queues, D1, R2, Workflows, Cron Triggers, and static assets, deployed from the `wrangler.json` that you already have. Each object is a cell: a named server with its own SQLite database. celld stores the long-term state in your S3-compatible, Google Cloud Storage, or Azure Blob Storage bucket. It needs no serving control plane or consensus service. An inactive cell costs almost nothing. Learn more at celld.dev or read the documentation. ## How it works A node is one `celld` process, and you run one on each machine. Every node embeds V8 and executes Wrangler bundles. The nodes that share one bucket are a fleet, and that bucket holds the deployments, the cell state, and small ownership records. A conditional bucket write gives a node the ownership of a cell, so exactly one node owns a cell at a time. The fleet needs no membership protocol, failure detector, or consensus service. Signed peer HTTP provides routing and replicated-log transport. celld captures each committed SQLite write in the LTX replication format. A single node proves the write durable by uploading that data to the bucket. A fleet of two or more nodes proves it sooner: the owner sends the data to one or two other nodes, and the write is durable as soon as they hold it on their disks. celld uploads the data to the bucket afterwards. A single node has no other node to send to, so each write waits for the bucket, and those writes are much slower. Before a takeover restores a cell, celld recovers an open log from the prior owner, so the bucket holds the long-term state and nodes stay replaceable. See what celld guarantees for the complete protocol. ## What runs on celld celld runs the programmatic Workers platform: the runtime, and each binding that Cloudflare builds on Workers and Durable Objects. A KV namespace, a queue, a D1 database, and a Workflow are each a cell, so they get the same lease, the same replication, and the same failover as a Durable Object. R2 bindings read, write, and list objects directly in the fleet bucket. Each row links to a project that deploys as-is: | service | example | | --- | --- | | Workers: fetch handlers, service bindings, JS RPC, Node.js compat | `hello` | | Durable Objects: SQLite storage, alarms, hibernating WebSockets | `counter` | | KV: list, metadata, expiration, bulk import | `kv` | | Queues: producers, batching consumers, retries, dead letters | `queues` | | D1: SQL databases, batches, migrations | `d1` | | R2: reads, writes, lists, multipart uploads | `r2` | | Workflows: durable steps, sleeps, events, pause and restart | `workflow` | | Cron Triggers: one run for each occurrence across the fleet | `cron` | | Static assets: asset-only or with a Worker, `_headers`, `_redirects` | `static-assets` | | Dynamic Workers: runtime-loaded code and Tail Worker observability | `d