# rivet-dev/open-orange architecture

> Architecture diagram of the GitHub repository rivet-dev/open-orange, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/rivet-dev/open-orange
- Repository: https://github.com/rivet-dev/open-orange

## Overview

OpenOrange is a CLI and Node.js runtime for running Wrangler-configured Cloudflare Workers outside Cloudflare. Its primary workflow is to load a Worker project, run it locally through `orange dev`, then deploy it to Rivet; a separate migration command moves Durable Object data off Cloudflare. The graph includes runtime bindings and workflow execution as key internal layers, plus documented Rivet placement and S3-backed state. Source excerpts show configuration, serving, dispatch, and storage details; some deployment and migration implementation links are documented by the README rather than inspected source.

Main entry points: [`src/bin.ts`](https://github.com/rivet-dev/open-orange/blob/main/src/bin.ts) (Orange CLI), [`packages/runtime-node/src/modules/cloudflare-workers/durable-object.ts`](https://github.com/rivet-dev/open-orange/blob/main/packages/runtime-node/src/modules/cloudflare-workers/durable-object.ts) (Durable Objects), [`packages/runtime-node/src/session/server.ts`](https://github.com/rivet-dev/open-orange/blob/main/packages/runtime-node/src/session/server.ts) (Runtime session server), [`packages/runtime-node/src/bindings/service.ts`](https://github.com/rivet-dev/open-orange/blob/main/packages/runtime-node/src/bindings/service.ts) (Worker dispatch)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_cli["CLI and project setup"]
  node_cli["Orange CLI<br/>[bin.ts]"]
  node_config["Wrangler config<br/>[load-wrangler.ts]"]
  node_dev["Dev command<br/>[dev.ts]"]
end

subgraph group_serve["Local serving"]
  node_serve["Serve session<br/>[session.ts]"]
  node_routes["Worker routes<br/>[routes.ts]"]
  node_session["Runtime session server<br/>[server.ts]"]
end

subgraph group_runtime["Worker runtime"]
  node_worker["Worker dispatch<br/>[service.ts]"]
  node_http["Fetch compatibility<br/>[http.ts]"]
end

subgraph group_state["Bindings and state"]
  node_durable["Durable Objects<br/>[durable-object.ts]"]
  node_do_storage[("Object storage<br/>[storage.ts]")]
  node_alarms["Alarm scheduling<br/>[alarm-storage.ts]"]
  node_workflow["Workflow engine<br/>[engine.ts]"]
  node_workflow_host["Workflow host<br/>[engine-object.ts]"]
  node_other_bindings["Other bindings"]
end

subgraph group_ops["Deployment and migration"]
  node_deploy["Deploy command<br/>[deploy.ts]"]
  node_migrate["Migration command<br/>[migrate.ts]"]
end

node_developer(("Worker developer"))
node_rivet["Rivet platform"]
node_s3[("S3 storage")]
node_cloudflare["Cloudflare"]

node_developer -->|"runs commands"| node_cli
node_cli -->|"dispatches"| node_dev
node_cli -->|"dispatches"| node_deploy
node_cli -->|"dispatches"| node_migrate
node_dev -->|"loads config"| node_config
node_serve -->|"loads config"| node_config
node_serve -->|"starts session"| node_session
node_session -->|"dispatches requests"| node_worker
node_session -->|"routes RPC"| node_durable
node_worker -->|"uses HTTP"| node_http
node_durable -.->|"uses storage"| node_do_storage
node_workflow_host -->|"extends engine"| node_workflow
node_workflow_host -->|"uses object state"| node_durable
node_workflow -->|"uses durable APIs"| node_durable
node_worker -.->|"exposes bindings"| node_other_bindings
node_deploy -->|"rolls out image"| node_rivet
node_rivet -->|"stores object data"| node_s3
node_migrate -->|"moves data from"| node_cloudflare
node_migrate -->|"moves data to"| node_rivet

click node_cli "https://github.com/rivet-dev/open-orange/blob/main/src/bin.ts"
click node_config "https://github.com/rivet-dev/open-orange/blob/main/src/config/load-wrangler.ts"
click node_dev "https://github.com/rivet-dev/open-orange/blob/main/src/commands/dev.ts"
click node_serve "https://github.com/rivet-dev/open-orange/blob/main/src/serve/session.ts"
click node_routes "https://github.com/rivet-dev/open-orange/blob/main/src/serve/routes.ts"
click node_session "https://github.com/rivet-dev/open-orange/blob/main/packages/runtime-node/src/session/server.ts"
click node_worker "https://github.com/rivet-dev/open-orange/blob/main/packages/runtime-node/src/bindings/service.ts"
click node_http "https://github.com/rivet-dev/open-orange/blob/main/packages/runtime-node/src/globals/http.ts"
click node_durable "https://github.com/rivet-dev/open-orange/blob/main/packages/runtime-node/src/modules/cloudflare-workers/durable-object.ts"
click node_do_storage "https://github.com/rivet-dev/open-orange/blob/main/packages/runtime-node/src/bindings/durable-objects/storage.ts"
click node_alarms "https://github.com/rivet-dev/open-orange/blob/main/packages/runtime-node/src/bindings/durable-objects/alarm-storage.ts"
click node_workflow "https://github.com/rivet-dev/open-orange/blob/main/packages/runtime-node/src/bindings/workflows/engine/engine.ts"
click node_workflow_host "https://github.com/rivet-dev/open-orange/blob/main/packages/runtime-node/src/bindings/workflows/engine-object.ts"
click node_other_bindings "https://github.com/rivet-dev/open-orange/tree/main/packages/runtime-node/src/bindings"
click node_deploy "https://github.com/rivet-dev/open-orange/blob/main/src/commands/deploy.ts"
click node_migrate "https://github.com/rivet-dev/open-orange/blob/main/src/commands/migrate.ts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_cli,node_config,node_dev toneBlue
class node_serve,node_routes,node_session,node_s3 toneAmber
class node_worker,node_http toneMint
class node_durable,node_do_storage,node_alarms,node_workflow,node_workflow_host,node_other_bindings,node_developer toneRose
class node_deploy,node_migrate,node_rivet,node_cloudflare toneIndigo
```

## Components

### CLI and project setup

- [Orange CLI](https://github.com/rivet-dev/open-orange/blob/main/src/bin.ts): `src/bin.ts`
- [Wrangler config](https://github.com/rivet-dev/open-orange/blob/main/src/config/load-wrangler.ts): `src/config/load-wrangler.ts`
- [Dev command](https://github.com/rivet-dev/open-orange/blob/main/src/commands/dev.ts): `src/commands/dev.ts`

### Local serving

- [Serve session](https://github.com/rivet-dev/open-orange/blob/main/src/serve/session.ts): `src/serve/session.ts`
- [Worker routes](https://github.com/rivet-dev/open-orange/blob/main/src/serve/routes.ts): `src/serve/routes.ts`
- [Runtime session server](https://github.com/rivet-dev/open-orange/blob/main/packages/runtime-node/src/session/server.ts): `packages/runtime-node/src/session/server.ts`

### Worker runtime

- [Worker dispatch](https://github.com/rivet-dev/open-orange/blob/main/packages/runtime-node/src/bindings/service.ts): `packages/runtime-node/src/bindings/service.ts`
- [Fetch compatibility](https://github.com/rivet-dev/open-orange/blob/main/packages/runtime-node/src/globals/http.ts): `packages/runtime-node/src/globals/http.ts`

### Bindings and state

- [Durable Objects](https://github.com/rivet-dev/open-orange/blob/main/packages/runtime-node/src/modules/cloudflare-workers/durable-object.ts): `packages/runtime-node/src/modules/cloudflare-workers/durable-object.ts`
- [Object storage](https://github.com/rivet-dev/open-orange/blob/main/packages/runtime-node/src/bindings/durable-objects/storage.ts): `packages/runtime-node/src/bindings/durable-objects/storage.ts`
- [Alarm scheduling](https://github.com/rivet-dev/open-orange/blob/main/packages/runtime-node/src/bindings/durable-objects/alarm-storage.ts): `packages/runtime-node/src/bindings/durable-objects/alarm-storage.ts`
- [Workflow engine](https://github.com/rivet-dev/open-orange/blob/main/packages/runtime-node/src/bindings/workflows/engine/engine.ts): `packages/runtime-node/src/bindings/workflows/engine/engine.ts`
- [Workflow host](https://github.com/rivet-dev/open-orange/blob/main/packages/runtime-node/src/bindings/workflows/engine-object.ts): `packages/runtime-node/src/bindings/workflows/engine-object.ts`
- [Other bindings](https://github.com/rivet-dev/open-orange/tree/main/packages/runtime-node/src/bindings): `packages/runtime-node/src/bindings`

### Deployment and migration

- [Deploy command](https://github.com/rivet-dev/open-orange/blob/main/src/commands/deploy.ts): `src/commands/deploy.ts`
- [Migration command](https://github.com/rivet-dev/open-orange/blob/main/src/commands/migrate.ts): `src/commands/migrate.ts`

### Other components

- **Worker developer**
- **Rivet platform**
- **S3 storage**
- **Cloudflare**

## Connections

- Worker developer → Orange CLI: runs commands
- Orange CLI → Dev command: dispatches (evidence: `src/bin.ts`)
- Orange CLI → Deploy command: dispatches (evidence: `src/bin.ts`)
- Orange CLI → Migration command: dispatches (evidence: `src/bin.ts`)
- Dev command → Wrangler config: loads config (evidence: `src/config/load-wrangler.ts`)
- Serve session → Wrangler config: loads config (evidence: `src/serve/session.ts`)
- Serve session → Runtime session server: starts session (evidence: `src/serve/session.ts`)
- Runtime session server → Worker dispatch: dispatches requests (evidence: `packages/runtime-node/src/session/server.ts`)
- Runtime session server → Durable Objects: routes RPC (evidence: `packages/runtime-node/src/session/server.ts`)
- Worker dispatch → Fetch compatibility: uses HTTP (evidence: `packages/runtime-node/src/bindings/service.ts`)
- Durable Objects → Object storage: uses storage (evidence: `packages/runtime-node/src/bindings/durable-objects/storage.ts`)
- Workflow host → Workflow engine: extends engine (evidence: `packages/runtime-node/src/bindings/workflows/engine-object.ts`)
- Workflow host → Durable Objects: uses object state (evidence: `packages/runtime-node/src/bindings/workflows/engine-object.ts`)
- Workflow engine → Durable Objects: uses durable APIs (evidence: `packages/runtime-node/src/bindings/workflows/engine/engine.ts`)
- Worker dispatch → Other bindings: exposes bindings (evidence: `packages/runtime-node/src/bindings/service.ts`)
- Deploy command → Rivet platform: rolls out image
- Rivet platform → S3 storage: stores object data
- Migration command → Cloudflare: moves data from
- Migration command → Rivet platform: moves data to
