How to Contribute to the denoland/celld Project: A Complete Guide
Submit patches via email to ry@deno.com after generating a clean git format-patch, since the project disables GitHub Pull Requests to maintain strict quality control.
The denoland/celld project implements a self-hosted daemon that runs Cloudflare Workers and Durable Objects on your own infrastructure. Understanding how to contribute to this repository requires familiarity with its email-based workflow, three-layer architecture, and the specific areas where focused improvements are welcomed.
How the celld Architecture Shapes Contributions
The codebase is organized into three distinct layers. Knowing which layer your change targets helps you locate the right files and follow existing patterns.
| Layer | Purpose | Key Files |
|---|---|---|
| Node & Fleet | Process-level orchestration—each node runs a V8 instance, loads Wrangler bundles, and coordinates with peers via a shared bucket |
crates/celld/main.rs (actor setup, HTTP listeners) |
| Logic Core | Routing, leasing, replication, and durability guarantees | crates/logic/lib.rs (celld_logic::routing::Dispatcher) |
| Storage & Replication | SQLite writes captured as LTX log entries, replicated via bucket abstraction | crates/ltx/src/replica.rs, crates/celld/storage.rs |
When contributing to celld, start by identifying which layer your change affects. Bug fixes in request routing belong in crates/logic, while improvements to cross-node replication target crates/ltx.
Step-by-Step Contribution Workflow
1. Review the Contribution Policy
The README at README.md#contributions contains the definitive policy. Key points:
- Pull requests are disabled on the GitHub repository
- All contributions must arrive as email-attached patches
- The license grant is implicit upon sending your patch
2. Build and Run Locally
Clone the repository and verify your development environment:
git clone https://github.com/denoland/celld.git
cd celld
cargo build
Start a local development node:
celld dev
This creates a single-node instance storing data in .celld/dev and loads the example Worker from examples/wsecho/index.js. Use this mode to test logic or storage changes without configuring cloud storage.
3. Select a Focused Improvement Area
Contributions to denoland/celld should be single-purpose and well-scoped. Recommended entry points:
crates/logic— routing fixes, scheduler improvements, cell lifecycle edge casescrates/ltx— LTX compression, replication protocol enhancementscrates/celld— CLI commands, configuration handling, observabilitydocs/— accuracy fixes, missing guarantee explanations, operational guides
Avoid mixing unrelated changes. A patch that fixes a race condition in dispatch_do_call and renames variables for style will be rejected.
4. Create and Test Your Change
Follow the quality checklist before generating your patch:
| Requirement | Verification |
|---|---|
| Clean build | cargo build succeeds |
| Tests pass | cargo test exits clean |
| New behavior tested | Unit or integration test added in same crate |
| Documentation updated | docs/*.md or README.md reflects changes |
| Single logical change | No unrelated refactoring included |
5. Generate and Email the Patch
Create a formatted patch from your commit:
git format-patch -1 HEAD
Email the resulting .patch file to ry@deno.com with:
- Clear subject line describing the change
- Brief motivation paragraph
- Reference to affected source lines (e.g., "Fix race in
dispatch_do_callat line 8000 ofmain.rs")
The maintainers apply patches with git am, so preserving your commit message and authorship metadata matters.
Essential CLI Commands for Contributors
These invocations help you exercise the systems you may extend:
# Deploy a Worker to a bucket (triggers fleet-wide adoption)
celld deploy . --bucket s3://my-cells-bucket
# KV operations (exercises bucket replication logic)
celld kv bulk put sessions wrangler-export.json --bucket s3://my-cells-bucket
# Queue lifecycle management
celld queue pause jobs --bucket s3://my-cells-bucket
# Force generation adoption (tests reload logic in main.rs)
celld reload
Key Source Files to Study
Understanding these files prepares you for effective contributions to celld:
| File | Responsibility | Direct Link |
|---|---|---|
crates/celld/main.rs |
Binary entry point; actor, bucket, HTTP server initialization | source |
crates/logic/lib.rs |
Core routing, scheduling, cell lifecycle | source |
crates/ltx/src/replica.rs |
LTX log replication and durability | source |
crates/celld/storage.rs |
Bucket abstraction (S3/GCS/Azure), lease handling | source |
docs/README.md |
Developer documentation, guarantees, limits | source |
examples/wsecho/index.js |
Minimal Worker for local testing | source |
Summary
- celld contribution to denoland/celld requires email-based patches, not GitHub PRs
- The architecture divides into Node & Fleet, Logic Core, and Storage & Replication layers
- Run
celld devfor local testing without cloud storage configuration - Generate patches with
git format-patch -1 HEADand email tory@deno.com - Include line-number references and follow the single-purpose change rule
- All patches must build, pass tests, include coverage for new behavior, and update documentation
Frequently Asked Questions
Why does celld reject GitHub Pull Requests?
The maintainers prioritize review efficiency over contribution convenience. Email patches allow git am application with preserved metadata and filter out high-volume, low-context submissions that consume disproportionate review time. The project's strict quality gates are maintained through this selective intake process.
What makes a patch likely to be accepted?
Small scope, clear motivation, passing tests, and precise documentation. A patch that adds LTX compression benchmarks in crates/ltx/tests/ with updated docs/README.md references stands better odds than a broad refactor. Referencing exact line numbers in your email (visible in GitHub's source view) demonstrates first-hand code knowledge.
Can I contribute without setting up cloud storage?
Yes. The celld dev command runs a local-only node using .celld/dev for state. This suffices for logic, routing, and storage abstraction testing. Cloud bucket configuration is only required for multi-node fleet behavior or deployment testing.
How do I test changes to the routing dispatcher?
Build with cargo build, run celld dev, then exercise paths through the examples/wsecho/index.js Worker. For deeper validation, add unit tests in crates/logic/tests/ that invoke celld_logic::routing::Dispatcher directly, following existing test patterns in that crate.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →