Skip to main content
The handler takes a standard Request and returns a standard Response, so it runs anywhere the Web platform does. CI bundles the server entry for a Worker and boots it under real workerd on every change.

What init writes

Run npx vendo init --framework custom. Detection lands here on its own when the host is neither Next.js nor Express. It generates vendo/server.ts: a lazy composition that takes Request in, returns Response, and reads the environment per call.
vendo/server.ts
Every Cloud seam is named here on purpose. A Worker has no ambient environment to read, so nothing is left for the key to fill on its own.

Route your runtime through it

Cloudflare Workers
Bun · Deno · Hono
The client side does not change. Mount <VendoProvider> with your base path and put <VendoOverlay /> inside it.

The three rules

1

Construct lazily.

Workers forbids async work in module scope, and environment variables only exist per request there. Keep the lazy-singleton shape above.
2

Pass every adapter.

The default model ladder and the local store engines need Node, so on a Worker they refuse with guidance instead of half working. The generated wiring names all of them, which is why it runs unchanged.
3

Set VENDO_BASE_URL.

Your deployed app’s full public URL, path prefix included. Present-credential forwarding fails closed without it.
On the edge the Cloud gateway is spelled out by hand — the stock Anthropic provider pointed at the console:
Call vendoModel() on a Worker and it throws that same sentence back at you.
@vendoai/vendo/sandbox/edge type-checks against vendored lib bytes, so install the exact typescript its EDGE_TYPESCRIPT_VERSION names. The peer range is wide and will not nudge you there.

Mounting the handler yourself

Skip the generated adapter and mount vendo.handler by hand, and your adapter has to do five things. vendo doctor judges an unknown-framework host by its wiring, never by another framework’s file layout. A missing server half reports E-WIRE-007, a missing client half E-WIRE-008.