Skip to content
AI Primer
release

Rivet launches OpenOrange to run Cloudflare Workers on Node.js or Bun

Rivet's OpenOrange runs Cloudflare Workers on Node.js or Bun with Wrangler-compatible deployment and portable bindings. Rivet also provides live migration tooling and publishes workload cost comparisons against Cloudflare.

4 min read
Rivet launches OpenOrange to run Cloudflare Workers on Node.js or Bun
Rivet launches OpenOrange to run Cloudflare Workers on Node.js or Bun

TL;DR

  • Cloudflare Workers can run outside Cloudflare with existing code and Wrangler configuration: Rivet's launch announcement names AWS, Google Cloud, Hetzner, Node.js and Bun.
  • Live migration covers SQLite-backed Durable Objects: Rivet's migration walkthrough describes copying objects on first request, then backfilling the rest. D1 migration has downtime.
  • The headline 4.8× compute saving applies to Durable Objects in Rivet's AWS comparison. Its separate Workers CPU comparison shows 1.4×.

The CLI has an orange doctor command that inventories bindings before anything moves. Rivet's compatibility report is refreshingly specific: cos() and sqrt() fail because its SQLite build omits optional math functions.

Node.js containers

OpenOrange implements the Workers API on Node.js rather than running Cloudflare's workerd, according to the repository. Rivet's launch also names Bun; the documented quickstart uses Node.js.

Under the documented architecture, Workers ship as Docker containers, and each Durable Object becomes a Rivet Actor with its own SQLite database. WarpDrive stores durable data in S3 with an SSD layer in front.

The CLI preserves Wrangler configuration and bindings:

Portable bindings

Rivet lists 21 of 28 bindings as running on OpenOrange, with materially different compatibility levels:

  • Drop-in: KV, D1, Queues, Cron Triggers and Rate Limiting run on Rivet Actors. Hyperdrive becomes a direct database connection.
  • Pluggable: R2 can use an S3-compatible store; Workers AI can use an OpenAI-compatible endpoint; browser and sandbox bindings use configured providers.
  • Partial: Durable Objects, Workflows and the Cache API have known behavioral differences.
  • Missing behavior: Vectorize and AI Search calls throw. Analytics Engine accepts calls but drops every data point.

Rivet's recorded compatibility run reports that 38 of 50 real open-source projects ran unmodified.

Live Durable Object migration

Rivet's zero-downtime path moves SQLite-backed Durable Objects while the application keeps serving:

  1. Prepare: orange migrate prepare wraps the existing Worker with a migration endpoint. Cloudflare and OpenOrange share a secret token for the transfer.
  2. Cut over DNS: the first request to each object copies its data to OpenOrange. The old Cloudflare copy is marked as moved, blocking further writes there.
  3. Backfill: orange migrate backfill copies objects that have not received requests.
  4. Retire Cloudflare: shut down the old project after backfill reports zero failures.

Other data follows different rules in the migration guide:

  • D1: writes fail during the move, approximately three minutes per GB. All queries fail during Cloudflare's export, approximately 47 seconds per GB.
  • KV, R2 and other stateful bindings: orange migrate does not copy their data.

AWS cost comparison

Rivet's published cost model separates memory-priced Durable Object compute from Workers CPU:

| Resource | Cloudflare | OpenOrange on AWS | Rivet's claimed saving |
| --- | ---: | ---: | ---: |
| Durable Object compute, GB-hour | $0.045 | $0.0094 | 4.8× |
| Workers CPU, vCPU-hour | $0.072 | $0.051 | 1.4× |
| Durable Object SQLite storage, GB-month | $0.20 | $0.023 | 8.7× |
| KV writes, million | $5.00 | $0.18 | 28.4× |
| Workflow steps, million | $8.00 | $0.18 | 45.4× |

The calculation uses on-demand AWS Graviton in us-east-1, 40% headroom for autoscaling, and list prices dated October 8, 2026. Rivet also acknowledges in its README that Cloudflare can be cheaper for small, spiky Workers because of its free tier and per-request pricing.

Deployment options

Rivet published OpenOrange under Apache 2.0. The quickstart requires Node.js 22 or later and pnpm, with Docker additionally required for deployment.

  • Rivet Cloud: a dedicated, Rivet-operated cluster on AWS or Google Cloud in a selected region.
  • BYOC: infrastructure in the customer's AWS, Google Cloud or Azure account, operated by Rivet over an outbound connection.
  • Self-hosted: customer-operated infrastructure, including Hetzner, on-premises and air-gapped environments.

For self-hosting, orange deploy --dry-run --outdir deploy generates the Dockerfile and build context without calling an API. The resulting image connects to a separately deployed Rivet control plane.

WebSocket hibernation

OpenOrange emulates Durable Object WebSocket hibernation by discarding the object instance while preserving its socket, according to Rivet's compatibility report. The backing Rivet Actor remains running until the last socket closes, so an object with an open socket does not scale to zero.

Deployments close open sockets. Rivet's cluster tests recorded close codes 1012 and 1011; clients reconnected on their first attempt, and stored data survived, while the old object instance and its in-memory state did not.

Further reading

Discussion across the web

Where this story is being discussed, in original context.

On X· 3 threads
TL;DR1 post
Node.js containers1 post
Deployment options2 posts
Share on X