workerd
Open-source V8 behind Cloudflare Workers. Runs your fetch handler. Every stateful binding calls a service you have to build.
OpenOrange
Workers API on Node.js, with Rivet underneath for everything stateful. The services ship with it.
- 2 / 15
- services complete in workerd
- 8
- need a backend you build
- 7
- drop-in on OpenOrange
Service by service
-
Workers
workerd
SupportedThe production V8 runtime. source
OpenOrange
Drop-inNode.js.
-
Durable Objects
workerd
PartialSQLite on local disk, marked experimental. One process owns every object. Cluster mode is behind --experimental and sends peer traffic unencrypted. source
OpenOrange
PartialRivet Actors, spread across your instances. WebSocket hibernation is emulated.
-
Workers KV
workerd
Shim onlyCalls are forwarded to a service you write. source
OpenOrange
Drop-inOne Actor per namespace, strongly consistent.
-
Queues
workerd
Shim onlyNo broker, retries or dead-letter. The consumer handler needs an experimental flag. source
OpenOrange
Drop-inBatching, retries, dead-letter. One batch at a time per queue.
-
Workflows
workerd
Shim onlyThe engine is in Miniflare, not workerd. source
OpenOrange
PartialCloudflare's own engine, one Rivet Actor per instance.
-
Cron Triggers
workerd
Not includedThe handler exists. Nothing fires it.
OpenOrange
Drop-inSame cron syntax.
-
D1
workerd
Shim onlyNo d1 binding in the schema. The client wraps a fetcher you provide.
OpenOrange
Drop-inOne Actor's SQLite per database.
-
R2
workerd
Shim onlyCalls are forwarded to a service you write. source
OpenOrange
PluggableActor storage, or any S3-compatible store: S3, GCS, R2 or MinIO.
-
Cache API
workerd
Not includedThrows "No Cache was configured" unless you supply an HTTP cache. source
OpenOrange
PartialOne Rivet Actor per cache name. Vary is ignored.
-
Hyperdrive
workerd
PartialPasses straight to Postgres. No pooling.
OpenOrange
Drop-inPasses the connection string through.
-
Workers AI, Vectorize, Browser Rendering
workerd
Not includedShims only. wrangler dev proxies them to Cloudflare.
OpenOrange
PluggableAI and Browser Rendering use your provider. Vectorize is not supported.
-
Email Workers
workerd
PartialHandler type only. No ingress, no send_email.
OpenOrange
PluggableSend and receive email through your SMTP server.
-
Static assets
workerd
PartialA disk service with no Content-Type, _headers or _redirects. source
OpenOrange
PartialServes the assets directory with Wrangler's rules. _headers and _redirects are not applied.
-
Service bindings, WebSockets, Wasm
workerd
SupportedOpenOrange
Partialconnect() and WebSocket upgrades to another Worker throw. Wasm module bindings are not supported.
-
wrangler config
workerd
Partialname, main, compat flags, vars, durable_objects and migrations. Anything else is an error. source
OpenOrange
Drop-inRead unchanged. A few keys, such as legacy_assets, stop orange dev.
workerd read from cloudflare/workerd at eed7c37, 2026-10-31. Shim only: the binding ships, the service does not. Test results per feature: compatibility; per binding: bindings.
Limits
The 128 MB and 30 second caps are Cloudflare's, not workerd's.
-
Memory per Worker
- Cloudflare
- 128 MB
- workerd
- No limit
- OpenOrange
- The Node.js heap of the runtime process
-
CPU time per request
- Cloudflare
- 30 s default, 5 min max
- workerd
- No limit
- OpenOrange
- No limit
-
Subrequests per request
- Cloudflare
- 10,000
- workerd
- No limit
- OpenOrange
- OS limits
-
Alarm wall time
- Cloudflare
- 15 min
- workerd
- 15 min, hard-coded
- OpenOrange
- About 24.8 days, the longest Node.js timer
-
Node.js APIs
- Cloudflare
- nodejs_compat subset
- workerd
- nodejs_compat subset
- OpenOrange
- Node.js modules, with workerd-shaped process and fs
-
Native npm modules
- Cloudflare
- No
- workerd
- No
- OpenOrange
- Not tested
-
Process model
- Cloudflare
- Cloudflare's
- workerd
- One thread per process. You run the load balancer.
- OpenOrange
- One process per Worker per instance. Rivet places Actors across instances.
-
Durable Objects across machines
- Cloudflare
- Yes
- workerd
- Experimental cluster mode, unencrypted.
- OpenOrange
- Yes
-
Running untrusted code
- Cloudflare
- Hardened
- workerd
- "Not a hardened sandbox"
- OpenOrange
- Same as any Node.js service
-
Runtime upgrades
- Cloudflare
- Cloudflare's schedule
- workerd
- Your schedule
- OpenOrange
- Your schedule
Workers Paid plan, checked 2026-10-08. workerd from worker-factory.c++ at eed7c37.
Cost
100 always-on Durable Objects for one month.
Cloudflare
- Durable Object duration 412.50
- Durable Object requests 1.80
- Workers Paid minimum 5.00
Cloudflare's pricing example 3
Total / mo $419.30
workerd
- m7i.xlarge, 730 h 147.00
- KV store you build it
- Queue broker you build it
- SQLite service you build it
- HTTP cache you build it
- Scheduler you build it
- Load balancer you build it
- Deploy pipeline you build it
Total / mo $147.00 + ?
OpenOrange
- m7i.xlarge, 730 h 147.00
- Rivet, Apache 2.0 0.00
AWS on-demand, us-east-1
Total / mo $147.00
Pick workerd when
- Your Worker is a fetch handler with no stateful bindings.
- You need the exact V8 semantics Cloudflare runs.
- You are building a dev tool.
Pick OpenOrange when
- You use KV, Queues, D1, Workflows, cron or the Cache API.
- Durable Objects need more than one machine.
- You want to deploy with one command.
Same project. All of it runs.
Keep the wrangler config.
Built for serious scale.