World / Cloudflare
GitHub

Run it

Identity and deployments

Bindings authorize internal access. Your application protects public routes. Encryption and retained release routing solve separate problems.

Internal calls use capabilities

A Durable Object binding, service binding or private dispatch namespace grants access to a resource. Our internal calls do not carry application bearer tokens. This is not “no security”; authorization comes from which code holds which binding.

The executor flow route is not exposed by the example’s public router. queueAuthMode: skip assumes the internal delivery boundary. Do not publish an equivalent route that trusts arbitrary queue payloads.

The example’s run and hook endpoints are public examples. A hook token acts as a capability to resume that hook. Add your application’s authentication, authorization and abuse controls before using the example as a multi-tenant public service.

Encryption has a narrower scope than “all data”

An optional 32-byte base64 Worker secret enables per-run key derivation using HKDF-SHA256, with workflow-cloudflare|<runId> as context. Core encrypts serialized payloads using the resulting key material.

Operational metadata and raw byte streams remain readable. Do not assume R2 objects or list rows are application-encrypted just because run payload encryption is enabled. Protect access to bindings, buckets and secrets.

There is no supported key-rotation scheme or external derived-key service. Removing or replacing a secret can make old encrypted state unreadable. Keep the key material required by retained runs.

Keep the code that owns old history

Run records release A
Deploy release B
Route old deliveries to A
New runs select B

A recorded deployment ID identifies the executor a queued run should reach. With Workers for Platforms enabled, EXECUTOR_ROUTES maps each retained release to its script. Even the current deployment needs an explicit valid route.

The main World owns shared state. Executor releases use those same namespaces and buckets. That means retained code still calls current RPC methods, so method names and argument contracts must remain compatible.

Invocation handling is a special case: hook invocation executes on the current deployment, then wakes the run on its recorded deployment. Do not assume every operation goes straight to the old executor.

How Vercel’s identity differs

Vercel’s direct Workflow API uses explicit tokens or Function OIDC identity. External callers can use its authenticated API proxy with project/team context. Eligible same-deployment Functions derive a per-run key locally; other callers can retrieve a derived key through the Vercel API.

That is useful for managed project isolation and external tooling. Our binding-based access is simpler inside one configured deployment, but does not provide the same project identity or run-key API.

Sources and implementation

Repository links may require access. Vercel links point to public source or published documentation. Logical API names do not establish backend internals.

Browse topics or type to search

IntroductionA Workflow SDK v5 World built on Cloudflare Workers, Durable Objects and R2. Here is what runs where, why each part exists, and what the measurements actually show.Same SDK, different infrastructureA workflow is a log you can replay.Three jobs, kept separateA workflow is a log you can replay.Recorded results, not promisesA workflow is a log you can replay.Read the system in orderA workflow is a log you can replay.The architectureAn ordered store for each run, delivery capacity shared across shards, and execution kept off the queue objects.Where everything livesThe architectureOrder state, distribute executionThe architectureRouting without a global directoryThe architectureWhat the design buys, and costsThe architectureLife of a requestFollow the ordinary static-workflow start path, then the deliveries that turn the stored intent into completed work.Our World: accepting the runLife of a requestOur World: delivering and runningLife of a requestVercel: the corresponding pathLife of a requestWhat a response does and does not guaranteeLife of a requestEvery service, explainedWhat each component owns, why it exists, how it helps, and the limit it introduces. These are logical roles, not twelve separate deployed services.Router Worker and World clientEvery service, explainedRun-store shardsEvery service, explainedQueue shardsEvery service, explainedWorkflow runners and step runnersEvery service, explainedConsumer and retained executor WorkersEvery service, explainedIndex shardsEvery service, explainedHook token registriesEvery service, explainedRun streams and VM snapshotsEvery service, explainedR2 payloads and dead lettersEvery service, explainedAlarms and cron recoveryEvery service, explainedState and deliveryHow an event becomes durable work, why the outbox exists, and where transactions stop.The event is the durable recordState and deliveryWhy commit an outbox?State and deliveryHook claims cross transaction boundariesState and deliveryAt-least-once means side effects can repeatState and deliveryRetries, limits and recoveryState and deliveryExecution and replayWorkflow decisions execute inside a deterministic runtime. Step bodies do the I/O outside it. QuickJS and the native engine trade replay work for memory and compatibility.Workflow code is not step codeExecution and replayQuickJS is our defaultExecution and replayThe native engine uses a build-time shimExecution and replayWhat the replay numbers meanExecution and replayShards and placementSpread independent runs, preserve old routing, and keep state near execution where possible. More shards are capacity, not free speed.Time picks the epoch, hash picks the shardShards and placementA location hint is a hintShards and placementWhy creation throughput is highShards and placementMany runs scale better than one enormous runShards and placementPayloads and byte streamsUse values for control data and byte streams for bulk data. Offloading to R2 removes storage-message pressure, not every memory limit.A value still has to fit in memoryPayloads and byte streamsPass a handle, then move bytes incrementallyPayloads and byte streamsThe producer must outlive the step resultPayloads and byte streamsThe current multi-GiB reader problemPayloads and byte streamsCompared with VercelTwo implementations of the same World contract. We can inspect Vercel’s public adapter, not the internals behind its managed APIs.The services Vercel’s public client usesCompared with VercelThe same jobs, different ownersCompared with VercelHow their transport worksCompared with VercelWhere our design helpsCompared with VercelRead the Vercel limits with their runtime contextCompared with VercelMeasurements and limitsRecorded Workers results, the workload behind each number, and the failures that keep these from being unlimited-capacity claims.Latest regression checkMeasurements and limitsCreation is not completionMeasurements and limitsExecution resultsMeasurements and limitsLimits are not all the same kind of numberMeasurements and limitsKnown failure pointsMeasurements and limitsRun the probesMeasurements and limitsIdentity and deploymentsBindings authorize internal access. Your application protects public routes. Encryption and retained release routing solve separate problems.Internal calls use capabilitiesIdentity and deploymentsEncryption has a narrower scope than “all data”Identity and deploymentsKeep the code that owns old historyIdentity and deploymentsHow Vercel’s identity differsIdentity and deploymentsBuild, deploy and operateThe repository root is an example application. The reusable World lives in packages/world-cloudflare. Deploy the minimal mode first, then add retained executors if you need them.Start with the exampleBuild, deploy and operateKnow which config changes affect old runsBuild, deploy and operateDeploy state first, then the retained executorBuild, deploy and operateTest the adapter, the SDK and the deploymentBuild, deploy and operateOperational work still leftBuild, deploy and operate
Local search. Nothing sent to a server.Esc to close
Documentation