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.
The services Vercel’s public client uses
| Service | What it does | Why it exists |
|---|---|---|
| Vercel Functions | Run the SDK’s combined workflow/step handler and supply an invocation deadline. | Managed compute for workflow decisions and external step work. |
| Managed Workflow API | Runs, 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 Queues | Admit messages, lease deliveries, retry and target a region and deployment. | Separate durable execution intent from any one Function request. |
| Vercel API | Resolve deployments, proxy external World calls and retrieve derived run keys. | Support CLI/dashboard clients and cross-deployment operations. |
| Vercel OIDC | Supply the Function identity used to authenticate direct API calls. | Authorize access to a shared managed backend across projects. |
The same jobs, different owners
| Job | Our World | Vercel |
|---|---|---|
| Ordered state | SQLite in hashed store objects, reached through bindings. | Managed Workflow API. Its database topology is not established by the adapter. |
| Delivery | Our SQLite-backed queue shards and alarms. | Managed Vercel Queues, via QueueClient. |
| Execution | Workers SDK handler, optionally a retained script through WFP. | A Function on the targeted deployment. |
| Replay engine | QuickJS default; native via a build-time shim. | Node default; QuickJS opt-in. |
| Snapshots | QuickJS snapshot parts in the run’s stream object. | A snapshot API transporting opaque bytes. Core’s capture policy is shared. |
| Lists | Outbox-fed index shards, eventually consistent. | Backend entity and analytics APIs; analytics ingestion can lag. |
| Release targeting | Recorded deployment → explicit EXECUTOR_ROUTES map. | Deployment targeting on queue publication. |
| Identity | Bindings 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
- Vercel: packages/world-vercel/src/index.ts
- Vercel: packages/world-vercel/src/storage.ts
- Vercel: packages/world-vercel/src/queue.ts
- Vercel: packages/world-vercel/src/utils.ts
- Vercel: packages/world-vercel/src/events-v4.ts
- Vercel Workflow run limits
Repository links may require access. Vercel links point to public source or published documentation. Logical API names do not establish backend internals.