World / Cloudflare
GitHub

Comparison

Compared with Vercel

Two implementations of the same World contract. We can inspect Vercel’s public adapter, not the internals behind its managed APIs.

App / flow Function
Managed Workflow API
Vercel Queues
Target deployment’s Function

The services Vercel’s public client uses

ServiceWhat it doesWhy it exists
Vercel FunctionsRun the SDK’s combined workflow/step handler and supply an invocation deadline.Managed compute for workflow decisions and external step work.
Managed Workflow APIRuns, events, steps, hooks, byte streams, snapshots and analytics namespaces.Durable persistence and query APIs without the application owning shards. These namespaces do not prove separate physical services.
Vercel QueuesAdmit messages, lease deliveries, retry and target a region and deployment.Separate durable execution intent from any one Function request.
Vercel APIResolve deployments, proxy external World calls and retrieve derived run keys.Support CLI/dashboard clients and cross-deployment operations.
Vercel OIDCSupply the Function identity used to authenticate direct API calls.Authorize access to a shared managed backend across projects.

The same jobs, different owners

JobOur WorldVercel
Ordered stateSQLite in hashed store objects, reached through bindings.Managed Workflow API. Its database topology is not established by the adapter.
DeliveryOur SQLite-backed queue shards and alarms.Managed Vercel Queues, via QueueClient.
ExecutionWorkers SDK handler, optionally a retained script through WFP.A Function on the targeted deployment.
Replay engineQuickJS default; native via a build-time shim.Node default; QuickJS opt-in.
SnapshotsQuickJS snapshot parts in the run’s stream object.A snapshot API transporting opaque bytes. Core’s capture policy is shared.
ListsOutbox-fed index shards, eventually consistent.Backend entity and analytics APIs; analytics ingestion can lag.
Release targetingRecorded deployment → explicit EXECUTOR_ROUTES map.Deployment targeting on queue publication.
IdentityBindings and private dispatch internally; app owns public-route auth.OIDC or explicit tokens to the backend; platform-controlled queue delivery.

How their transport works

Vercel event frames carry length-prefixed CBOR metadata and opaque payload bytes. Single-event writes prefer an available per-run WebSocket channel. Missing channels, batch writes and GET/LIST calls use HTTP; the external API proxy is HTTP-only.

The direct backend path normally uses an explicit bearer token or a Vercel OIDC token. The proxy path requires a Vercel token plus project/team context. The queue’s queueAuthMode: skip relies on the platform-delivered message ID being retrieved and leased, not on trusting an arbitrary caller’s JSON.

Our components instead call bound objects and services. That removes an application-managed bearer-token layer between them, not all network or platform authorization work.

Where our design helps

Visible and account-owned

You can inspect the queue, state transitions, routing and limits. Your state and executors live in your Cloudflare account. There is no separate workflow backend API to provision.

Explicit scaling choices

Sharding distributes independent runs. Index writes leave the creation path. Separate lanes and request batching address measured contention and memory problems.

Measured beyond a published quota

A historical burst admitted 4,220 runs/s, above Vercel’s documented 1,000/s limit. This proves that sample, not a faster managed service at every workload.

Vercel manages more

It operates the queue and workflow backend, exposes analytics and handles deployment identity. You do not maintain our outboxes, epochs or executor route map.

Vercel accepts larger values

Its documented payload limit is 50 MB. Our serialized cap is 18 MiB; a random raw output of about 17.92 MiB passed at build 8cddcbd. Streams are the answer for large data here, not proof of payload parity.

No blanket winner

Different transport does not prove lower cost or better reliability. We have not measured Vercel throughput, tail latency, recovery or operational effort.

Read the Vercel limits with their runtime context

The published 10k-step and 25k-event limits apply to the default Node runtime. Vercel exempts QuickJS runs with snapshotting enabled from those two caps. Comparing our QuickJS run to those Node limits without that qualification would be misleading.

Vercel also supports QuickJS snapshots. Fast snapshot restoration is an SDK capability we integrate, not a feature unique to this World. Its adapter’s 64 MiB snapshot envelope limit is distinct from core’s 32 MiB plaintext capture limit.

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