Developer Platform

What can you build with Workers?

For modern internet-facing apps, Cloudflare gives developers a focused, integrated set of primitives that compose globally by default — full-stack apps, AI agents, APIs, and real-time systems, all on the same network that already handles your security and delivery.

AI agentsStateful agents with tools, memory, scheduling, and Workers AI
Full-stack appsFrameworks, APIs, storage, auth, and deploys on one platform
Real-time systemsDurable Objects, WebSockets, coordination, and live shared state
Focused builder community Fast feedback loop Builders inform the roadmap
Start the story
Why this matters now

AI is changing how many apps get built.

Code is cheaper. App count goes up. The bottleneck moves from writing software to running it safely, globally, and without infrastructure glue.

The platform job changed

More apps More agents More integrations More bursty work

Absorb the spike. Give every app platform services. Scale to zero when the work disappears.

Code costDownmore prototypes and internal tools
App countUpmore routes, APIs, workers, agents
Runtime shapeBurstyshort-lived task-specific runs
Platform jobAbsorb itcompute + bindings + observability

More apps only helps if the runtime keeps up. Which parts of your stack are paying a global tax because they were built for a single region?

Runtime evolution

Workers: from one-app-per-container to thousands-per-process.

Cloudflare's developer platform inherits the same global network architecture as its security and CDN edge. Workers run as V8 isolates across 330+ cities, within ~50 ms of ~95% of the Internet-connected population — no region selection required. Auth, routing, API validation, transforms, and cache logic run at the DDoS/WAF perimeter, before traffic reaches your origin.

Why it matters

  • Global by default: not a regional VM/container service. Code runs across Cloudflare's edge — close to users, not pinned to us-east-1.
  • No container cold-start tax: V8 isolates run inside existing runtime processes. One process hosts hundreds or thousands of isolated apps with minimal per-request overhead.
  • Request-based economics: Workers Standard includes 10 M requests/month + 30 M CPU ms/month; then $0.30/M requests and $0.02/M CPU ms. No idle-instance bill.
  • Security at the perimeter: auth, API validation, transforms, and cache decisions run where Cloudflare already enforces policy — not after traffic crosses the public internet to a regional origin.

Servers

One box, one app, operational ownership of OS, runtime, packages, and capacity.

↻
↻
↻
↻

VMs

Better isolation and scheduling, but each unit still carries a lot of runtime surface.

↻
↻
↻
↻
↻
↻
↻
↻
↻

Containers

Process-level isolation. Slow cold starts (500ms-10s). Heavy context switching overhead between customer workloads.

{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
{}
↻

Workers isolates

Lightweight execution contexts inside a shared V8 runtime. One process can run thousands of isolates with minimal per-request overhead.

Workers pricing →

Lightweight compute is the start, not the whole platform. The real leverage appears when storage, AI, media, and orchestration are native bindings.

One Worker, many bindings

Bindings are your platform building blocks.

Most clouds wire services together with SDKs, roles, networks, gateways, discovery, and certificates. Cloudflare bindings are capability handles delivered directly into the Worker runtime — no secrets in app code, no internal gateway, no extra network hop. Service Bindings split Workers without public APIs or duplicate request billing.

Worker
runtime
Workers · WfP · DOcompute and state
D1 · R2 · KVdata and files
Workers AI · Vectorizemodels and context
Stream · Images · Realtimemedia pipelines
WAF · CDN · DNSnetwork controls
Queues · Workflowsbackground work

How bindings work

Everything lives on the env object Declare a binding in your Worker configuration, access it via env.BINDING_NAME in your code. The runtime injects all bindings into env before your code executes.
D1 (SQLite)
await env.DB .prepare("SELECT * FROM users") .all();
R2 (Objects)
await env.BUCKET .put("file.pdf", data);
Workers AI
await env.AI.run( "@cf/meta/llama-3.1-8b", { messages: [...] } );
Vectorize
await env.VECTOR_INDEX .query(embedding, { topK: 5 } );
Service Binding
await env.AUTH_WORKER .fetch(request);
Queue
await env.QUEUE .send({ userId: 123 });

What a binding buys you

  • No auth plumbing: no tokens to store, rotate, or leak. The runtime knows which resources this Worker can reach before your code runs.
  • No internet hop: binding calls resolve inside Cloudflare's network — no public-internet request, no TLS handshake, no external DNS.
  • Runtime injection, not SDK imports: each binding's API object is injected into the isolate's memory before execution. No extra package to ship; bundle stays lean.
  • Service Bindings — internal calls without internal infrastructure: one Worker calls another via env.OTHER_WORKER.fetch(). On Workers Standard, that call doesn't add a request to your bill — CPU time across both Workers is aggregated into one invocation.
  • No duration billing: Workers Standard charges requests and CPU time, not wall-clock duration. Waiting on I/O doesn't cost CPU ms.

Available binding types

Data
D1R2KVHyperdrive
AI
Workers AIVectorizeAI Gateway
State & async
Durable ObjectsQueuesWorkflows
Platform
Service BindingsEmailStream+ And more

This is the mental model to land: Workers is not isolated from the platform. It is the place where the platform is composed.

Once the platform is available inside the Worker, the same model can host websites, APIs, tenant code, agents, storage-backed apps, and media workflows.

Full-stack web apps

Use the framework your team already knows.

Workers becomes the deployment target for modern web applications: server-rendered routes, APIs, static assets, and edge logic all living close to users.

Production web frameworks

View all supported frameworks ↗
Next.js Astro SvelteKit Nuxt React Router TanStack Start Angular Solid Start Analog Vite Vike Waku Vue Static sites Hono + And more
detectnpx wrangler setup --dry-run
# inspect adapter + config changes
configurenpx wrangler setup
# install adapter and generate config
deploynpx wrangler deploy
# deploy the framework app to Workers
scaffoldnpm create cloudflare@latest -- my-app
# start from a Worker or framework template

Use the language that fits

Workers is not only JavaScript. JavaScript and TypeScript run directly on V8. Python Workers are first-class, and systems languages can target WebAssembly when they need a portable runtime boundary.

Native V8 path

The most frictionless path for edge applications: no separate server process, just request handlers running in the Workers runtime.

JavaScriptTypeScript

Python Workers

A first-class Python experience on Workers. CPython runs via Pyodide inside V8 isolates, with deploy-time snapshotting to reduce startup cost and no separate precompile step.

PythonPyodideV8 isolatesSnapshotting
uvx --from workers-py pywrangler init
uv run pywrangler dev

Adapters + Wasm path

Framework adapters map server concepts onto the Workers Request/Response runtime. Languages that compile to Wasm can run inside the isolate; apps that need lower-level OS features can use Containers.

JS/TS→
Next.jsSvelteKitNuxt
Rust→
AxumZola
Static→
HugoJekyllPelican

Need a full server environment?

Cloudflare Containers run Docker images and full Linux environments alongside Workers. The Worker stays on the request path — the Container handles work that needs OS-level access, custom runtimes, heavier CPU, or filesystem.

DockerLinuxFilesystemCustom runtime

Worker stays public-facing. A Durable Object owns the container lifecycle. The Container is a Linux sidecar — never exposed directly to the internet.

Cloudflare Containers: request flow HTTP, WebSocket, and other traffic hits a Worker isolate — the JS app on the public request path. For work needing a container, the Worker routes via a Durable Object, a named lifecycle controller that starts, tracks, and proxies to the Container. The Container is an internal Linux sidecar, never exposed directly. INTERNET INTERNAL · NOT EXPOSED TO INTERNET HTTP · fetch() WebSocket MCP · Scheduled stream · upload Worker JS app · isolate fast path: handles most requests directly ↩ .idFromName(jobId) when container work needed Durable Object lifecycle controller start · track · proxy one per job / session proxy → :8080 Container $ full Linux · Docker image custom runtime · any language native binaries filesystem access ffmpeg · pandoc · python package managers · CLI tools CPU-heavy · ML inference started on demand — sleeps after inactivity one image, many instances
Worker — Request Path
  • All traffic enters here first
  • Auth · routing · bindings · fast JS
  • Most requests never touch a container
Durable Object — Controller
  • Named, stateful Worker
  • Owns lifecycle via idFromName()
  • One DO · zero or one container at a time
  • Also powers Agents — see below ↓
Container — Linux Sidecar
  • Internal only — not internet-exposed
  • Full Linux · Docker · any runtime
  • Starts on demand · scales to zero
Images Dockerfile via Wrangler, or pull from Docker Hub, ECR, or Google Artifact Registry.
Scale to zero Billed per CPU cycle. Containers stop after inactivity — no cost while sleeping.
Use cases FUSE mounts · WebSocket forwarding · ML inference · CLI tools · cron jobs · custom runtimes
Bindings & ops Access KV, D1, R2, Queues via hostname. SSH: wrangler containers ssh. Placement constraints available.

Ship the same way you build

Deployment lifecycle — scaffold, bind, run locally, preview in CI, deploy to production.

Deployment lifecycleAfter you scaffold, code, and add bindings, you are ready to deploy. Developers can iterate locally while CI/CD runs the real deploy commands for preview and production.
Scaffold

Create a Worker or framework app with C3 — Create Cloudflare CLI.

npm create cloudflare@latest
Bind

Add platform resources as bindings, then use them from env — for example env.DB, env.AI, or env.BUCKET.

bindings → env.DB / env.AI / env.BUCKET
Local

Run local development with Miniflare simulating Workers, KV, D1, and more without deploying to the edge. For frontend apps, tools like Vite give you a fast dev loop.

wrangler dev
vite dev
MR / PR

Your CI/CD runner — GitHub Actions, GitLab CI, or Bitbucket Pipelines — runs tests, then creates a preview review URL.

wrangler deploy --env preview
Prod

Merge to main; CI deploys with a scoped API token. Developers do not need production credentials.

CLOUDFLARE_API_TOKEN
wrangler deploy --env production
Infrastructure and deploy config work together.
Cloudflare Terraform Provider v5.17.0Manage Workers, KV, D1, R2, routes, and secrets as IaC/GitOps — every resource declarative and version-controlled.
wrangler.jsoncThe Worker project config: defines the entrypoint and connects resources as bindings, routes, variables, and environments.
CI/CDDeploy preview and production with [env.preview] and [env.production].

Hyperscalers are strong for model training and big AI infrastructure. The harder question for many teams is putting AI safely into production apps, globally, with the flexibility to switch providers.

Agents that scale

Built for Agents

Workers handle the stateless fetch layer. Durable Objects supply the actor model — unique ID, serialized execution queue, co-located SQLite. Agents SDK wraps that into a typed agent abstraction. Sandbox and Browser Run extend the tool surface without widening your Worker's trust boundary.

A Worker handles the event. A Durable Object gives the agent identity. Capabilities stay behind explicit boundaries.

Agent runtime architecture Events on the left — fetch HTTP, WebSocket, MCP, Scheduled — animate as packets into a central Worker isolate circle. The Worker routes via .idFromName() into a Durable Object ring containing the Agents SDK with SQLite state. Five capability spokes fan right: AI Gateway and Workers AI, Sandbox SDK, Browser Run, Dynamic Workers, and Workflows. EVENTS CAPABILITIES fetch() · HTTP WebSocket MCP Scheduled Worker isolate .idFromName(id) Durable Object Agents SDK SQLite state WebSocket · Alarms AI Gateway · Workers AI env.AI.run() Sandbox SDK sandbox.exec() Dynamic Workers per-tenant isolate Browser Run env.BROWSER.quickAction() Workflows durable steps
Runtime

One V8 isolate per invocation. Events arrive via fetch(), WebSocket, MCP, or schedule. Services injected as env.* — no shared state.

Identity + State

One Durable Object per session. idFromName() pins every call to one actor — private SQLite, serialized queue, hibernatable WebSocket.

Capabilities

AI Gateway · Workers AI · Sandbox SDK · Browser Run · Dynamic Workers — each behind an explicit dispatch boundary. A failing tool cannot crash the agent.

Agents SDK

Durable identity, persistent state, real-time connections, scheduled work

Agents SDK architecture Incoming events — WebSocket, HTTP request, and Schedule or Alarm — are routed to a Named Agent identified by idFromName. The Agent, built on a Durable Object, holds private SQLite state, syncs state to connected clients via the useAgent hook, and handles persisted scheduled callbacks. The agent has a unique durable identity but does not need to run continuously. env.AGENT.idFromName(id) WebSocket HTTP request Schedule / Alarm DURABLE OBJECT Named Agent .idFromName(sessionId) this.sql · setState() · schedule() extends Agent (Server) unique identity · not always-running Durable State this.sql · SQLite · survives eviction Connected Clients WebSocket · useAgent hook · state sync Scheduled Callbacks schedule() · alarm · persisted wake-up

Agents SDK wraps a Durable Object into a typed Agent class. Each instance has a stable identity via idFromName(), private embedded SQLite (this.sql), and this.setState() which persists state and broadcasts it to connected JS/React clients. Schedules are persisted and wake the agent for callbacks — no continuous process required. Durable state survives eviction; plain in-memory variables do not. Agents SDK docs →

Sandbox SDK

Isolated code execution — commands, files, processes, preview URLs

Sandbox SDK: Agent calls env.SANDBOX.run, receives stdout, file ops, background processes, preview URLs AGENT calls sandbox tool env.SANDBOX.run(code) Sandbox Container $ persistent interpreter Python · JS · TypeScript full Linux environment exec commands manage files background processes expose services stdout · stderr text, JSON, images, rich output file operations read, write, datasets, artefacts background process long-running · CI runner · REPL preview URL expose service · live view

Sandbox SDK gives agents an isolated Linux container for executing untrusted or generated code. Persistent interpreters keep state across calls — good for agents, CI runners, cloud REPLs, and data analysis pipelines.

Dynamic Workers

Parent Worker → env.LOADER.load() → isolated child Workers

env.LOADER.load() Parent Worker AI generates the code owns data + tools { } { } { } Child Worker runs aiCode in isolation RPC tools · explicit limits Child Worker runs aiCode in isolation no ambient env · CPU cap { } { } tool()

Dynamic by design: the Parent Worker loads isolated child Workers for AI-generated code and passes only the interfaces it chooses. Bindings pass handles, not code — the child receives a stub; calling a method delegates execution into the parent's isolate and returns the result. No ambient env access, no secrets shared.

Browser Run

Headless Chrome on Cloudflare's network — screenshots, PDFs, structured data

Browser Run: Worker calls env.BROWSER.quickAction, headless Chrome renders the page, outputs screenshot, PDF, markdown, JSON, and links WORKER env.BROWSER .quickAction( 'screenshot',{url}) cloudflare.com Browser Run Chromium · Cloudflare network screenshot · PDF pixel-perfect page capture markdown · text clean content extraction structured JSON scrape selectors · typed output links · snapshots Puppeteer · Playwright · CDP

Browser Run provides headless Chrome via a Worker binding. Use quickAction() for instant captures or full Puppeteer/Playwright/CDP/Stagehand sessions. Live View and session recording are available for human-in-the-loop workflows.

Workflows

The Agent handles the conversation. The Workflow handles the job.

Agent and Workflow collaboration diagram User sends a chat to the Agent on a Durable Object. The Agent replies immediately and triggers a background Workflow. The Workflow runs durable retryable steps: validate, call API, process data, await human approval, then complete. A dashed line shows the Workflow sending progress updates back to the Agent. USER chat reply Agent DURABLE OBJECT stays responsive WebSocket · real-time state the receptionist starts background job progress update Workflow DURABLE · RETRYABLE · STEP EXECUTION 1 Validate ↓ 2 Call external API ↺ ↓ 3 Process data ✦ ↓ 4 Await human approval ⏸ ↓ ✓ Complete the operations team

The Agent keeps the conversation responsive while Workflows runs the background job in durable steps. Completed step results are saved, failed steps can retry, and the job can pause for human approval before continuing. Progress updates flow back to the Agent, so the user stays informed without waiting for the whole job to finish.

Agents run your code. Workers for Platforms turns the runtime into a product — your customers deploy their own isolated Workers through your API.

Workers for Platforms

Built for Platforms

"When your product is other people's apps." Workers for Platforms lets you expose the Workers runtime as a programmable execution layer — your customers deploy isolated Workers through your API, you control the boundaries.

Builder App & vibe-coding builders Ship customer Workers from an AI-powered IDE — no infra for the builder to manage
Sites Website builders Every site gets its own isolated Worker for edge logic, redirects, and content transforms
Commerce E-commerce extensibility Merchant-written checkout hooks, discount rules, and custom storefront Workers
Plugins Plugin & automation platforms Customer automation scripts, webhook handlers, and integration Workers
You control bindings  ·  egress  ·  CPU limits  ·  access rules
Your customer controls their code  ·  JS / TS / Wasm  ·  nothing beyond what you grant

Three primitives, one dispatch model: your Dispatch Worker receives requests → calls env.DISPATCHER.get(workerName) to resolve a User Worker by name → proxies into an isolated V8 isolate containing only the code and bindings you granted.

Workers for Platforms dispatch namespace architecture An HTTP request flows left to right into the Dispatch Worker labelled Your Platform. The Dispatch Worker calls env.DISPATCHER.get(workerName) then userWorker.fetch(request) to route to one of three User Workers inside a Dispatch Namespace named production: client-a-worker, client-b-worker, and client-c-worker. Each User Worker has a green left bar and runs customer code in an isolated V8 isolate with only explicitly granted bindings. Orange packet dots animate along three bezier paths from the Dispatch Worker into each User Worker. REQUEST YOUR PLATFORM DISPATCH NAMESPACE: production HTTP request any route DISPATCH WORKER Your Platform env.DISPATCHER .get(workerName) .fetch(request) client-a-worker isolated V8 isolate · customer code · only granted bindings client-b-worker isolated V8 isolate · customer code · only granted bindings client-c-worker isolated V8 isolate · customer code · only granted bindings
Dispatch routing

How requests find the right User Worker — path · subdomain · KV lookup · custom metadata

  • Path: extract a tenant key from the URL — /api/:name → DISPATCHER.get(name)
  • Subdomain: parse the Host header — client-a.yourplatform.com → client-a-worker
  • KV lookup: resolve worker name dynamically — await KV.get(tenantId) → workerName
  • Custom metadata: attach plan, tier, or flags at deploy time — worker.userMetadata.plan === "pro"
Platform controls

What the platform controls for every User Worker — bindings · outbound worker · limits · observability

  • Explicit bindings: inject KV, D1, R2 scoped per tenant — customer code sees only what you grant
  • Outbound Worker: all fetch() calls from User Workers pass through your Outbound Worker — enforce allowlists or block egress entirely
  • Custom limits: cap CPU time and subrequests per User Worker — one noisy tenant cannot degrade others in the Dispatch Namespace
  • Observability: executions tagged to your Dispatch Worker — route traces and logs through your own pipeline
How it works

How dispatch works in three steps

  1. 1
    Bind the Dispatch Namespace Declare it in wrangler.jsonc — the runtime injects it as env.DISPATCHER, a typed handle to every User Worker in your namespace. { "dispatch_namespaces": [ { "binding": "DISPATCHER", "namespace": "my-platform" } ] }
  2. 2
    Choose the User Worker name Derive workerName from the request — URL path, hostname, a KV lookup, or metadata attached to the worker at deploy time.
  3. 3
    Forward the request Resolve the named User Worker and proxy the request into its isolated V8 isolate. It receives only the bindings your platform granted it. const userWorker = env.DISPATCHER.get(workerName); return userWorker.fetch(request);

User Workers are deployed programmatically via the Cloudflare API — no Wrangler required on the customer side.

Every Worker — yours or your customers' — needs data. The platform exposes storage as bindings: pick the shape that fits the access pattern.

Storage

Pick the storage shape that fits the workload.

Different access patterns deserve different storage. The platform exposes each primitive as a Worker binding, so the same code path can read from key/value, SQL, objects, an existing relational database, or strongly consistent per-key state. Declare the binding once and use it directly from env — No API keys in code, no secret handling, no manual connection plumbing. The runtime gives your Worker the right pre-authenticated object before the request runs.

Key/valueKVGlobally replicated key/value reads close to users. Great for config, feature flags, sessions, and cached data that needs low-latency access everywhere.env.KV.get(key)
SQLD1Serverless SQLite with SQL, transactions, migrations, backups, and read replicas. Relational data without provisioning or operating a database server.env.DB.prepare(sql)
ObjectsR2 S3-compatible object storage with no R2 egress charges. Media, backups, datasets, build artifacts. env.BUCKET.put(key, body) Deep dive →
Vector DBVectorizeVector indexes for embeddings and semantic search. Retrieval, recommendations, AI context.env.VECTOR_INDEX.query(embedding)
Bring your DBHyperdriveMake your existing database feel edge-native. Reuse warm Postgres/MySQL connections and cache queries — no migration required. Keep the database, gain edge speed.env.HYPERDRIVE.connectionString
Per-key stateDurable ObjectsA simple mental model for global coordination: one named object, serialized state, no clusters to run.env.ROOMS.get(id)

Not every workload starts as a full-stack app. Some begin as one route, one API, or one integration point.

APIs and backends

Start tiny. Add structure when the API earns it.

Workers can be a single request handler, a structured API, or a backend that sits in front of other services. You choose how much framework you need.

Grow with momentum

The point is optional structure: start with the smallest Worker that solves the job, then add routing, middleware, or language ecosystems only when the API earns it.

1
One routeStart with a plain Worker: fetch(request). Great for webhooks, auth checks, redirects, and small APIs.
2
Many routesAdd Hono when paths, middleware, validation, and shared API structure become useful.
3
Ecosystem fitUse Python/FastAPI-style patterns where that ecosystem fits the workload or team.
HTTP APIsAuth, routing, middleware, webhooks, and request normalization at the edge.
BackendsRead and write to storage bindings without exposing API tokens.
IntegrationQueue slow work, call services, or front existing origins with Worker logic.

Put it together — compute, AI, storage, media, network, orchestration. This is what changes when "serverless" becomes "platform".

The bigger picture

Workers is not just a serverless function. It is the platform.

Compute is the start, not the product. The product is what you can compose around it — inference next to data, retrieval next to context, state next to coordination, the CDN and WAF already in the request path. That is the platform Workers ships.

And there's more

  • Stream: Upload once; Cloudflare handles encoding, storage, and global delivery for live and on-demand video.
  • Images: Transform images at request time — resize, crop, optimize, and serve the right format from the edge.
  • Pipelines: ETL for raw event streams — turn them into clean analytics data in R2, without running Kafka, Flink, or custom ingestion workers.
  • AI Search: Add search that understands meaning, not just keywords, with embeddings, vector similarity, and hybrid ranking.
  • Queues: Absorb traffic spikes, decouple slow work, and process background jobs reliably behind your Worker.
The foundation

Cloudflare global network sits in front of every Worker

CDN · DDoS · WAF · Bot management · Smart Routing · Tiered Cache · Zero Trust · Access & more

Request path through Cloudflare global network to Worker An incoming request enters Cloudflare's global network, which applies CDN across 330-plus cities, DDoS protection, WAF with OWASP rules, Bot management, Smart Routing via Argo, Tiered Cache, and Zero Trust Access controls — and more — before the request reaches the Worker. Incoming request CLOUDFLARE GLOBAL NETWORK CDN · 330+ cities DDoS protection WAF · OWASP rules Bot management Smart Routing · Argo Tiered Cache Zero Trust · Access + more Worker isolate

Every request reaches your Worker through Cloudflare's network first — global delivery, security, routing, caching, and access controls already in the path.

7+ million developers building on the Cloudflare Developer Platform
Developer platform adoption growth Exponential growth chart from Workers launch in 2017 to over 7 million developers by 2025. Milestones: 1M by 2020, 3M by 2022, 5.5M by 2023, 7M plus by 2025. 0 2M 5M 7M+ Launch 1M+ 3M+ 5.5M 7M+ 2017 2020 2022 2023 2026
330+cities worldwide
500K+companies on the platform
2017when Workers first shipped

Focused builder community · Close product feedback loop · Faster collaborative adoption

Where Cloudflare fits

Hyperscalers are broad. Cloudflare is focused on global, secure, edge-native apps.

Many cloud platforms
Separate security / runtime layers
Training-first AI stacks
Regional by default
Many SDKs and configs
Broad ecosystem, indirect feedback loop
Cloudflare
Security + runtime, one layer
Production AI path — global, provider-flexible
Global by default — 330+ cities
Primitives via bindings, not SDKs
Builder feedback → roadmap
Cost & scalability

Scale up and down to zero.

Pay nothing when idle. No provisioned VMs or containers — billing starts when requests arrive, stops when they don't.

Performance

Deploy from region: Earth.

Deploy once, run in 330+ cities. Within 50 ms of ~95% of internet users. Smart Placement keeps compute next to data.

Developer experience

All the products you need.

Inference, state, storage, queues, observability — all as bindings. No infrastructure to provision. Just develop.

Inference, state, storage, media, queues, deployment, observability —

all the products you need·without provisioning any infrastructure.

So developers can focus on what they enjoy most: develop!

See it live

The build patterns become real demos.

Note: these demos need to be run at together and on RNobre Cloudflare account.

The categories above explain what you can build. These demos show the same platform primitives in motion: media, agents, retrieval, queues, AI, and multi-cloud ingress.

Cloudflare OS · Primitive Explorer

An open-source AI-native workspace, decomposed into the Developer Platform primitives underneath: model choice, agents, durable state, governed tools, isolated execution, and AI observability.

Cloudflare OSWorkers AIAgents SDKDynamic WorkersAI Gateway

Stream · Access Control

Three videos, three postures: public, origin-restricted, signed-URL gated. Signed video uses the Stream binding to mint short-lived JWTs server-side.

StreamWorkers bindingJWT

AI Agents · Zero Trust

One Agent, one MCP Server Portal, three MCP servers behind Access. Tools discovered at runtime; every call crosses a real Zero-Trust boundary. Workers AI generates images; D1 / R2 / KV store results.

Agents SDKMCP PortalAccessAI Gateway

Agent Council · Durable debate

Four persistent Agents challenge a decision from distinct perspectives, then a rotating proposer synthesizes the trade-offs for a vote. Durable Objects coordinate each council while AI Gateway routes model calls and D1 preserves the transcript.

Agents SDKDurable ObjectsAI GatewayD1

Agent Guardrails · governed execution

An Orchestrator delegates to Worker agents with separate Workspaces, read-only R2 policy data, fetch-tool allowlists, and Workers AI through AI Gateway. The Audit trail shows what the agent can touch — and where the Guardrail stops it.

Durable ObjectsWorkspacesR2AI Gateway
View slides

RAG on the edge

Docs into R2 → Queue → Workflow → Workers AI embeds → vectors in Vectorize. At chat time, query vector + top matches stitched into the LLM prompt. Six bindings, one Worker.

Workers AIVectorizeR2QueuesWorkflows
View slides

Edge ingress · multi-cloud

Cloudflare edge validates and normalises events, pushes clean payloads into a Queue. A GCP Cloud Run backend pulls via HTTP and acks. Bot mitigation, queueing, and AI visibility in one path via AI Gateway.

QueuesAI GatewayWorkersMulti-cloud

Workflows · durable execution

A 9-step space mission: SWAPI fetch → AI analysis → AI risk assessment → human-in-the-loop pause → AI report → KV archive. Arm a mid-flight "bomb" to fail a step — previous outputs stay preserved, retry recovers without re-running the AI calls.

WorkflowsWorkers AIKVstep.waitForEvent

Containers · custom runtimes

Interactive tutorial showing how Containers extend Workers with custom runtimes. Live ISS tracker with 3D globe, lifecycle management, and scaling models (singleton vs load-balanced). Built on Durable Objects — each container is a DO with location affinity and state.

ContainersDurable ObjectsNode.jsLifecycle