Cloudflare, Inc.
The company behind the Cloudflare proxy, the Cloudflare One Zero Trust products and the Workers developer platform, all of which run on one global network and connect to each other through Worker bindings.
What it is
Cloudflare runs one global anycast network and sells three kinds of things on top of it. The first is the reverse proxy in front of websites: DNS, caching, DDoS protection and the WAF, described on the Cloudflare page. The second is Cloudflare One, its Secure Access Service Edge (SASE) platform: Access puts an identity check in front of internal apps, Gateway filters the traffic employees’ devices send through the Cloudflare One Client (formerly WARP), and Tunnel connects private networks without a public IP. The third is the Developer Platform: Workers for code, plus storage, queues, AI inference and analytics. Workers run on thousands of machines in hundreds of locations, each machine runs the Workers runtime, and a request that reaches any Cloudflare data center can invoke a Worker right there.
One idea ties the Developer Platform together: a Worker reaches every other service through a binding. Its env object holds live objects, each attached at deploy time to one resource. env.DB is a D1 database, env.UPLOADS an R2 bucket and env.CARTS a Durable Object namespace, and the code calls methods on them, with no URL, client setup or API key. KV, Queues, Workflows, Vectorize, Workers AI, Hyperdrive and other Workers all work the same way. So one wrangler.jsonc file lists everything a Worker can touch, and the platform knows which Worker uses which resource.
“Region: Earth” describes the compute, not the data. By default a Worker runs in the data center that received the request. Workers KV stores data in a few central data centers and caches it where it is read. A D1 database has a primary copy created near wherever you created it, a Durable Object lives in one data center, and a Postgres or MySQL database you already run stays in its cloud region, reached through Hyperdrive. Most of the design work on this platform is choosing which piece holds which data, and where the Worker should run relative to it.
Its products in this catalog
Compute
Networking
Cap’n ProtoOpen sourceA binary format laid out like an in-memory struct, so reading needs no parse step, plus an RPC system built on object references and promise pipelining.Messaging
ArroyoOpen sourceA stream processing engine in Rust: you write the pipeline as SQL, and it keeps windows and joins running with checkpointed state.Databases
Analytics
Security
In depth
How a request moves through it#
One Worker with six bindings. Every box inside the dashed area is a Cloudflare product reached from the same code through env; only the database on the right lives outside Cloudflare.
Which product does which job#
The Developer Platform and the network products most applications touch, by the job they do. Names are current as of October 2026: Browser Rendering became Browser Run in April 2026, and on 1 October 2026 Cloudflare Pipelines, R2 Data Catalog and R2 SQL became Basin Pipelines, Basin Catalog and Basin SQL.
| Job | Cloudflare product | Generic idea | Reach it through |
|---|---|---|---|
| Run code | Workers | Serverless functions, in V8 isolates rather than containers | A route or custom domain runs its fetch() handler; other Workers call it through a service binding |
| Key-value | Workers KV | Eventually consistent key-value store, cached where it is read | kv_namespaces binding |
| SQL | D1 | Managed database with SQLite’s SQL semantics | d1_databases binding, or an HTTP API |
| Objects and files | R2 | Object storage with no egress fees | r2_buckets binding, or the S3 API |
| Coordination and state | Durable Objects | One addressable object per ID, with its own SQLite storage | durable_objects binding, which returns a stub to call |
| Background work | Queues | Message queue with at-least-once delivery and batching | queues.producers binding to send; a queue() handler to consume |
| Event streams | Cloudflare K2 | Event stream: a log on R2 that each subscription reads at its own pace (public beta) | k2 binding to produce; subscriptions pull batches over HTTP |
| Long-running jobs | Workflows | Durable execution: steps that retry and keep their results | workflows binding |
| Containers | Containers | Container images started on demand | Each container is linked to a Durable Object class that starts and routes to it |
| Vector search | Vectorize | Vector database for embeddings | vectorize binding |
| AI inference | Workers AI | Serverless GPU inference on open models | ai binding, or the REST API |
| Analytics | Workers Analytics Engine | High-cardinality metrics written from code, queried with SQL | analytics_engine_datasets binding to write; SQL API to read |
| Lakehouse | Basin Pipelines, Basin Catalog, Basin SQL | Streaming ingestion, a managed Apache Iceberg catalog on R2, and a distributed SQL engine | Pipelines: a Worker binding or HTTP endpoint. Catalog: the Iceberg REST API. SQL: Wrangler or the API |
| Existing database | Hyperdrive | Connection pooling and read-query caching for Postgres and MySQL | hyperdrive binding, which hands your driver a connection string |
| Private origins | Cloudflare Tunnel, Workers VPC | Outbound-only connector, so the origin needs no public IP | cloudflared on the server; from a Worker, a VPC Service binding over the tunnel |
| Access control | Cloudflare Access | Identity-aware proxy (Zero Trust) | A policy on the hostname; the origin checks the signed Cf-Access-Jwt-Assertion header |
| Load balancing | Cloudflare Load Balancing | Global load balancer across endpoints | An add-on on the proxied hostname |
| Local development | Wrangler, Miniflare, workerd | CLI, local simulator, open-source runtime | wrangler dev runs Miniflare on workerd with local copies of bindings, or remote bindings to real ones |
- Binding keys are those in Wrangler’s configuration reference. Some resources can be created for you: when a KV, R2, D1 or Queues binding has no ID, Wrangler provisions the resource on deploy.
Bindings: one way in#
A binding is a name on the Worker’s env object that points at one resource, declared in the Wrangler file and attached when the Worker is deployed. Cloudflare’s docs call it “a permission and an API in one piece”: declaring an R2 binding is what grants the Worker the right to read and write that bucket, and env.MY_BUCKET.put(key, body) is how it does so. The underlying credential never reaches the Worker’s code. Every Worker starts with no access and gets exactly the bindings it declares.
Cloudflare’s Kenton Varda explained the choice in an April 2024 post. Compared with a hostname plus an API key in an environment variable, a binding removes the key, so there is nothing for a stray log line to leak. It closes server-side request forgery: no URL an attacker supplies can reach an internal service, because the only way in is the binding. And it removes the second half of the usual two-step setup, pointing the service at a resource and then granting the resource to the service in an ACL, since declaring the binding does both. Because the platform sees every binding, it can answer which Workers use a given resource. Varda calls bindings “very much inspired by capability-based security”, but not yet a complete capability system, since a Worker can’t hand a binding to another Worker.
Bindings also make the same code run against different resources. Wrangler environments bind the same names to staging namespaces and databases (bindings are not inherited between environments, so each one lists its own), and wrangler dev runs the Worker locally in Miniflare on workerd, the same runtime used in production, with locally simulated KV, R2, D1, Queues and Durable Objects. Remote bindings point a local Worker at the real resources instead. One catch from the docs: when a deploy changes only bindings, Cloudflare may keep running isolates that already exist, so a client built from env and cached in global scope can outlive the value it was built from. Build such clients per request.
Where code runs, and where data lives#
Calls between Workers cost almost nothing: by default both Workers of a service binding run on the same thread of the same server. Calls to data are different, because the data has a location. Cloudflare’s own example is a user in Sydney whose Worker makes several round trips to a database in Frankfurt; each trip crosses the planet. The 2023 Smart Placement launch post measured a Worker making three round trips to a Frankfurt database from Sydney and found it 4 to 8 times faster once the Worker ran near the database instead of near the user.
There are three ways to move the Worker. Smart Placement ("mode": "smart", still beta) measures request duration in different locations and forwards requests to one that is significantly faster; it needs steady traffic from several locations, can take 15 minutes to decide, leaves 1% of requests unplaced as a baseline, and only affects fetch handlers, not RPC methods. Placement Hints name the target directly: a cloud region such as "aws:us-east-1", or, experimentally, a host or hostname that Cloudflare probes. The docs say this can cut each query from 20 to 30 milliseconds to 1 to 3. The third way is to leave the Worker near the user and put Hyperdrive in front of the database, which keeps pools of open database connections across Cloudflare’s network and caches read queries; its launch post counts up to seven round trips just to open a Postgres connection without it.
Cloudflare’s own stores have the same question. A D1 primary is created near wherever the create request came from, and queries go to it unless you use the Sessions API with read replicas. A Durable Object is created near its first caller (or where a location hint says) and, per the docs, does not currently move afterwards. So a design usually puts per-user or per-room state in Durable Objects near those users, shared reference data in KV, and the system of record wherever it already lives, with the Worker placed next to whichever of those it talks to most.
One Worker, six bindings#
A wrangler.jsonc in the format of the current configuration reference. Each block becomes one property of env; the comments show the call the code makes. With a compatibility date of 2026-08-04 or later, the Node.js compatibility that database drivers need is on by default.
{
"$schema": "./node_modules/wrangler/config-schema.json",
"name": "shop-api",
"main": "src/index.ts",
"compatibility_date": "2026-10-12",
// run near the Postgres primary instead of near each user
"placement": { "region": "aws:us-east-1" },
// env.CONFIG.get("flags")
"kv_namespaces": [{ "binding": "CONFIG", "id": "<KV_NAMESPACE_ID>" }],
// env.DB.prepare("SELECT ...").bind(id).first()
"d1_databases": [
{ "binding": "DB", "database_name": "shop", "database_id": "<D1_DATABASE_ID>" }
],
// env.UPLOADS.put(key, request.body)
"r2_buckets": [{ "binding": "UPLOADS", "bucket_name": "shop-uploads" }],
// env.CARTS.getByName(userId) returns a stub to call
"durable_objects": {
"bindings": [{ "name": "CARTS", "class_name": "Cart" }]
},
"exports": {
"Cart": { "type": "durable-object", "storage": "sqlite" }
},
// env.EMAILS.send({ orderId }); this Worker also consumes the queue
"queues": {
"producers": [{ "binding": "EMAILS", "queue": "order-emails" }],
"consumers": [
{ "queue": "order-emails", "max_batch_size": 10, "dead_letter_queue": "order-emails-dlq" }
]
},
// new pg.Client({ connectionString: env.PG.connectionString })
"hyperdrive": [{ "binding": "PG", "id": "<HYPERDRIVE_CONFIG_ID>" }]
}Other pieces that fit in#
Products without a page of their own here that often sit next to the ones above.
WAF
all plansChecks incoming web and API requests against rulesets written in Cloudflare’s Rules language (IP, path, headers, body) before they reach a Worker or an origin.
Turnstile
CAPTCHA alternativeEmbeds in a page and runs small non-interactive JavaScript challenges, such as proof-of-work and proof-of-space, to tell people from bots without a puzzle. It works on any site, even one not proxied through Cloudflare.
Images
bindingResizes, optimizes and transforms images at the edge so you store one original instead of a copy per device. A Worker can call it through an images binding.
Stream
videoUploads, stores, encodes and delivers live and on-demand video through one API, as H.264 adaptive-bitrate streams from 360p to 1080p. Workers can reach it through a Stream binding.
Email Service
sending in betaEmail Routing forwards mail sent to your domain to mailboxes or to a Worker that processes it; Email Sending (beta, Workers Paid) sends transactional mail. It requires Cloudflare DNS, and entered public beta in April 2026.
Realtime
WebRTCRealtimeKit adds audio and video calls with prebuilt UI and SDKs; the Realtime SFU API gives lower-level control over who publishes and receives audio, video and data.
Gateway and the Cloudflare One Client
Zero TrustGateway is Cloudflare’s Secure Web Gateway: URL filtering, malware scanning, data loss prevention and HTTPS inspection for outbound traffic. The Cloudflare One Client, formerly WARP, sends a device’s traffic to it over WireGuard or MASQUE, its DNS over HTTPS, and reports device posture for Access and Gateway policies.
Registrar
at costRegisters and renews domains at the registry’s price with no markup, with WHOIS redacted by default. A Registrar API entered beta in April 2026.
Workers for Platforms
multi-tenantRuns code written by your customers, or by AI, each in its own isolated Worker inside a dispatch namespace, with per-customer CPU and subrequest limits. Your platform can hand each customer Worker its own KV, D1 or R2 bindings.
Where it strains#
Bindings tie code to Cloudflare. env.DB.prepare() and env.CARTS.getByName() are Cloudflare APIs, so moving a Worker elsewhere means rewriting those calls. The exits are at the data layer: R2 speaks the S3 API, Basin Catalog is a standard Iceberg REST catalog, and Hyperdrive fronts a Postgres or MySQL database you own. The open-source workerd runtime can self-host Workers code, but its README warns that it is not a hardened sandbox for untrusted code.
Workers is not Node.js. Code runs in V8 isolates with 128 MB of memory each. The runtime implements a subset of Node APIs, some only partially, and for others Wrangler adds polyfills whose methods throw when called, so some npm packages that assume a full Node process won’t work. Containers exist for code that needs a full runtime, at container prices.
Each product bills by its own unit, which makes costs hard to compare across a design. Workers charge per request and per CPU millisecond, with no charge for wall-clock time; Durable Objects charge for requests and for wall-clock GB-seconds while active; KV per key read or written; D1 per row read and written; Queues per 64 KB operation, usually three per message; R2 for storage and two classes of operations, with no egress fees. Containers, unlike R2 and Queues, do charge for egress: $0.025 per GB in North America and Europe after 1 TB a month.
Where it came from2017–2026
In September 2017 Cloudflare was, in Kenton Varda’s words, “an HTTP cache that runs in 117 locations worldwide”, plus fixed features such as DNS, SSL, attack protection and load balancing. Fixed features could never cover every use case, so Cloudflare made the edge programmable with Workers: JavaScript on V8, written against the browser’s Service Worker API. Giving every customer a virtual machine or container in every location wasn’t workable, while V8 already ran mutually untrusted code safely in Chrome. Workers opened to everyone in March 2018.
Storage came one product at a time, each attached through a binding. Workers KV (September 2018) launched with a namespace “bound” to a variable in the Worker. Durable Objects (beta, September 2020) added strong consistency and a single place to coordinate clients, which eventually consistent KV couldn’t give. R2 (2021) brought S3-compatible object storage with zero egress fees, D1 (May 2022) a SQLite-based SQL database, and Queues (September 2022) messaging. In May 2023 Cloudflare acknowledged that running next to the user can be slower when the data is far away and launched Smart Placement, and in September added Workers AI, Vectorize, and Hyperdrive for databases that live outside Cloudflare.
Later products reused the same pieces. Workflows (open beta, October 2024) is durable execution built on Workers, and Containers (public beta, June 2025) are started and addressed through Durable Objects. In 2026 the pitch turned to AI agents: April’s Agents Week made Sandboxes generally available, renamed Browser Rendering to Browser Run and put Email Service into public beta. Birthday Week, marking the company’s 16th birthday from 28 September to 2 October, made the data platform generally available as Basin, announced K2 event streams on R2 and Workers KV Instant, and rebuilt Containers for agent sandboxes.
Why it’s built this way
- Isolates, not containers or virtual machines
- Cloudflare wanted every customer’s code in every location. Per-customer VMs or containers in 117 locations wouldn’t scale, while V8 isolates share one runtime process, start about a hundred times faster than a Node process and use an order of magnitude less memory.
- Web standard APIs
- The Service Worker API was already built to intercept and answer web requests, so anyone who had written a Service Worker could write a Worker, and the platform didn’t need its own request model.
- Bindings instead of URLs and keys
- Resources are attached as live objects at deploy time, so there are no credentials in code, no SSRF path to internal services, no separate ACL to keep in sync, and the same code can be deployed against test or production resources.
- “Region: Earth”, with placement as the exception
- Durable Objects were placed automatically so developers wouldn’t think in regions, and Containers deploy the same way. When the data sits in one cloud region, Smart Placement and Placement Hints move the Worker toward it instead of asking developers to pick regions for everything.
Timeline
- 2017
Workers announced on September 29, on a network of 117 locations
- 2018
Workers open to everyone in March; Workers KV launches in September
- 2020
Durable Objects enter closed beta in September
- 2021
R2 announced: S3-compatible object storage with no egress fees
- 2022
D1 announced in May; Queues private beta in September
- 2023
Smart Placement in May; Workers AI, Vectorize and Hyperdrive in September
- 2025
Containers public beta in June, controlled from Workers through Durable Objects
- 2026
Agents Week in April; Basin generally available and K2 announced on October 1
- Cloudflare blog: Introducing Cloudflare Workers (September 29, 2017)
- Cloudflare blog: Introducing Workers KV (September 28, 2018)
- Cloudflare blog: Workers Durable Objects Beta (September 28, 2020)
- Cloudflare blog: Announcing Cloudflare R2 Storage (September 28, 2021)
- Cloudflare blog: Announcing D1, our first SQL database (May 11, 2022)
- Cloudflare blog: Cloudflare Queues (September 27, 2022)
- Cloudflare blog: Smart Placement (May 16, 2023)
- Cloudflare blog: Workers AI (September 27, 2023)
- Cloudflare blog: Vectorize open beta (September 27, 2023)
- Cloudflare blog: Hyperdrive (September 28, 2023)
- Cloudflare blog: Why Workers environment variables contain live objects (April 1, 2024)
- Cloudflare blog: Workflows open beta (October 24, 2024)
- Cloudflare blog: Containers public beta (June 24, 2025)
- Cloudflare blog: Everything we launched during Agents Week 2026 (April 20, 2026)
- Cloudflare blog: Everything we launched during Birthday Week 2026 (October 5, 2026)
- Cloudflare blog: Introducing Cloudflare Basin (October 1, 2026)
- Cloudflare Docs: How Workers works (isolates)
Sources · facts checked 2026-10-12
- Cloudflare Docs: Bindings (env)
- Cloudflare Docs: How Workers works
- Cloudflare Docs: Wrangler configuration
- Cloudflare Docs: Placement (Smart Placement and Placement Hints)
- Cloudflare Docs: Service bindings
- Cloudflare Docs: Local development
- Cloudflare Docs: Node.js compatibility
- Cloudflare Docs: Workers limits
- Cloudflare Docs: Workers pricing (Workers, KV, Queues, D1, Durable Objects, R2, Containers)
- Cloudflare Docs: D1 data location
- Cloudflare Docs: D1 global read replication
- Cloudflare Docs: Durable Objects data location
- Cloudflare Docs: Durable Objects
- Cloudflare Docs: D1
- Cloudflare Docs: D1 Database API (prepare, bind, first)
- Cloudflare Docs: Durable Object namespace API (getByName)
- Cloudflare Docs: Queues JavaScript APIs (send)
- Cloudflare blog: Workers Durable Objects Beta (KV described as eventually consistent)
- Cloudflare Docs: Queues
- Cloudflare Docs: Hyperdrive
- Cloudflare Docs: Hyperdrive get started (Node.js compatibility by compatibility date)
- Cloudflare Docs: Workflows
- Cloudflare Docs: Containers
- Cloudflare Docs: Vectorize
- Cloudflare Docs: Workers AI
- Cloudflare Docs: Workers Analytics Engine
- Cloudflare Docs: Basin (formerly Cloudflare Data Platform)
- Cloudflare Docs: Basin Pipelines
- Cloudflare Docs: Basin Catalog
- Cloudflare Docs: Basin SQL
- Cloudflare Docs: Browser Run (formerly Browser Rendering)
- Cloudflare Docs: Cloudflare Tunnel
- Cloudflare Docs: Workers VPC
- Cloudflare Docs: Cloudflare One
- Cloudflare Docs: Access, validate JWTs
- Cloudflare Docs: Traffic policies (Secure Web Gateway)
- Cloudflare Docs: Cloudflare One Client (formerly WARP)
- Cloudflare Docs: Load Balancing
- Cloudflare Docs: Wrangler
- Cloudflare Docs: Miniflare
- cloudflare/workerd README
- Cloudflare Docs: Web Application Firewall
- Cloudflare Docs: Turnstile
- Cloudflare Docs: Images
- Cloudflare Docs: Stream
- Cloudflare Docs: Email Service
- Cloudflare Docs: Email Service, route emails
- Cloudflare Docs: Realtime
- Cloudflare Docs: Registrar
- Cloudflare Docs: Workers for Platforms
- Cloudflare blog: Why Workers environment variables contain live objects (April 1, 2024)
- Cloudflare blog: Smart Placement (May 16, 2023)
- Cloudflare blog: Hyperdrive (September 28, 2023)
- Cloudflare blog: Announcing Cloudflare R2 Storage (S3 API compatibility)
- Cloudflare blog: Everything we launched during Agents Week 2026
- Cloudflare blog: Everything we launched during Birthday Week 2026 (K2, Workers KV Instant)
- Cloudflare K2 docs: Consume