Cloudflare's EmDash: Plugin Sandboxing, Agent Payments, and the Vercel Playbook

Cloudflare just launched a CMS. Not a plugin, not a hosting product — a full content management system they’re calling “the spiritual successor to WordPress.”

They named it EmDash. The em dash. The punctuation mark LLMs can’t stop using. Which is fitting, because they claim the entire thing was built by AI coding agents.

The tech is interesting. The business play behind it is more interesting. Here’s what’s going on.

The WordPress Problem

WordPress powers over 40% of the internet. It’s been around since 2003 — over two decades. It works. So why does Cloudflare think it needs replacing?

Plugins.

96% of WordPress security issues originate in plugins. 2025 had more high-severity WP vulnerabilities than the previous two years combined.

This isn’t a bug count problem — it’s architectural. A WordPress plugin is a PHP script that runs in the same process as WordPress itself. It has full access to the database, the filesystem, everything. Installing a plugin means trusting it with your entire site.

The $wpdb global object gives any plugin arbitrary SQL access to the same MySQL database that stores your posts, users, and passwords. A plugin can read wp-config.php (which contains database credentials). It can hook into any action or filter and modify the behavior of WordPress core or other plugins.

This can’t be fixed without breaking every existing plugin. The hook system that makes WordPress extensible IS the security problem. Every attempt to fix WP security has been policy-based — reviews, allowlists, scanning — rather than architectural. WordPress.org manually reviews plugins with 4,800+ in the queue as of March 2026, with 86% waiting longer than a week.

EmDash’s Plugin Sandboxing

This is the headline feature and it’s genuinely clever.

Each plugin runs in its own V8 isolate — the same isolation technology that powers Cloudflare Workers. Two isolates cannot access each other’s memory. They’re isolated at the engine level, not just the process level.

Plugins use a capabilities-based security model. They declare upfront what they need:

import { definePlugin } from "emdash";

export default () =>
  definePlugin({
    id: "notify-on-publish",
    version: "1.0.0",
    capabilities: ["read:content", "email:send"],
    hooks: {
      "content:afterSave": async (event, ctx) => {
        if (event.collection !== "posts" ||
            event.content.status !== "published") return;
        await ctx.email!.send({
          to: "editors@example.com",
          subject: `New post published: ${event.content.title}`,
          text: `"${event.content.title}" is now live.`,
        });
      },
    },
  });

This plugin physically cannot access the filesystem, make network requests, or touch the database. It declared two capabilities — read content and send email — and that’s all it gets. The API surface for undeclared capabilities doesn’t exist in the plugin’s isolate. A plugin without network:external can’t call fetch because fetch isn’t there.

This isn’t like mobile app permissions where you’re trusting the OS to enforce policy. The runtime literally doesn’t provide the bindings.

The implication: because plugins are sandboxed, you don’t need a centralized marketplace to trust them. Read the manifest and you know what a plugin can do. The sandbox enforces it. Any plugin with read:content and network:external could theoretically exfiltrate content — but you’d see both capabilities declared and could make that call yourself. It can’t silently steal database credentials.

Under the hood, this runs on Cloudflare’s Dynamic Workers — a new primitive that lets applications deploy code at runtime into V8 isolates. Unlike containers (seconds to start, 50-200MB overhead), isolates start in ~5ms with ~5MB of memory. EmDash is the first major dogfood of this technology.

x402: Agent Payments

HTTP 402 “Payment Required” has been in the spec since HTTP/1.1 in 1997 — almost 30 years, reserved “for future use.” Coinbase built the x402 protocol to actually use it, and Cloudflare is one of its biggest adopters — they co-founded the x402 Foundation with Coinbase and baked it directly into EmDash.

The flow: an AI agent sends a GET request. The server responds with 402 and payment details — price, accepted methods, wallet address. The agent pays via crypto (likely stablecoins on L2 networks where transaction costs are fractions of a cent), retries with a payment proof header, and gets the content.

Every EmDash site gets this built in. Configure what costs money, provide a wallet address, done.

The reasoning: the ad-supported web breaks when there’s no human eyeball. When an AI agent browses on behalf of a user, there’s nobody to show an ad to. x402 is the answer — microtransactions for content, native to HTTP.

The Hacker News thread was immediate: “brb setting up a honeypot that responds 402 demanding 10 cents per visit.” Valid concern — agent wallets would need spending limits and price-reasonableness checks.

This is forward-thinking but speculative. It depends on agents having wallets and spending budgets, which doesn’t exist at scale. The chicken-and-egg problem is real — agents need wallets for x402 to work, wallets need x402 sites to be useful.

Built by Agents

Cloudflare claims they rebuilt WordPress from scratch using AI coding agents over two months. The Hacker News thread was skeptical.

I think the stability question is framed wrong. The issue isn’t whether agents can write correct code — they can, and pretty reliably now. The issue is whether there’s a human who understands the codebase enough to debug it at 2am.

I run parallel coding agents on my own projects daily. The code they produce is fine. What worries me is the “just ship it” energy where nobody on the team deeply understands what got built. That’s not an AI problem — it’s been a problem with outsourced codebases forever. AI just makes it faster to accumulate code nobody fully groks.

Cloudflare probably has the engineering depth to maintain this regardless of how it was built. A lot of other teams copying this pattern won’t.

The name is the cherry on top. The em dash is the most stereotypical marker of LLM-generated text. Naming your “built by agents” CMS after the punctuation agents overuse is either brilliant self-awareness or an accidental tell. The HN consensus: “that’s the joke.”

The Real Play

Here’s what nobody’s saying out loud: EmDash is a CMS that runs best on Cloudflare infrastructure.

Workers for compute, D1 for database, R2 for storage, Dynamic Workers for plugins. It’s the same play as Next.js and Vercel — the company behind Next.js became Vercel, and the framework runs best on their platform.

LayerCloudflarePortable Alternative
ComputeWorkersNode.js (slower cold starts)
DatabaseD1SQLite, PostgreSQL, or Turso
StorageR2S3-compatible (extra cost)
Plugin IsolationDynamic WorkersNone (all plugins run trusted)

Each layer works elsewhere but is degraded — and the plugin sandboxing doesn’t degrade, it disappears entirely. I checked the source: on Node.js there’s a NoopSandboxRunner that throws an error saying “sandboxed plugins require Cloudflare Workers.” Not weaker isolation — zero isolation. All plugins run in trusted mode. On any other host, it’s a TypeScript CMS without its security model.

MIT licensed, not GPL like WordPress, because no WP code was used. Cleanroom rebuild. Open source, but architecturally locked in.

Will It Matter?

WordPress isn’t dying. 40% of the internet doesn’t just switch. People aren’t on WordPress because of WordPress — they’re on it because of WooCommerce, tens of thousands of themes, and integrations for every internal business API on the planet.

But EmDash doesn’t need to kill WordPress. It needs to capture the next generation of CMS users. The ones who’d pick Astro over PHP. Who deploy to Workers, not shared hosting. Who think in TypeScript, not functions.php.

The plugin sandboxing is genuinely novel and solves a real problem. The vendor lock-in is real and worth being clear-eyed about. The “built by agents” claim is the most controversial part and probably the least important — the code works or it doesn’t, regardless of who wrote it.

Previous “WordPress killers” — Ghost, Strapi, Contentful, Sanity, Payload — all found niches but never dented WordPress’s market share. EmDash will probably follow the same trajectory, unless the plugin ecosystem grows fast enough to hit escape velocity.

The best CMS is the one your team actually maintains. If that’s WordPress, keep using it. If you’re starting fresh and already on Cloudflare, EmDash is worth watching. The signal to track isn’t download counts — it’s whether the plugin ecosystem materializes.

← Back to writing