Skip to content
Prepline
LibraryCloud, Infrastructure & Data62 min readUpdated 2026-08-05

Adopt / don't-adopt analysis written for a learning platform; the evaluation framework generalizes.

Shipped today — August 5, 2026

Cloudflare OS

Cloudflare just open-sourced the AI workspace that runs its own company — agents, user-owned apps, and a capability-based security layer that finally makes human-in-the-loop asynchronous. Here is what it actually is, how it is built, and whether Coursera should run one.

8 modules· ~75 min read· Apache 2.0· Built for Mustafa Furniturewala, VP Engineering, Coursera

Aug 5
Open-sourced (Agents Week)
v2
Complete rewrite, early access
16
Gatekeeper packages shipped
Apache 2.0
License — fork it freely
Progress
0 / 8 complete
How to read this course

Modules 1–6 are the technology, sourced directly from the cloudflare/cloudflare-os repository, its docs/ directory, the write-gatekeeper agent skill, and the deployment starter repo. Module 7 is the one that matters for your day job — a real adopt/don't-adopt analysis for Coursera, including a correction to a common assumption about Coursera's infrastructure that changes the cost model. Module 8 places it against Retool, Copilot Studio, Glean, and plain MCP.

Every technical claim traces to primary source. Every Coursera claim is either public knowledge or explicitly flagged Verify.

1

What Is Cloudflare OS?

On August 5, 2026, as part of Agents Week, Cloudflare open-sourced the internal AI workspace that a large portion of its own workforce — engineering through sales — uses every day. It is not a chatbot with connectors. It is a runtime with a kernel, drivers, processes, and a permission model.

The announcement, precisely

  • Repository: github.com/cloudflare/cloudflare-os — note the name is cloudflare-os, not os. Apache 2.0.
  • Homepage / hosted deploy flow: os.cloudflare.app
  • Deployment starter: github.com/cloudflare/cloudflare-os-starter — a wrapper repo for pinning a release and customizing it without patching upstream.
  • Status: the public repo is version 2, a complete rewrite of the internal v1 on a new foundation. Cloudflare labels it Early Access and says plainly that it has many rough edges.
  • Rollout partners: Presidio and Happy Cog offer customization and rollout services — a signal that Cloudflare expects enterprise deployments to need integration help.
The thesis, in Cloudflare's own words

“make it Your Company OS” — cloudflare/cloudflare-os README

That single line is the product strategy. The expectation is not that you run Cloudflare's OS. It is that you fork it, load it with your company's context, wire it to your systems, and run your own.

Two meanings of “operating system”

The term is doing double duty, and both senses are load-bearing:

1. An OS for the company

A way for a whole organization to be productive with AI safely — the README's framing is that the security team should be able to sleep at night. Non-technical staff can build and run things without a security review per artifact.

2. An OS for AI workloads

In the literal systems sense: it schedules and isolates untrusted code, mediates access to external devices, enforces permissions, and manages identities — the same job a kernel does for processes.

The three things it provides

Agent chat UI, preloaded with company context

Ask agents to do tasks. The agent knows how your company operates — terminology, systems, conventions — because you loaded that context in. It is a Code Mode agent: it performs tasks by writing and immediately executing code snippets, not by emitting tool-call JSON.

Sandboxed application development — “Gadgets”

Ask an agent to build a small personal app. It runs in an isolated sandbox that you own, and you can safely share it. Covered in Module 2.

A security framework — “Gatekeepers”

Guardrails applied to both agents and apps, such that (the README's phrasing) non-technical users can go nuts and nothing bad happens. Covered in Module 3.

What it is not

People assume…Reality
It is a Linux distribution / real OSNo. Zero kernel code. The OS metaphor describes the architecture, and Module 4 shows how far the analogy actually holds.
It is ChatGPT Enterprise with connectorsNo. A connector gives an agent ambient access to a whole service. A Gatekeeper gives it a typed capability over one resource, with logging, approvals, and simulation.
It is a SaaS product Cloudflare sells youNo. It is source you deploy into your own account. Cloudflare's pitch is explicitly anti-lock-in: you own what you build on it.
It is a low-code app builderCloser, but the differentiator is that every user gets their own private instance of every app. That is a different distribution model, not a different editor.
It only runs on CloudflareMostly true today. workerd self-hosting is documented as COMING SOON. See Module 6 — this materially affects the adoption calculus.

How Cloudflare uses it internally

This is the strongest available evidence that the thing works: it is not a demo Cloudflare built for a launch. Per the README and the launch materials, thousands of Cloudflare employees across every team use it daily to research, create documents connected to live data, automate repetitive work, and build working apps for their jobs. The engineering-to-sales span is the interesting claim — it means the sandbox and approval model are tolerable to people who will never read the code.

Read this before you get excited

The README's own warning: Cloudflare OS is in a state of heavy development, and the August 2026 release is “very capable, but still has many rough edges.” Treat it as early access, and see Module 7 for what that means for a pilot's risk profile.

Why this should be on your radar at Coursera

You already have the two ingredients this system assumes: a workforce that wants AI leverage beyond chat, and internal systems (course catalog, learner analytics, Salesforce, internal APIs) that nobody wants to expose to a generic agent. Cloudflare OS is the first credible open-source answer to “how do we let 500 non-engineers build against our internal data without 500 security reviews?” Whether the answer is good enough is Module 7.

Check yourself

Why would Cloudflare give this away?

Three reasons worth naming, because they affect how durable the project is:

1. It sells the substrate. Cloudflare OS is a maximal showcase for Workers, Durable Objects, Dynamic Workers, Facets, KV, R2, Browser Rendering, and AI Gateway. Every deployment is a large, sticky Workers bill. The code is free; the runtime is not.

2. It is a runtime forcing function. The README states that Dynamic Workers, Facets, and several other runtime features were added specifically to support Cloudflare OS. Open-sourcing the flagship consumer pressure-tests those primitives in public.

3. Distribution against closed suites. Against Microsoft and Google bundling AI into the productivity suite, an open, self-owned alternative is the only differentiated play Cloudflare has. “You own what you build” is a wedge against lock-in, which is Cloudflare's standard positioning.

The implication for you: the incentives point toward Cloudflare maintaining this seriously, but they also point toward it staying Cloudflare-runtime-shaped. Do not expect first-class portability to be prioritized.

2

Gadgets — A New Software Paradigm

This is the part that is genuinely new. Not the agent, not the sandbox — the distribution model. When you make a slide deck in Cloudflare OS, you are not using a slide-deck service. The system instantiates a private copy of slide-deck software that belongs only to you.

The core move

A Gadget is a small application — client UI, server logic, and persistent state — that exists as your instance. Not your document inside someone's app. Your instance of the app. It runs in a sandbox separate from everyone else's.

The README calls out two consequences, and both are worth sitting with:

1. Cross-tenant leaks become structurally impossible

It is impossible for the slide-deck app to have a bug that leaks your slides to an attacker, because there is no shared multi-tenant store to leak from. The sandbox controls all access to your private instance. The whole class of “IDOR in a SaaS app exposed other tenants' data” stops applying.

2. The user can change the software

Missing a feature? Ask your agent to add it. No feature request, no roadmap, no vendor. And because of consequence 1, letting an end user modify their own instance is safe — the blast radius is one person's sandbox.

The argument in one sentence

Centralized SaaS exists because software is expensive to build and hard to operate. If an end user can prompt an agent into adding the feature they need, the first reason weakens; if the platform operates the instance for them, the second disappears. Cloudflare's claim is that AI has changed the equation that produced 25 years of multi-tenant cloud architecture.

The office-suite mental model

The most useful analogy in the README: imagine Google Docs or Office, but instead of a fixed set of file types (doc, sheet, deck), each file is potentially its own custom application, written by AI to serve exactly your needs.

Office suiteCloudflare OSThe twist
A documentA GadgetIt is an app, not content
Private by default, shareablePrivate by default, shareableSharing is verified against what the Gadget has read (Module 5)
You can have thousandsYou can have thousandsEach is its own isolate + its own SQLite
TemplatesBlueprintsA template is content; a Blueprint is a whole application
Save a doc as a new templatePublish a Gadget as a BlueprintYou are distributing source code, not a service

Blueprints: share the code, not the instance

If you build something others would want, you have two options. Share the Gadget (they collaborate in your live instance, real-time, shared state), or share a Blueprint (they stamp out their own independent copy, with their own bindings and storage).

From docs/blueprints.md, precisely what a Blueprint captures:

Captured

  • Source code — a snapshot of the committed Yjs document, stripped of edit history
  • Binding requirements — what kind of connection each named binding needs
  • Metadata — title, description, author, version, screenshot

Not captured

  • SQLite storage contents
  • AI chat history or edit history
  • Live connections or credentials — only the shape of each binding

Mechanics worth knowing: Blueprints get 128-bit random hex IDs and are shared at https://<host>/blueprint/<id>. Anyone with the link can view metadata unauthenticated; creating a Gadget from it requires auth. A single Gadget can have multiple Blueprints at different code versions (a “stable” and a “latest”). Blueprints export to a .gadget file and import into a different Workshop instance — which is your escape hatch for moving work between environments. Bundled Blueprints that ship with a deployment get stable readable IDs like format.document.

Three binding types a Blueprint can require: gatekeeper (an external resource), aiModel (a model binding), and agentSpawner (an agent-spawner config). When someone instantiates it, they pick their own connected account and their own model.

Why Blueprints are the strategically interesting primitive

The README's framing: traditionally, sharing a web app means hosting it and having users connect to your server. Blueprints work like mobile apps or old PC software — every user runs their own copy. Two effects compound in the AI era. An individual can now build far more than before, but still cannot operate a service; Blueprints remove the need to. And every user having their own copy means every user can change it — no feature request, no begging the maintainer to prioritize.

For an org, this is the answer to a chronic internal-tools problem: the team that built the dashboard gets stuck maintaining it forever. With Blueprints, they publish once; forty teams fork forty variants; nobody owns a backlog.

Real-time multiplayer, for free

Every Gadget is backed by a Durable Object — Cloudflare's stateful serverless primitive, which makes real-time collaboration close to trivial. The README's claim is telling: it is so easy that the coding agent implements multiplayer by default, without being asked. Presence, live cursors, and shared state come from the substrate, not from the prompt.

The agent can use the app it built

This is subtle and it is the reason the architecture choices in Module 4 exist. Every Gadget's client and server must communicate via Cap'n Web RPC. That requirement buys two things simultaneously:

  1. Cap'n Web is extremely low-boilerplate — define a method on the server, call it from the client as if local. Easy for an agent to write.
  2. Because the server necessarily exposes a clean typed API, an agent can call that same API directly. No MCP server to build, no custom agent loop to integrate.

So after you ask AI to build the app, you can ask AI to work inside the app. “Fill in the Q3 numbers on slide 4” hits the same RPC surface your UI does.

SaaS vs. the Gadget model

DimensionTraditional SaaS / internal toolGadget
InstancesOne multi-tenant deploymentOne per user
Cross-tenant riskThe permanent top-of-list riskStructurally absent
CustomizationFile a ticket, wait a quarterAsk your agent, wait a minute
Who maintains itThe owning team, foreverEach user's own copy; the author maintains nothing
Upgrade pathEveryone moves at onceFork drift — each copy diverges real cost
Consistency of outputEnforced by the appNot enforced — forty forks, forty behaviors real cost
Compute costAmortized across tenantsPer user — cheap on isolates, but non-zero
The honest downside nobody in the launch materials says out loud

Per-user instances trade one problem for another. You eliminate cross-tenant leaks and maintenance bottlenecks; you acquire divergence. When forty people fork the “quarterly revenue” Gadget and three of them tweak the aggregation logic, you now have three numbers and no single source of truth.

The mitigation is architectural, not cultural: anything that must produce one answer should live behind a Gatekeeper (a governed API that every Gadget calls) rather than inside Gadget code. Gadgets are for presentation and workflow; the number itself comes from the governed service. Get this boundary wrong at Coursera and you will spend a quarter reconciling dashboards.

Check yourself

🃏 Flashcards

3

Gatekeepers — Secure Agent Access

The README describes Gatekeepers as “supercharged MCP servers.” That undersells them. An MCP server is a tool surface. A Gatekeeper is a policy enforcement point with an approval queue, an audit log, a cache, and — the genuinely novel part — a simulator that lets the agent keep working while a human approval is still pending.

What a Gatekeeper does

When you introduce an agent or a Gadget to an external resource, a Gatekeeper is created to manage that access. It is service-specific software that mediates the connection. Per the README, it:

  • Provides a clean Cap'n Web API to the service, wrapping whatever the native API looks like
  • Handles authorization (typically OAuth), including token storage, refresh, and revocation
  • Enforces narrow access to only the specific resource the user intended
  • Logs every action the Gadget or agent performs, for your review
  • For any action with side effects, gives the human a chance to approve or deny

The launch materials give the concrete flavor: a Gatekeeper can give an agent access to a single repository, allow it to read issues but not source code, mask particular fields, and apply rate limits. That granularity is the point.

The async human-in-the-loop breakthrough

The problem everyone has and nobody solved

Traditional human-in-the-loop is synchronous. The agent wants to do something, it stops, and it waits. You give the agent a task, walk away to get coffee, come back, and find it got stuck on an approval at step one and made zero progress. So people give in and set auto-approve — or --dangerously-skip-permissions — which is obviously unsafe.

If you have run coding agents at any scale, you have lived this exact failure. It is the single biggest reason agent permission systems get disabled in practice.

Gatekeepers do something different. When an agent performs an action requiring approval, the Gatekeeper simulates the outcome locally. It tells the agent the action completed. If the agent reads the result back, it gets simulated results consistent with the action having happened. The agent proceeds and queues up more work.

Later — when it is convenient — the human approves or rejects, in bulk or one by one. The agent never blocked. The human never rubber-stamped under time pressure.

Synchronous approval — the coffee problem step 1 BLOCKED ⏳ step 2 step 3 ← you are at the coffee machine Gatekeeper simulation — async approval step 1 step 2 step 3 step 4 done ✅ writes are held in the approval queue; reads return simulated state, so the agent never notices human batch-approves later
Why this is the most important idea in the repo

Every enterprise AI governance conversation dead-ends at the same place: security wants approvals, users want throughput, and synchronous approval makes those mutually exclusive. Simulation dissolves the trade-off. It is the difference between a policy that gets followed and a policy that gets disabled in week three.

If you take one architectural idea from this launch into Coursera — even if you never deploy Cloudflare OS — take this one. Any internal agent platform you build should hold side effects in a queue and simulate reads rather than blocking on approval.

How it is built: the three-tier hierarchy

From the repo's write-gatekeeper agent skill, each Gatekeeper implements three levels:

TierTypeScope
VendorGatekeeperVendor, a WorkerEntrypointTop-level entry for the service. One per service.
UserGatekeeperUser, a WorkerEntrypoint with ctx.propsOne human user's authenticated connection (their OAuth tokens live here, in a UserAccount Durable Object).
InstanceGatekeeper<Session>, a DO facet of the OverseerPer-resource, per-Gadget binding. This is the object that actually exposes the Session API.

Each Gatekeeper is a separate Worker. Cloudflare envisions Gatekeeper services eventually being deployed and maintained independently from OS instances — but for now they ship in-repo and deploy alongside your instance. The backend auto-discovers vendors from service bindings whose names start with GATEKEEPER_.

The seven responsibilities

The skill file enumerates what a correct Gatekeeper must do. This is effectively the security specification:

Auth management

OAuth on behalf of the human user — connected accounts, token storage, refresh, and revocation in a UserAccount DO.

API design

A TypeScript wrapper over the service, designed object-oriented and capability-shaped. The Google Docs Gatekeeper gives you an interface to a specific document — not a coarse API where you pass a doc ID to every method. This distinction is what makes narrowing authority possible at all.

Fine-grained resource granting

Users grant access at meaningful granularities — a single Google Doc, a single GitHub repo — not just “everything I can do.” The skill explicitly warns against absurd granularity: a Jira Gatekeeper should support service / project / issue, but not per-field.

Logging & approvals

Every read calls authorizeObservation(); every externally-visible side effect goes through submitAction() and must not actually execute until applyAction(). The skill is blunt: miss this on any method and the security model is broken.

Caching

Cache remote content in the Gatekeeper's DO storage. Performance, yes — but also API quality. Gmail's native list API returns thread IDs with no metadata; with a cache, the Gatekeeper can return rich thread summaries directly.

Simulation

Submitted-but-unapplied actions must be reflected in subsequent reads. This is what makes async approval invisible to the agent.

Observer verification

When a Gadget is shared, collaborators may observe data it previously read. The Gatekeeper must verify each collaborator could access that data themselves, via getVerifier() / addObserver() / removeObserver(). Covered in depth in Module 5 — it is the sleeper feature.

Two ways to implement simulation

Mutate the cache

Apply the action's effects to cached data on submit; invalidate or rebuild on reject. Simple, and works well when the cache is already a transformed view. Gotcha: you must re-apply queued actions whenever you refresh the cache.

Overlay at read time

Store pending actions separately; merge them into read results on demand. The skill calls this “arguably cleaner but trickier to implement correctly.” Better separation of concerns.

Documentation discipline that is easy to get wrong

The skill instructs that the agent-facing types.d.ts JSDoc must never mention submitAction, applyAction, approvals, caching, DO storage, OAuth, or syncing. Rationale: correct simulation keeps the approval machinery invisible, and leaking it into the agent's only documentation invites the agent to reason about — and route around — the control plane. Implementation details go in the .ts file or the PR, never the agent-visible types.

Shipped Gatekeepers

Sixteen Gatekeeper packages are in the repo today. The README lists setup instructions for eleven; five more exist as packages:

GatekeeperPackageSetup docs in READMELikely relevance at Coursera
GitHubgatekeeper-githubYesHigh — repos, issues, PRs; also an SSO option
Googlegatekeeper-googleYesHigh — Docs, Drive, Gmail, Calendar
Slackgatekeeper-slackYesHigh — where the work actually gets discussed
Notiongatekeeper-notionYesMedium — depends on your wiki of record
Confluencegatekeeper-confluenceYesMedium — same
Cloudflaregatekeeper-cloudflareYesLow — unless you adopt Cloudflare broadly
Supabasegatekeeper-supabaseYesLow — useful as a reference implementation for a database Gatekeeper
Email Workersgatekeeper-emailYesMedium — requires a Cloudflare zone
ZoomInfogatekeeper-zoominfoYesMedium — sales prospecting
Home Assistantgatekeeper-homeassistantYesNone — but a charming proof of the model's generality
Spotifygatekeeper-spotifyYesNone — ditto
Lineargatekeeper-linearPackage onlyHigh, if Linear is your tracker
MCP (generic)gatekeeper-mcpPackage onlyVery high — bridges existing MCP servers into the Gatekeeper model
MCP Portalgatekeeper-mcp-portalPackage onlyHigh — MCP server management surface
Contextgatekeeper-contextPackage onlyHigh — this is the company-knowledge injection point
Schedulergatekeeper-schedulerPackage onlyHigh — recurring/triggered agent runs
The MCP Gatekeeper is the migration path

gatekeeper-mcp matters more than its billing suggests. If your teams have already built MCP servers — and by mid-2026 most engineering orgs have — you do not have to rewrite them to adopt this model. You wrap them, and they inherit the capability introduction, logging, and approval queue they never had. That collapses a large chunk of the migration cost estimated in Module 7.

Building a custom Gatekeeper

The repo ships an agent skill at .agents/skills/write-gatekeeper/SKILL.md that walks an AI through building one. It is a two-phase process with two mandatory stop-and-review gates — a notable design choice, since it means Cloudflare does not trust an agent to one-shot a security boundary.

Phase 1 — core implementation

  1. Understand the service. Auth model, which resources to expose, which operations are observations (reads) vs. actions (side effects).
  2. Design the Session types in src/types.d.ts. One interface per logical resource, not a god-object. Methods return structured data, not raw API responses. Design so that limiting authority means limiting access to specific objects.
  3. STOP Present the API for review. The skill is emphatic: do not proceed without operator approval. “Getting the API right is the most important and delicate part” — getting it wrong means rebuilding.
  4. Implement from the provided SKELETON.md template.
  5. Register a service binding in packages/workshop-backend/wrangler.jsonc.
  6. Add resource-selection UI — an iframe configurator so users can pick which repo/doc/project to grant.
  7. STOP Ask whether to proceed to Phase 2 (which may happen in a separate session).

Phase 2 — the security pass

Logging and approvals, caching, simulation, and observer verification. This is where a Gatekeeper stops being an API wrapper and becomes a control point.

Registration looks like this:

// packages/workshop-backend/wrangler.jsonc
{
  "binding": "GATEKEEPER_COURSE_CATALOG",
  "service": "gatekeeper-course-catalog",
  "entrypoint": "GatekeeperVendor"
}

And the package layout:

packages/gatekeeper-<name>/
  src/
    configurator/         # resource-picker UI modules
    <name>.ts             # Vendor, UserAccount, UserImpl, GatekeeperImpl, SessionImpl
    types.d.ts            # Session/Hook types — the agent's only API documentation
    types.txt -> types.d.ts   # symlink, read at runtime by getTypeScriptTypes()
    <name>-api.ts         # optional HTTP helper
  wrangler.jsonc
  package.json
  tsconfig.json
The capability-shaped API rule, made concrete

This is the design principle that everything else depends on, so here it is as code. The shapes below are illustrative — written to show the pattern the skill mandates, not copied from the repo.

// ❌ Coarse: authority cannot be narrowed. Holding this object
//    means holding the whole catalog. Every method needs an ID,
//    and any ID is as good as any other.
interface CatalogSession {
  getCourse(courseId: string): Promise<Course>;
  updateCourse(courseId: string, patch: Patch): Promise<void>;
  listLearners(courseId: string): Promise<Learner[]>;
}

// ✅ Capability-shaped: the object IS the authority.
//    Handing out a CourseRef grants exactly one course.
//    Withholding .learners() grants read access without roster access.
interface CatalogSession {
  /** Resolve a single course by slug. Throws NotFound if it does
   *  not exist or this connection was not granted access to it. */
  course(slug: string): Promise<CourseRef>;
}

interface CourseRef {
  /** Title, description, and publication state for this course. */
  metadata(): Promise<CourseMetadata>;
  /** Update editable metadata fields on this course. */
  update(patch: CoursePatch): Promise<void>;
  /** Enrolled learners. Omitted from the ref entirely when the
   *  connection was granted metadata-only access. */
  learners?(): Promise<LearnerSummary[]>;
}

The difference is not stylistic. In the first version, an agent introduced to “one course” still holds a handle that can reach every course — enforcement has to happen inside every method, by checking IDs. In the second, the reference is the permission, and there is no ID to tamper with. That is what capability-based means in practice.

Check yourself

🃏 Flashcards

4

The Architecture

Cloudflare OS is built by the team that built Workers, using runtime features that were added specifically to support it. That is the single most useful fact about its architecture — it explains both why it is elegant and why porting it elsewhere is hard.

The primitive stack

PrimitiveWhat it isHow Cloudflare OS uses it
WorkersV8 isolates at the edgeEverything. Each Gatekeeper is its own Worker.
Durable ObjectsStateful single-instance actors with private storageEvery workspace is its own Durable Object. Also backs every Gadget's state and enables real-time multiplayer.
Dynamic WorkersWorkers loaded and run at runtime, from code produced on the flyThe sandbox for agent-written Gadget server code. Internet access disabled by default.
FacetsNested Durable Objects within a parent DO, each with its own isolate and SQLiteEvery Gadget runs in a Dynamic Worker Facet. Gatekeepers also install facets into each workspace.
Cap'n WebObject-capability RPCClient↔server for every Gadget; also the Gatekeeper API surface. Doubles as the agent's API.
KVEventually-consistent key-valuePublic-facing Blueprint lookup (BLUEPRINTS namespace).
R2Object storageBlueprint code content, keyed <blueprintId>/<version>.
Browser RenderingHeadless browserRequired by the deployment; used for rendering/screenshotting.
AI GatewayModel routing + observabilityRoutes inference calls, enabling model selection, cost tracking, and budget enforcement per user/team/workspace.
The isolation story in one sentence

Each Gadget gets its own lightweight V8 isolate and its own dedicated SQLite database, courtesy of Durable Object Facets — which is why per-user app instances are economically viable at all. This is not a container per user. It is an isolate per user, and isolates are cheap.

How it fits together

workshop-frontend the “shell” Cap'n Web RPC workshop-backend — the “kernel” auth · sandboxing · access control · routing Workspace = one Durable Object Gadget facet Dynamic Worker own V8 isolate own SQLite no internet Gadget facet Dynamic Worker own V8 isolate own SQLite no internet Gatekeeper facet per-resource binding Agent Code Mode writes + runs code snippets binding (the only way out) gatekeeper-* Worker OAuth · log · approve · simulate GitHub · Google · Slack · …

The OS analogy, as Cloudflare states it

This mapping is verbatim from the README, and it is more literal than marketing usually is:

Normal OSCloudflare OSWhat that actually means
kernelpackages/workshop-backendConnects users to programs and devices, sandboxes applications, enforces access control
device driverspackages/gatekeeper-*Drivers connect programs to devices; Gatekeepers connect agents to external services
shellpackages/workshop-frontendThe interface a human drives it from
processesgadgetsRunning instances, isolated from one another
executablesblueprintsThe on-disk artifact you instantiate into a process
usersusers
ACLsshared permissions
???agentsThe gap. Traditional OSes have no concept for this.
The “???” row is the interesting claim

Cloudflare's argument: AI agents cannot simply be treated as users. An agent must be accountable to a human user while holding its own, more restricted, permissions. And because agents work by writing and executing code on the fly, the right security model for them is capability-based, not ACL-based. The README's closing thought is that traditional OSes arguably ought to give agents special treatment too.

Whether or not you deploy this, that framing is worth stealing for any internal agent platform: an agent is not a service account and not a user. It is a third principal type, deriving authority from a human but never equal to them.

Package map

The 25 packages in the monorepo, grouped by role:

GroupPackages
Coreworkshop-backend (kernel), workshop-frontend (shell), workshop-shared (the canonical interfaces — gatekeeper.ts lives here), router
Gatekeepersgatekeeper-{github, google, slack, notion, confluence, cloudflare, supabase, email, linear, zoominfo, spotify, homeassistant, mcp, mcp-portal, context, scheduler}
Supportbackend-utils, typed-storage, mcp-shared, error-reporting, configurator-ui, integration-tests

Also at the root: AGENTS.md, an .agents/ directory of skills (including write-gatekeeper), a plans/ directory, and a docs/ directory covering blueprints, sharing, observers, OAuth sign-in, AI Gateway billing, integration testing, and public server config. The repo is written to be operated on by agents as much as by people — which is itself a useful thing to study.

Cap'n Web and Code Mode

Two choices that reinforce each other:

Cap'n Web is an object-capability RPC system. “Object-capability” is the operative half: you do not pass identifiers and let the receiver check permissions; you pass references, and holding the reference is the permission. This is why the Gatekeeper API design rules in Module 3 look the way they do — the RPC layer makes capability-shaped APIs the natural thing to write.

Code Mode is how the agent calls tools: rather than emitting structured tool-call JSON per step, it writes a snippet of code and executes it. For multi-step work this is dramatically more efficient — a loop over 200 issues is one snippet, not 200 round trips. The README claims that because of the tight integration, the Cloudflare OS agent often performs better and faster with fewer tokens than a general-purpose coding agent on the same underlying model.

Why these two compose so well

Code Mode needs a good API to write code against. Cap'n Web forces every Gadget and every Gatekeeper to expose exactly that. The agent's tool surface and the app's own client API are the same surface — which is why the README can claim every Gadget has an agent-friendly API by default, with no MCP server and no custom agent loop.

Blueprint storage: a one-way propagation chain

Worth understanding because it explains a UI behavior you will hit:

  1. Gadget DO (blueprints collection) — authoritative source. Holds full metadata, the exported code version, and a dirty flag.
  2. User DO (blueprints collection) — denormalized copy for fast listing, so you can audit and manage your Blueprints even if the source Gadget was deleted.
  3. Workers KV (BLUEPRINTS) — the public lookup store, keyed by hex ID; this is what the public API reads.

Code content lives separately in R2 (BLUEPRINT_CONTENT), as a Yjs V2-encoded full-state document. Old versions are retained on update to avoid races during concurrent instantiation. The dirty flag is set before propagation and cleared only after all three writes succeed — if it stays set, the UI shows a warning with a Retry button. That is the failure you will occasionally see; it is by design, not corruption.

Model providers and billing

  • Bring your own model. Works with many major providers and self-hosted models. The heavy lifting is done by Pi (pi-agent-core), which gives one API across providers.
  • AI Gateway routes inference, enabling model selection, cost tracking, and budget enforcement per user, team, or workspace. For an org rollout this is the cost-control lever — and the reason a pilot's spend is measurable rather than a surprise.
  • Collaborator billing: when a collaborator uses AI chat in someone else's Gadget, the model resolves from their own account. Spend follows whoever prompted, not the Gadget owner.
  • The deployment starter ships with AI disabled by default — you opt into Workers AI and AI Gateway explicitly.

Other notable dependencies

  • Yjs — CRDT sync for code changes between clients and agents, and for replaying histories. This is why an agent editing your Gadget's code while you are also editing it does not corrupt anything.
  • Monaco — the embedded editor, for the people who still look at the code.
  • Vite — the dev loop.

Check yourself

🃏 Flashcards

5

Security Deep Dive

This module is the one to send to your security team. The interesting content is not the sandbox — sandboxes are well understood. It is the observation-tracking system, which enforces that sharing a Gadget cannot leak data the recipient was never entitled to see. I have not seen another agent platform attempt this.

Capability-based, not ACL-based

Every agent and every Gadget starts with access to nothing. Even if the workshop is configured with credentials for GitHub, Google, and Slack, agents and Gadgets do not automatically get to use them.

Instead you must introduce each agent or Gadget to the specific resource you want it to reach — paste a link to a GitHub repo, or click “add resource” and pick it. An agent can also request an introduction to a resource it believes it needs, which you grant or deny.

Ambient access (typical MCP setup)

MCP servers are configured up front. Every chat session inherits broad access to every configured service. An agent asked to summarize a meeting has, incidentally, the ability to read your entire Drive and post to any Slack channel. The blast radius of a prompt injection is everything you ever connected.

Capability introduction (Cloudflare OS)

Each agent holds only what it was introduced to, for the job at hand. The meeting-summary agent has a reference to one document. A prompt injection in that document cannot reach anything else, because there is nothing else to reach.

Why this is the right answer to prompt injection

Prompt injection is not solved by better prompts or better classifiers — it is contained by narrowing what a compromised agent can do. Capability introduction makes the containment structural: the agent's authority is the set of object references it holds, and untrusted content cannot mint new references. Combine that with Gatekeeper approval on every side effect, and the realistic worst case for an injected agent drops from “exfiltrated the CRM” to “queued some actions a human then rejected.”

The sandbox, both halves

LayerMechanismEffect
Gadget serverDynamic Worker with internet access disabledCan only reach explicitly designated external resources, via Workers Bindings. There is no fetch to the open internet.
Gadget clientSandboxed iframe with strict CSPTalks to its server only via a Cap'n Web session over postMessage() to the parent frame. Otherwise blocked from the internet to the maximum extent browsers allow.
External accessGatekeeper bindingsThe single, logged, approvable path out. If it did not come through a Gatekeeper, it did not happen.

Note the shape of this: the sandbox is deny-by-default on egress, not deny-by-default on API surface. That is the stronger property. A Gadget cannot exfiltrate to an attacker-controlled endpoint because it cannot open a socket at all, regardless of what its code says.

Observations and observer verification

Here is the problem this solves. Alice builds a Gadget that reads a sensitive HR spreadsheet through the Google Gatekeeper. Alice shares the Gadget with Bob. Bob cannot see the spreadsheet — but the Gadget can, and now Bob is looking at the Gadget. Every agent platform on the market has this hole.

Cloudflare OS closes it. The invariant, from docs/observers.md:

The security invariant

If a Gadget can read restricted information, any user who cannot read that information is also prohibited from interacting with the Gadget.

The mechanism:

Every read is recorded as an observation

Gatekeepers call authorizeObservation() before returning external data. The system accumulates a history of what this Gadget has actually seen.

Opening a shared Gadget requires your own connected account

When Bob opens Alice's Gadget, he must supply his own connected account for each Gatekeeper the Gadget uses. He does not borrow Alice's credentials — ever.

Each Gatekeeper verifies Bob independently

Bob's own GatekeeperUser mints an opaque GatekeeperUserVerifier. The overseer hands it to the Gatekeeper, which unwraps it to learn Bob's vendor-level identity and checks whether Bob could directly read everything the Gadget has historically read. The check runs inside the Gatekeeper's trust domain, because only the vendor understands its own ACL model.

If Bob fails, he is denied — before seeing anything

No partial access, no redaction. v1 is deliberately all-or-nothing per observer.

Forward enforcement

If the Gadget later makes a new observation that any registered observer could not make directly, that observation is blocked and throws. Alice can resolve it by revoking Bob's access. Bob is also re-checked every time he opens the Gadget.

Why this should matter to you specifically

Coursera handles learner data, and the compliance surface around it (FERPA-adjacent obligations, GDPR, enterprise customer DPAs, university partner agreements) makes “who can see what, transitively, through an AI tool” a genuinely hard question to answer for auditors.

Observer verification is the first mechanism I have seen that gives a defensible answer at the platform layer rather than the policy layer. “A user cannot see data through a shared Gadget that they could not have read directly, and the source system itself adjudicates that” is a sentence you can put in front of a security review. Whether the implementation holds up is a question for your team — but the design intent is right, and it is the strongest single argument for this platform over the alternatives in Module 8.

Two scope caveats from the docs, stated honestly:

  • No per-thread enforcement in v1. It is all-or-nothing per observer; individual chat threads and observations are not hidden from individual collaborators.
  • Role-dependent breadth. build collaborators — who get full access to chat, code, and all bindings — must be verified against every Gatekeeper the Gadget has.

The lockdown flag

Before observer verification existed, the only enforcement mechanism was prohibitAllSharing — a blunt flag a Gatekeeper sets on a maximally sensitive observation. When set, the Gadget can no longer be shared with anyone and drops into “lockdown”: no further actions, no web fetches. It still exists as a backstop for data that should never be shared regardless of the recipient's entitlements. Worth knowing about, because a Gadget that mysteriously stops working after touching sensitive data has probably hit it.

Sharing: roles, links, and revocation

Two roles, totally ordered (build > use):

builduse
Edit code, use AI chat, manage bindingsYesNo
Render and interact with the deployed UIYesYes
Read metadataFullRestricted to id / title / owner / role
Delete the GadgetOwner onlyNo
Whose AI models are usedTheir own (BYOK billing follows the prompter)n/a
Whose connected accounts are usedTheir own — never the owner'sn/a
Revocation authorityOnly users they themselves addedn/a

Three implementation details worth flagging to a reviewer, because they are the kind of thing usually gotten wrong:

  • Default-deny by construction. The restricted use session is a class that implements Overseer and throws Unauthorized for everything outside an allowlist. Because it implements the full interface, any newly added method fails to compile until a developer consciously decides whether use callers may invoke it. The compiler enforces the security review.
  • Share keys are never stored. The server generates a random 128-bit key and stores only its HMAC-SHA-256 hash with a domain-separation constant. A database leak does not expose valid share links, and the server cannot reconstruct them. “Copying” a link mints a new key rather than revealing the old one.
  • Revocation is graph-based. The system tracks how each collaborator gained access as directed permission edges (user edge or share-link edge). A collaborator keeps access while at least one valid edge remains, which is what makes transitive revocation coherent when Alice added Bob and Bob added Carol.

What this model stops — and what it does not

ThreatHandled?By what
Gadget exfiltrates data to an attacker endpointYesNo egress from the Dynamic Worker or the iframe; bindings are the only path
Cross-user data leak via an app bugYesPer-user instances; no shared multi-tenant store
Prompt injection causes destructive writesLargelySide effects queue for human approval; the agent only holds narrow capabilities
Sharing leaks data the recipient cannot accessYesObserver verification, adjudicated by each Gatekeeper
Over-broad grant by a careless userPartlyFine-grained introduction is possible; nothing forces users to be narrow. Depends on Gatekeeper API design and defaults.
A malicious or buggy custom GatekeeperNoGatekeepers are the trusted computing base. One that skips submitAction() silently breaks the model. Custom Gatekeepers need real code review.
Approval fatigue — humans rubber-stamping batchesNoAsync batching reduces pressure but makes bulk-approve one click. A process and UX problem, not a platform one.
Sensitive data reaching a third-party model providerYour callAI Gateway centralizes routing; which provider sees what is a configuration decision you own.
Per-thread confidentiality among collaboratorsNot in v1Explicitly out of scope; observer checks are all-or-nothing
The line to hold in a security review

Everything in this model rests on Gatekeepers being correct. A Gatekeeper that forgets authorizeObservation() on one read method silently disables observer verification for that path; one that performs a side effect without submitAction() silently disables approvals. The skill file says this outright.

So the governance rule for any adoption is simple and non-negotiable: custom Gatekeepers are security-critical code and go through the same review bar as authentication. Gadgets can be vibe-coded by anyone. Gatekeepers cannot.

Check yourself

What would you actually ask Cloudflare before putting learner data behind this?

A starting list for your security team — these are the questions the public docs do not fully answer:

  1. Observation history retention. How long is the per-Gadget observation log kept, where does it live, and is it itself covered by deletion requests?
  2. Verifier unwrapping. docs/observers.md notes the Gatekeeper unwraps the verifier “today, by calling semi-private methods it defined on its own verifier object.” That is an acknowledged soft boundary. What is the hardening plan?
  3. Simulated-state divergence. If an agent acts on simulated results and the human then rejects, what guarantees exist that downstream derived artifacts are invalidated rather than left carrying phantom data?
  4. Dynamic Worker escape surface. What is the isolation guarantee between facets in the same workspace DO, and has it been independently reviewed?
  5. Model provider data flow. With BYOK and per-collaborator model resolution, what stops a collaborator's personal provider key from routing Coursera data to an unvetted endpoint?
  6. Deletion. When a learner deletion request arrives, what enumerates every Gadget SQLite database that may hold a copy?

Question 6 is the one I would lead with. Per-user instances are excellent for confidentiality and awkward for erasure — you have traded one shared datastore you can query for thousands of small ones you cannot. Get an answer before a pilot touches production learner data, and design the pilot to avoid it until you have one.

6

Getting Started

Three paths, in ascending order of commitment: run it on your laptop in one command, click a hosted deploy into a Cloudflare account, or use the starter repo for a real deployment you control. A fourth — self-hosting on workerd — is documented as coming soon, which matters more than it sounds.

Path 1 — run it locally (15 minutes)

Install pnpm, then:

git clone https://github.com/cloudflare/cloudflare-os
cd cloudflare-os
pnpm run-local
# → http://localhost:8787

This runs the whole stack locally on wrangler and workerd. Not for production. Your data lands in a .wrangler subdirectory. This is the right first move — do it before any meeting about it.

For actual development work, run the halves separately in two terminals:

pnpm dev-server     # terminal 1
pnpm dev-client     # terminal 2
# → http://localhost:3000

What to try first

The README's own suggested prompts, which are well chosen because each one exercises a different part of the system:

PromptWhat it exercises
“Make slides for my upcoming meeting with a customer.”The built-in slides Blueprint — instantiation from a bundled template
“Make a collaborative whiteboard app.”App generation from scratch, plus automatic multiplayer via Durable Objects
“Make a tic tac toe game.” then “I'll be X and you be O. I've made my first move. Your turn.”The agent using the app it just built — via the Cap'n Web API it necessarily exposed. This is the one to demo.
“Make an issue dashboard for this GitHub repo.” (attach a repo)Gatekeeper introduction and capability scoping. Requires GitHub configured.
“Fix the typos in this Google Doc.” (attach a doc)The approval queue and simulation on write. Requires Google configured.
Demo advice

If you show this to anyone at Coursera, lead with tic-tac-toe. “The AI built an app, and now the AI is playing it with me through the same API my browser uses” lands the architectural point in ten seconds in a way no slide about object-capability RPC will.

Path 2 — hosted deploy (branding only)

A guided flow at os.cloudflare.app/deploy deploys the upstream release into your own Cloudflare account. It builds nothing locally, configures sign-in and admin emails for you, and leaves the whole /admin surface intact: site name, logo, accent color, announcements, agent instructions, featured Blueprints, and which connectors your users can reach. Built-in Gatekeepers are yours to connect with your own OAuth credentials.

The constraint: hosted deployments run on a workers.dev address. If you want your own domain — or the email Gatekeeper, which needs a zone — you need Path 3.

Path 3 — the starter repo (a real deployment)

cloudflare/cloudflare-os-starter wraps a pinned upstream release with deployment controls, without modifying upstream source. This is how a company should run it.

Prepare the workspace

Node.js 24, pnpm 11, then:

git submodule update --init
pnpm install
pnpm --dir cloudflare-os install
pnpm exec wrangler login

Configure sign-in

The starter deploys Cloudflare Access mode, which verifies identity before a request reaches the Worker. Pick a hostname in an active zone (os.example.com), create a self-hosted Access application, copy its audience tag, and fill in deployment.jsonc — account ID, Worker names, hostname, Access audience, admin emails. Every control is annotated in place. For an evaluation without a zone, switch the route to { "workersDev": true }.

Validate and deploy

pnpm check then pnpm deploy. The deploy derives temporary Wrangler files from upstream base configs, builds the frontend in Access mode, deploys the private Error Reporter and Gatekeepers before the Workshop, and removes generated files even on failure. Secrets never enter tracked configuration.

Verify

Confirm Access signs you in as expected; open /admin and confirm your email is an administrator; enable a custom Gatekeeper and confirm its read appears as an observation; check the Error Reporter's structured error_report logs.

Account requirements: Workers, KV, R2, Browser Rendering, and Dynamic Worker Loaders. AI products are optional — AI is disabled by default and you opt into Workers AI and AI Gateway. With resource values left null, Wrangler auto-provisions three KV namespaces and an R2 bucket and reconnects them on later deploys.

What you want to changeWhereRedeploy needed?
Site name, logo, accent color, announcements, agent instructions, featured Blueprints, connectors/adminNo
Sign-in, routes, AI, storage, observability, Worker identitiesdeployment.jsoncYes
Your organization's APIs and capabilitiespackages/custom-gatekeeperYes
Product behavior not reachable through Worker boundariesA pinned upstream fork/commitYes — and you now maintain a fork
The starter repo's design is the adoption advice

Note what it optimizes for: a pinned submodule you upgrade deliberately, customization through Worker boundaries rather than patches, and an explicit upgrade checklist. That is Cloudflare telling you, structurally, “do not fork upstream unless you must.” Given the contribution policy (below), that guidance is load-bearing — a fork here is a fork you own forever.

Path 4 — self-hosting on workerd

Status: COMING SOON

Cloudflare OS can run entirely on workerd, the open-source Workers runtime — the local dev path already uses it under the hood. But the README states plainly that documentation and tooling for deploying on your own servers are still being worked on. The current guidance for the adventurous is to read the low-level workerd.capnp config documentation, or point an agent at it.

Plan as if this does not exist yet. If your adoption case depends on “we can always self-host to avoid the Cloudflare dependency,” that argument is a roadmap promise today, not a capability. This is the single biggest gap between how this launch is being summarized and what actually ships.

Configuring external services

Most Gatekeepers need OAuth client credentials for their service. The README is refreshingly candid that this is annoying — many providers deliberately do not make it easy, since OAuth's intended audience is developers. Each Gatekeeper package carries its own setup instructions.

The GitHub Gatekeeper is a good illustration of the gotchas you will hit:

  • Use a GitHub OAuth App, not a GitHub App. Only OAuth Apps honor the scope parameter, which is what enables minimal scopes on login (read:user user:email) and full scopes only on connect (repo read:user user:email).
  • Callback URL: http://localhost:8787/gatekeeper/github/oauth locally; swap the host for your PUBLIC_BASE_URL in a real deployment.
  • Credentials go in a gitignored .env in the package directory.
  • To offer “Continue with GitHub” on the login page, add github to AUTH_GATEKEEPERS. Users are keyed by primary verified email.

Budget real time for this step. Eleven services × OAuth app registration, scope review, and callback configuration is not a morning's work, and each one needs someone with admin rights in that service.

Operations

  • wrangler tail for live production events.
  • Roll back from the Worker's dashboard deployment history or wrangler rollback.
  • Backend error reporting works without a vendor account — explicit upstream issue events become structured logs in a private Error Reporter Worker.
  • Follow the starter's upgrade checklist before bumping the pinned submodule, and review upstream release history first.
The contribution policy — read this before planning any upstream work

Cloudflare is not seeking outside contributions. Their stated reasoning: AI made writing code easy, so the hard part is reviewing it and keeping the product coherent — external PRs donate the easy part while creating more of the hard part. They will accept small, trivially verified fixes, but explicitly ask you not to send typo fixes or anything beyond roughly a dozen lines. Larger PRs get closed with a pointer to the policy. Big ideas go to Discussions.

Consequence for you: any Coursera-specific change that cannot be expressed as a custom Gatekeeper or a deployment.jsonc setting becomes a fork you maintain against an upstream that moves fast and will not take your patches back. Scope every customization request against that reality. This is a genuine long-term cost and it belongs in the Module 7 risk column.

Check yourself

7

Coursera Analysis — Should We Adopt This?

The honest version. Cloudflare OS solves a real problem Coursera has, using a security model better than anything else available. It also arrives as early-access software from a vendor you are not currently on, that will not accept your patches, with self-hosting unfinished. Both halves are true, and the recommendation follows from weighing them rather than picking one.

First, a correction that changes the math

Coursera is not on Cloudflare

A common framing of this opportunity assumes Coursera already runs on Cloudflare, making adoption nearly free. That assumption does not hold. A DNS and header check on coursera.org (August 5, 2026) shows www.coursera.org resolving through www-cloudfront-alias.coursera.org to AWS ranges, with responses carrying via: 1.1 …cloudfront.net (CloudFront), x-amz-cf-pop, and x-amz-cf-id headers, fronting an envoy origin. Coursera's public edge is AWS CloudFront.

This does not kill the case. It relocates it. Cloudflare OS does not need to sit in your production request path — it is an internal workspace, and running it on a Cloudflare account alongside an AWS-based production estate is entirely normal. But three “free” items become line items:

  • A new vendor relationship: Cloudflare account, contract, security review, DPA, procurement cycle.
  • A second identity and network perimeter to integrate — Cloudflare Access needs wiring to your existing IdP.
  • No existing in-house Workers expertise to assume. Budget ramp-up time for whoever owns this.

Verify the current state with your infrastructure team before quoting this — edge providers change, and a partial Cloudflare footprint somewhere in the estate would soften the finding. But do not build a business case on “we are already there.”

The problem this would actually solve at Coursera

Strip away the technology and the organizational problem is this: a large number of non-engineers need leverage over internal data, and every path to giving it to them is currently bad.

Today's pathWhy it fails
File a ticket with engineeringQuarters-long queue for tools worth days of value. Most requests never get made.
Generic AI chat with copy-pasted dataWorks, and is a data-governance problem you cannot see. No audit trail, no scoping, no answer for a security review.
Spreadsheets and manual exportsStale, ungoverned, duplicated, and the exports themselves are the leak.
Buy a point SaaS tool per workflowVendor sprawl, per-seat costs, each one needing its own data-sharing review.
Give agents broad MCP access to internal systemsFastest to build, worst blast radius. Ambient access means one prompt injection reaches everything.

Cloudflare OS is a credible sixth option: non-engineers build their own tools, against narrowly scoped capabilities, with every read logged and every write queued for approval. That is the pitch. Now the scrutiny.

Use case inventory

Ranked by value-to-effort, with the Gatekeeper work each requires. Verify marks assumptions about Coursera's internal systems that I cannot confirm from outside.

Team / use caseValueGatekeeper neededEffortData risk
Everyone — decks, docs, analysis with company context baked in High Built-in Google/Slack + gatekeeper-context Low Low
Engineering — internal dashboards, ops runbooks, workflow automation High GitHub + Linear/Jira (built-in or thin custom) Low Low
Product — PRD generation with company context, competitive analysis High Context + Confluence/Notion + Google Low Low
Content — course-authoring aids, content review workflows High Custom: course catalog Verify Medium Medium
Sales — proposal generation, account research, pipeline tooling High Custom: Salesforce + built-in ZoomInfo Medium High — customer PII
Support — issue resolution with learner context Medium Custom: support + learner lookup High High — learner PII
Analytics — self-serve learner analytics for non-analysts High Custom: warehouse, read-only, aggregate-only High High
Enterprise CS — per-customer usage reporting Medium Custom: warehouse + Salesforce High High
Read the table diagonally

Value does not correlate with effort or risk — but effort and risk correlate with each other almost perfectly. The top three rows are high value, low effort, and low risk, because they touch documents and code rather than learner records. The bottom three are where the transformative value lives and where every hard question sits.

That shape dictates the pilot: start entirely above the line. Anything requiring a custom Gatekeeper over learner data is phase two, gated on answers to the security questions in Module 5.

The case for

  • The security model is genuinely better than the alternatives. Capability introduction instead of ambient access, plus observer verification on sharing, is a stronger story than anything in Module 8. For a company whose data includes learner records under multiple regulatory regimes, this is the argument that actually matters — not the productivity claims.
  • Async human-in-the-loop is the difference between a policy that survives and one that gets disabled. Every governance regime you have deployed that required synchronous approval has degraded into rubber-stamping. Simulation is a real answer.
  • Apache 2.0, deployed in your own account. No per-seat licensing. No vendor holding your workflows hostage. You own what you build, and Cloudflare's positioning is explicitly anti-lock-in.
  • Battle-tested internally at real scale. Thousands of Cloudflare employees, engineering through sales, daily. That is far better evidence than a launch demo.
  • It consolidates a tool sprawl you are probably already paying for. One platform can absorb several point AI tools, a chunk of internal-tools backlog, and the “custom GPT” deployments that have likely appeared organically.
  • The MCP Gatekeeper preserves prior investment. Existing MCP servers get wrapped, not rewritten — and gain logging, approvals, and scoping they never had.
  • The per-user model kills the internal-tools maintenance treadmill. Publish a Blueprint; forty teams fork it; nobody inherits a backlog.

The case against

  • Early access, and Cloudflare says so. v2 is a complete rewrite with “many rough edges.” You would be adopting a platform whose public life is measured in days.
  • New vendor, new perimeter, new expertise. Per the correction above, this is not free. Procurement, security review, DPA, IdP integration, and a team learning Workers and Durable Objects from zero.
  • Upstream will not take your patches. Anything not expressible as a custom Gatekeeper or a config setting becomes a permanent fork against a fast-moving upstream. This compounds.
  • Self-hosting is not ready. The workerd escape hatch that makes the Cloudflare dependency palatable is documented COMING SOON. Do not price it in.
  • Custom Gatekeepers are security-critical code. The valuable use cases all need them, and each one needs authentication-grade review. That is the real engineering cost, and it is recurring, not one-time.
  • Erasure is genuinely harder. Per-user instances mean learner data could land in thousands of separate SQLite databases. Your deletion pipeline has no way to enumerate them today. This is the risk I would rank first.
  • Divergence. Forty forks of the revenue dashboard produce forty numbers. Mitigable by architecture, not by hoping.
  • Adoption is a change-management project, not a deploy. The whole thesis depends on non-engineers building things. Cloudflare's culture is unusually technical; Coursera's distribution across sales, content, and support is different. This is the assumption most likely to be wrong.
  • Unbounded AI spend without discipline. AI Gateway gives you per-user and per-team budget enforcement — but only if configured on day one, not month three.

Scorecard

My assessment across the dimensions that should drive the decision. Higher is better for Coursera specifically.

Security architecture
9.2
Problem/solution fit
8.5
Strategic alignment
7.8
Licensing / ownership
9.0
Evidence it works at scale
7.5
Production readiness
4.2
Integration cost at Coursera
4.0
Maintenance burden
3.8
Vendor independence (today)
3.0
Learner-data / erasure readiness
2.5

The pattern is unambiguous: the design is excellent and the operational readiness is not. That combination has a standard answer — a bounded pilot that buys you optionality without betting anything, and a deliberate re-decision when the readiness scores move.

What it would replace — and what it would not

Plausibly replaces

  • Ad-hoc “custom GPT” deployments with pasted context
  • A meaningful slice of internal admin-tool backlog
  • Some point AI SaaS subscriptions
  • One-off scripts and notebooks that became load-bearing
  • Low-code internal apps built and then abandoned

Does not replace

  • Anything in the learner-facing product path
  • Your data warehouse or BI semantic layer
  • Salesforce, Workday, or any system of record
  • Engineering coding agents in the IDE
  • Canonical reporting — that must stay behind governed APIs

The Gatekeepers Coursera would have to build

This is where the engineering estimate lives. Each is security-critical code requiring authentication-grade review, and each needs a Phase 1 (API design + auth) and Phase 2 (approvals, caching, simulation, observers) pass. Sizing assumes one senior engineer familiar with the codebase, following the write-gatekeeper skill. Verify against your actual systems.

GatekeeperGranularity to exposePhase 1Phase 2Notes
Course catalogCourse → module → item; read + limited metadata write1–2 wk1–2 wkBest first custom Gatekeeper. Mostly non-PII, high value, clean resource hierarchy.
SalesforceAccount → opportunity → contact; writes queued2–3 wk2–3 wkCustomer PII. Simulation on opportunity updates is the tricky part.
Internal service APIsPer-service, per-endpoint capability objects2–4 wk2–3 wkScope tightly. One Gatekeeper per bounded context, not one “internal API” god-object.
Learner analytics / warehouseAggregate-only queries; enforce minimum cohort size3–4 wk3–4 wkHighest risk. Design so row-level learner data is not expressible through the API at all.
Support / ticketingTicket → conversation; learner lookup by ticket only2–3 wk2–3 wkLearner PII. Defer until erasure question is answered.
Company contextDocs, glossary, org conventionsUse gatekeeper-contextConfiguration, not code. Do this first.
The single most important design decision

For the analytics Gatekeeper, do not build “query the warehouse” and then try to restrict it. Build an API in which row-level learner data cannot be expressed — only aggregates above a minimum cohort size, only pre-defined dimensions. Capability-based security works by withholding objects, not by filtering results. If the API can return one learner's record, every downstream control is a mitigation rather than a guarantee.

This is the difference between a design your security team blesses in a week and one they argue about for a quarter.

A 90-day pilot

Designed to buy maximum information for minimum commitment, and to fail cheaply and visibly if it is going to fail.

Days 1–10 — Evaluate, decide nothing

pnpm run-local on two or three laptops. Run the five README prompts. Read workshop-shared/src/gatekeeper.ts and the write-gatekeeper skill. Deliverable: a one-page technical assessment and a go/no-go on proceeding to a hosted trial. Cost: ~1 engineer-week. No procurement, no vendor conversation.

Days 11–30 — Deploy behind Access, zero custom code

Starter repo, pinned release, Cloudflare Access wired to your IdP, workers.dev route. Enable only Google, GitHub, Slack, and gatekeeper-context. Load company context. AI Gateway on from day one with per-user budgets. No custom Gatekeepers. No learner data. No production systems. Invite 15–25 people across engineering, product, and one non-technical function.

Days 31–60 — Observe real usage

Do not evangelize. Measure: how many people build something in week one and are still using it in week four; what fraction of Gadgets are built by non-engineers; what breaks; how often approvals are batch-approved without inspection; what the AI spend per active user actually is. Ship the course catalog Gatekeeper (Phase 1 + 2) as the single custom integration — it is the cheapest real test of the model.

Days 61–90 — Security review and decide

Full review against the Module 5 threat table and the six questions in that module's reveal. Get written answers from Cloudflare on erasure and observation retention. Write the decision memo: expand, hold, or stop. Do not let this phase slip — an unended pilot becomes unowned production.

Pilot cost lineEstimate
Engineering — one senior owner, ~60% time for 90 days~0.6 FTE-quarter
Engineering — course catalog Gatekeeper (Phase 1 + 2)2–4 weeks, same person or a second
Security review~1–2 weeks of security-team time
Cloudflare platform spend (25 users, non-production)Low — Workers/DO/KV/R2 at this scale is noise
Model inferenceThe real variable. Cap it with AI Gateway budgets on day one; measure per-active-user cost as a pilot output.
Procurement / legal / DPAWhatever your standard new-vendor cycle costs
Kill criteria — agree these before you start

A pilot without predefined failure conditions becomes a permanent unfunded system. Stop if any of these are true at day 90:

  • Fewer than 40% of invited users built something they still used four weeks later.
  • Zero Gadgets of real value built by a non-engineer. This is the core thesis; if it does not hold at Coursera, nothing else matters.
  • The course catalog Gatekeeper took more than 6 weeks end to end. That is your cost multiplier for every future integration — extrapolate it before committing.
  • Security cannot get satisfactory answers on erasure and observation retention.
  • Upstream shipped breaking changes you could not absorb within the pilot window.
  • Per-active-user inference cost exceeds what an equivalent commercial seat would cost.

Eight questions to answer before committing beyond the pilot

#QuestionWhy it is decisive
1Can we answer a learner erasure request that touches Gadget storage?If no, learner data never enters the system. This gates half the value.
2Who owns this platform in 18 months, with what headcount?Unowned internal platforms decay into liabilities. Name the team before the pilot ends.
3Will non-engineers actually build things here?The entire thesis. Cloudflare's workforce is unusually technical; do not assume transfer.
4What is our fork policy?Upstream will not take patches. Decide now that customization happens via Gatekeepers and config only — or accept a permanent fork.
5How do we prevent divergence on canonical numbers?Architectural answer required: canonical data behind Gatekeepers, never in Gadget code.
6What is the AI spend ceiling and who enforces it?AI Gateway makes this solvable; not configuring it makes it a surprise.
7Does this replace anything we currently pay for?A consolidation story makes the business case; a pure addition makes it a cost.
8What is our exit if Cloudflare deprioritizes this?Apache 2.0 means you keep the code — but running it without Cloudflare needs workerd self-hosting, which does not ship yet.

Recommendation

Run the 90-day pilot. Do not commit beyond it yet.

Yes to a bounded pilot, scoped exactly as above: hosted-adjacent deployment behind Cloudflare Access, built-in Gatekeepers only plus one custom (course catalog), no learner PII, 15–25 users, hard stop at day 90 with a written decision.

No to an org-wide rollout in 2026. Production readiness, self-hosting, and erasure are all unresolved, and the contribution policy means every unmet need becomes your permanent fork. None of those are reasons to ignore this; all of them are reasons not to bet the internal tooling strategy on it this year.

The asymmetry is what makes this an easy call. Downside is roughly one engineer-quarter and a procurement cycle. Upside is arriving at 2027 with a working, governed, self-owned agent platform and a team that understands capability-based security — while peers are still deciding between Copilot Studio and a pile of MCP servers. Even if you never expand it, the Gatekeeper pattern is worth learning by building one.

What I would do regardless of the adopt decision

  1. Steal the async approval pattern. Any internal agent platform Coursera builds should queue side effects and simulate reads rather than blocking. This is the highest-value idea in the launch and it is free.
  2. Steal capability introduction. Stop configuring MCP servers with ambient access. Move to per-task resource introduction wherever you already run agents against internal systems.
  3. Adopt the “agent is a third principal type” framing. Not a user, not a service account — accountable to a human, with strictly narrower authority. Put it in your internal agent standards.
  4. Apply the observer question to what you already run. “If user A's agent read something and shares the output with user B, what stops the leak?” Ask this of every internal AI tool at Coursera today. Most will have no answer.

The two-minute version for your staff meeting

Exec summary

Cloudflare open-sourced the AI workspace it runs internally — agents plus user-built apps plus a security layer that scopes what agents can touch and queues their writes for human approval without making the agent wait. The security design is better than anything commercially available: agents start with zero access and are introduced to one resource at a time, and sharing an app is blocked unless the recipient could have read the underlying data themselves.

It is early-access software, it requires a Cloudflare account we do not currently have, and the self-hosting option is not finished. Three of the questions that would gate learner-data use are unanswered.

Recommendation: a 90-day, 25-person pilot with no learner data and one custom integration, costing about an engineer-quarter, with predefined kill criteria and a written decision at day 90. We learn whether non-engineers here will really build their own tools, and we get a concrete cost figure for integrating our systems — both of which we need regardless of which agent platform we eventually standardize on.

Check yourself

What is the strongest argument against my own recommendation?

That the pilot is a distraction with a foregone conclusion.

The argument goes: the readiness scores are so low that no 90-day pilot will move them. Self-hosting will not ship by then. Erasure will not be answered by then. The contribution policy will not change. So you will arrive at day 90 with exactly the information you have now, minus an engineer-quarter, plus a group of 25 people who liked a tool you then take away — which has a real morale cost and makes the next platform rollout harder.

It is a serious argument and I would not dismiss it. Two things answer it. First, the two facts the pilot actually produces are not knowable from outside: whether non-engineers at Coursera will build their own tools, and what a custom Gatekeeper genuinely costs you to build and review. Both are decision-relevant for any agent platform you eventually choose, including one you build yourself. Second, the taking-it-away cost is manageable if you say at the start that it is a time-boxed evaluation — and unmanageable if you let it drift into unowned production, which is exactly what the hard stop and kill criteria exist to prevent.

If you cannot commit to the day-90 decision and the kill criteria, the counterargument wins and you should not start.

8

Competitive Landscape

Almost everything in this category is a chat interface with connectors, or an app builder with AI bolted on. Cloudflare OS is the only one where the distribution model and the permission model are the product. That is either a decisive advantage or an unnecessary complication, depending on what you are actually trying to do.

The field

ContenderCore modelWhere it winsWhere it loses to Cloudflare OS
Retool + AI Centrally built internal apps over shared connections Mature, polished, huge connector library, real RBAC, teams already know it One shared multi-tenant app per tool. End users cannot modify. Connections are broad and ambient. Per-seat cost. Someone owns every app forever.
Custom ChatGPT / Claude deployments Chat with company context + connectors/MCP Zero infrastructure, best-in-class models, instant adoption, people already use them Produces text, not running software. Ambient connector access. No approval queue, no observation tracking, no answer to the shared-output leak question.
Microsoft Copilot Studio Agent builder inside the Microsoft estate Deep M365/Graph integration, enterprise identity and compliance, single vendor Closed. Locked to Microsoft's estate. Agents share tenant-wide permissions. You do not own what you build.
Google Workspace AI (Gemini) AI inside the productivity suite Frictionless where Workspace already is; no rollout needed Assists with documents; does not produce applications. No capability model, no custom system integration story.
Glean and enterprise search/assistant tools Indexed company knowledge + assistant Excellent retrieval; permission-aware search is genuinely good Read-oriented. Does not build tools or take governed actions. Complementary rather than competing.
Plain MCP + a coding agent DIY: MCP servers plus Claude Code or similar Free, flexible, uses tools engineers already have, no new platform Engineers only. Ambient access. Synchronous approvals that get disabled. No sharing model, no observation tracking, nothing for non-engineers.
Build it yourself An internal agent platform Exactly your needs; no vendor You would be rebuilding sandboxing, capability RPC, approval queues, and observer verification. Cloudflare OS is a credible head start even if you fork it heavily.

The two axes that actually separate them

Axis 1 — who runs the instance

Everyone else: one instance, many users, permissions enforced inside the app. Cloudflare OS: one instance per user, isolation enforced by the platform. This is what makes end-user modification safe, and it is not a feature others can add incrementally — it is an architectural commitment.

Axis 2 — how the agent gets authority

Everyone else: configure connectors up front, agent has ambient access to everything connected. Cloudflare OS: agent starts with nothing and is introduced to one resource per task. This is the difference between a prompt injection reaching your whole estate and reaching one document.

The capability nobody else has

Observer verification. Across all the alternatives above, ask: if my agent reads something sensitive and I share the resulting artifact with a colleague who lacks access, what stops the leak?

The answers range from “nothing” to “a policy.” Cloudflare OS is the only one where the source system itself adjudicates, per collaborator, against a recorded history of what was actually read — and blocks future reads that any registered observer could not make directly. For a company handling learner data across multiple regulatory regimes, that is the differentiator that matters more than any productivity claim.

Honest positioning

Cloudflare OS wins when you need non-engineers building real tools against sensitive internal systems, and you have to defend that to a security team. That is a narrow but valuable slot, and it happens to describe Coursera's situation well.

It loses when you need something today, when your estate is deeply Microsoft or Google and single-vendor integration outweighs everything, when your use case is retrieval rather than action, or when your users are engineers who are perfectly happy with an IDE agent and a few MCP servers.

What would have to be true for this to win the category
  1. workerd self-hosting ships and is genuinely supported — this converts the biggest objection into the biggest advantage.
  2. The Gatekeeper ecosystem grows beyond Cloudflare's own repo, so companies are not writing every integration themselves.
  3. The contribution policy relaxes, or a healthy ecosystem forms around it that does not require upstream merges.
  4. The per-user-instance model proves it scales organizationally, not just technically — divergence being managed in practice, not just in principle.

Watch item 1 most closely. It is the one that changes the recommendation in Module 7.

Check yourself

🃏 Flashcards

Your Action List & Sources

Ten things to do, in order

  1. Run it locally today. pnpm run-local, then the tic-tac-toe prompt. Fifteen minutes, no commitment, and you will understand the architecture better than any writeup can convey.
  2. Confirm the CloudFront finding with your infrastructure team before quoting the vendor-cost argument either way.
  3. Read workshop-shared/src/gatekeeper.ts and the write-gatekeeper skill. Roughly an hour, and it is the clearest articulation of capability-based agent security currently in public.
  4. Ask the observer question of every AI tool Coursera runs today. If user A's agent reads something restricted and shares the output with user B, what stops the leak? Collect the answers — that inventory is valuable on its own.
  5. Get written answers on erasure and observation retention before any pilot touches production learner data.
  6. Name the owner. One senior engineer, ~60% time, for 90 days. If you cannot name them, do not start.
  7. Agree the kill criteria in writing with whoever approves the pilot.
  8. Turn on AI Gateway budgets on day one, per user and per team. Not month three.
  9. Adopt the async-approval pattern in your own agent work regardless. Queue side effects, simulate reads. It is the best idea in this launch and it costs nothing to steal.
  10. Put the day-90 decision on the calendar now, with the memo as a named deliverable.

Primary sources

Shelf life

This course documents a project that is days old and explicitly labeled early access. Repository structure, package lists, and setup commands will drift. The architectural ideas — capability introduction, async approval via simulation, observer verification, per-user instances — will not. Re-check the repo before acting on any specific command in Module 6.

Cloudflare OS — The Open-Source AI Operating System for Companies

Built for Mustafa Furniturewala · August 5, 2026 · Sourced from the cloudflare/cloudflare-os repository and launch materials

Need this for a date?

Turn this course into a ramp-up pack sized to your minutes per day, or build an interview or certification pack for the day you need it.