Run Cloudflare Workers anywhere: AWS, Google Cloud, Azure, or your own servers.
The same developer experience, without the runtime limits, for a fraction of the bill.
Docs · Deploy · Migrate · Bindings · Examples · Discord
OpenOrange runs your existing Cloudflare Workers project on AWS, Google Cloud, Azure or your own servers, with no changes to your code. It's built with four goals:
- Zero refactoring, zero-downtime migration: your Workers and Durable Objects run as they are, and your data moves off Cloudflare while your app keeps serving.
- The same developer experience:
wrangler devbecomesorange dev, and everything underneath is open source and self-hostable. - Simpler bills: you pay for the machines you run on, not Cloudflare's metering or an enterprise contract. Compute is 4.8× cheaper and storage 8.7× cheaper.
- Built for scale: storage is backed by S3, so scaling out is a matter of adding machines.
You need a Worker project with a wrangler.jsonc, wrangler.json, or wrangler.toml (or use examples/hello-durable-object), Node.js 22 or later, and pnpm. Deploying also needs Docker.
Paste this into your coding agent (Claude Code, Codex, Cursor, …) from your Worker project:
First, add the Rivet MCP (https://mcp.rivet.dev/mcp) to this agent, and ask me to approve the Rivet sign-in. Then run this project's Cloudflare Worker on Rivet with OpenOrange: ask me where it should run (on my machine, on a Rivet cluster, or on my own Rivet Engine), read https://github.com/rivet-dev/open-orange/blob/main/README.md and follow its quickstart. Do not change my app code.
Install the orange CLI globally, then run it in your Worker project. Your code and your Wrangler configuration do not change.
pnpm add -g open-orangeYour Worker answers on http://localhost:8787. Each Durable Object runs as a Rivet Actor with its own SQLite database, kept in .open-orange/.
$ orange dev
Binding Resource Runs on
env.COUNTER Durable Object Rivet Actor · Counter
● Ready in 4.6s
Local http://127.0.0.1:8787orange deploy builds an image of your Worker and rolls it out to a Rivet cluster, then prints its public URL.
$ orange login
$ orange link --cluster <cluster-name>
$ orange deploy
✓ Deployed my-worker
URL https://api.example.comSee the deploy guide, or self-host it.
orange migrate moves your Durable Objects off Cloudflare with zero downtime.
See the migration guide for every step, rollback, and what cannot move.
Next to your database, in the cloud and region you choose.
- Rivet Cloud, fully managed: a dedicated cluster on AWS or Google Cloud, in the region you choose. Operated by Rivet.
- BYOC, your cloud and our ops: your AWS, Google Cloud or Azure account. Operated by Rivet over an outbound connection.
- Self-hosted, open source under Apache 2.0: any cloud, Hetzner, on-prem or air-gapped. Operated by you.
-
Build the Docker image.
orange deploy --dry-runwrites the build and calls no API. Push the image to a registry your servers can pull from.orange deploy --dry-run --outdir out docker build --platform linux/amd64 -f out/Dockerfile -t my-worker out/context
-
Run the Rivet control plane. Follow Rivet's guide for your platform: Kubernetes, AWS ECS, Docker Compose, Hetzner, Railway, Render, a VM.
-
Run your image as worker nodes. Point each container at the control plane with
RIVET_ENDPOINT, following Rivet's guide for your platform: Kubernetes, AWS ECS, Docker Compose, Hetzner, Railway, Render, a VM.
See self-hosting in the deploy guide.
Cloudflare's meters, priced on raw AWS: Graviton EC2 in us-east-1 with 40% headroom, and S3 in your account. See the cost model.
| Cloudflare | OpenOrange | ||
|---|---|---|---|
| Durable Object compute | $0.045 per GB-hour | $0.0094 per GB-hour | 4.8× cheaper |
| Durable Object storage | $0.20 per GB-month | $0.023 per GB-month | 8.7× cheaper |
| SQLite writes | $1.00 per million rows | about $0.18 per million | 5.7× cheaper |
128 MB is all the memory a Cloudflare Worker gets. OpenOrange runs your Workers and Durable Objects on machines you choose, so the limits are your hardware's.
| Limit | Cloudflare Workers Paid | OpenOrange |
|---|---|---|
| Memory per Worker or Durable Object | 128 MB | Up to your machine's memory. The Node.js heap is up to about 4 GB by default, and configurable. |
| CPU time per request | 30 s default, 5 min max | No cap |
| Cron, queue and alarm handlers | 15 min wall time | No cap |
| Open connections per request | 6 at once | OS limits |
| Storage per Durable Object | 10 GB | No cap |
| Worker bundle | 64 MiB | No cap |
| Node.js | nodejs_compat subset |
Stock Node.js |
- Your containers run your Workers and Durable Objects, in any cloud or on your own servers.
- Rivet places each Durable Object on a container and routes requests to it.
- S3 stores each object's SQLite data.
See Architecture.
| Cloudflare binding | Status | Runs on |
|---|---|---|
| Durable Objects | Partial | One Rivet Actor for each object, with its own SQLite database |
| KV, D1, Rate Limiting | Drop-in | Rivet Actors |
| Cache | Partial | One Rivet Actor for each cache name |
| Queues | Drop-in | One Rivet Actor for each queue |
| Workflows | Partial | Cloudflare's own Workflows engine, with one Rivet Actor for each instance |
| Cron Triggers | Drop-in | A Rivet Actor |
| Tail Workers | Partial | Rivet Durable Streams |
| R2 | Pluggable | A Rivet Actor, or Amazon S3, Google Cloud Storage, Cloudflare R2 or MinIO |
| Worker Loader | Partial | A separate process in an agentOS VM |
| Workers AI | Pluggable | OpenRouter, OpenAI, or any OpenAI-compatible endpoint |
| Send Email | Pluggable | Amazon SES, or any SMTP server |
| Browser Rendering | Pluggable | Browserbase, or any Chrome DevTools endpoint |
| Hyperdrive | Drop-in | Your Postgres or MySQL database, with a direct connection |
| Sandbox | Pluggable | E2B, Daytona, Freestyle, agentOS, or a local directory |
| Analytics Engine | Not supported | writeDataPoint() drops each data point |
| Vectorize, Images, Media, Stream, Pipelines, AI Search, mTLS certificates, VPC, and legacy blobs | Not supported | Calls throw |
Drop-in runs as on Cloudflare. Pluggable runs on a provider you configure. Partial runs with known differences, listed on each binding's page. See binding configuration for every Wrangler key and the variables each provider needs, and Compatibility for the test results.
Wait, wasn't Cloudflare supposed to be cheaper?
For small, spiky Workers, it often is: the free tier and per-request pricing are hard to beat. The meters add up once Durable Objects stay busy. The same GB-hours on Graviton EC2 cost about a fifth as much, and writes cost a fraction of that.
Is OpenOrange a fork of Cloudflare?
No. OpenOrange implements the Workers API on Node.js and maps each Cloudflare service onto Rivet. It uses Wrangler to read your configuration, and it reuses some MIT-licensed Cloudflare code, such as the Workflows engine. It does not run workerd.
Why not just run workerd directly?
workerd is Cloudflare's runtime, not its platform. KV, D1, R2, Queues, Workflows and the Cache API are bindings that call services you have to build, and Durable Objects keep their data on one machine with nothing to place, replicate or scale them. See OpenOrange vs workerd.
Do I need to learn Rivet?
No. Rivet is the control plane underneath. You use the orange CLI and your Wrangler configuration.
What does it cost?
OpenOrange is Apache 2.0 and free. Self-host Rivet and your cloud bill is the only bill. Rivet Cloud and BYOC pricing is at rivet.dev/pricing.
What happens to the data already in KV, Durable Objects and R2?
orange migrate moves Durable Objects while your app serves, with no downtime. D1 databases are interrupted for a few minutes while they copy. R2 is S3-compatible, so rclone or aws s3 sync moves buckets.
Does it run at the edge?
It runs wherever you deploy it, in as many regions as you want. Most backends talk to one database, and running next to it is faster than running at the edge.
Who maintains OpenOrange?
Rivet. OpenOrange is not affiliated with or endorsed by Cloudflare, Inc.
- OpenOrange vs Cloudflare Durable Objects: limits, latency, residency, and moving off.
- OpenOrange vs workerd: a runtime for one Worker, versus your whole app in production.
- OpenOrange vs celld: runtime limits, live migration, integrations, and support.
- OpenOrange vs Rivet: when to use Rivet directly, and how to combine them.
- OpenOrange vs Miniflare: a local simulator, versus production.
- Deploy guide: Rivet Cloud, self-hosting, variables, secrets, and rollback.
- Migration guide: how to cut over, how to roll back, and what cannot move.
- Bindings: one page for each binding and runtime API, with its known differences.
- Architecture: how OpenOrange runs your Worker on Rivet.
- Examples: Workers that you can copy, with no OpenOrange imports.
- Real projects: open-source Workers run through
orange dev, with what works and what does not. - Discord: questions and support.
