Skip to content

Bindings (`env`)

env contains only names declared on the deployment. Version Metadata is a platform-injected read-only object: id, tag, timestamp.

export default {
async fetch(request: Request, env: Env): Promise<Response> {
const version = env.VERSION.id;
return env.AUTH.fetch(request);
},
} satisfies ExportedHandler<Env>;
import { bindings, defineConfig } from "cf/config";
export default defineConfig({
worker: {
name: "front",
entrypoint: "src/index.ts",
env: {
AUTH: bindings.worker({ worker: "auth-worker" }),
VERSION: bindings.versionMetadata(),
},
},
});

Service Bindings: default/named fetch and RPC. The target is a uniquely resolvable Worker name, an operator-configured extension slug, or a fixed private HTTP target in the same instance; deploy time freezes the target identity and policy revision. entrypoint is optional. Private HTTP targets expose fetch only. There is no new public Binding type.

Member signatures for KV / R2 / D1 / DO / Queue / Workflow / Assets / Images belong on those product pages. Config grammar: configuration · bindings.

Topic Cloudflare open-compute
env.BINDING types Yes — Bindings and Service bindings Yes
Version Metadata fields Yes — version metadata id, tag, timestamp
Service Bindings Cross-region placement / global service discovery Same-platform only; default/named fetch and RPC; target admission, deployment pins, capability lifetime, and recovery are local and fail closed
Dynamic Workers / Worker Loader Loader API Native load/get, modules, entrypoint/RPC, user tails, dynamic DO facets, and explicit/delegated limits; experimental controls remain unavailable
Workers for Platforms dispatcher Yes Not provided
mTLS / Rate Limit / Secrets Store / AI binding Yes Not provided

Declare worker_loaders: [{ binding: "LOADER" }] to expose the native WorkerLoader API as env.LOADER. The same get(id, callback) ID must describe immutable code; do not depend on cache hits or callback counts. Namespaces are isolated by account, Script and binding. Version rollback retains the namespace; deleting and recreating a Script gives it a new namespace. A Worker invocation permits 4 distinct children in flight, and a DO context permits 10; concurrent calls to the same child count once.

Explicit limits use the official cpuMs and subRequests fields; {} selects Standard defaults, and child, entrypoint, and delegated Loader ceilings compose by the strictest dimension. CPU, memory, startup, subrequest, and simultaneous outbound-connection limits are enforced by the pinned workerd fork. Nonempty streaming tails and two experimental-control members remain unavailable. Dynamic Python child cold boot is not qualified because local Pyodide bootstrap cannot reliably meet the official one-second startup CPU limit; JavaScript, Wasm, RPC, dynamic Durable Object facets, and limits are qualified. See behavior differences.

Structured-clone values and Service Bindings can be passed directly in load({ env }). Forward KV, D1, R2, and Queue bindings through the open-compute helper, which preserves the binding boundary instead of cloning the resource object:

import { loadWorker } from "open-compute:worker-loader";
const child = loadWorker(env.LOADER, {
...code,
env: { CACHE: env.CACHE, DB: env.DB, BUCKET: env.BUCKET, QUEUE: env.QUEUE },
});

For the certified 2026-09-08 date, the pinned Pyodide bundle is embedded in ocd, verified, and loaded from the instance’s private runtime cache. Other official child date/flag combinations retain workerd’s native version selection. Script deletion returns 409 while an executed Version retains generation background references; deletion can proceed after that generation ends. Automatic local collection of child logs is a platform feature, not Cloudflare’s default parent Workers Logs behavior.