EmDash’s Single Point of Failure: Why You Can’t Run Sandboxed Plugins Outside Cloudflare

Cloudflare's EmDash CMS promises secure sandboxed plugins, but only within its paid ecosystem, leaving self-hosted users exposed.

By Central
EmDash's plugin sandbox relies on Cloudflare's proprietary runtime, unavailable outside their infrastructure.
Highlights
  • EmDash's sandboxed plugins run in V8 isolates with hardware memory protection, but only on Cloudflare's paid plans.
  • Self-hosted EmDash on Node.js runs plugins in-process, eliminating all isolation and security guarantees.
  • Cloudflare's proprietary Workers runtime is not replicated by any other hosting provider or open-source project.

Cloudflare’s EmDash CMS promises a revolution: plugins locked in isolated V8 sandboxes, ending the 96% of WordPress vulnerabilities that originate from plugins. It’s a brilliant pitch. But there’s a catch buried in the fine print — one that makes the entire security model conditional on remaining inside Cloudflare’s paid ecosystem. If you self-host EmDash on a standard Node.js server, the sandbox disappears. Plugins run in-process. No isolation. No permission manifest enforced. You get the same architectural risk as WordPress, but with zero plugins and a brand-new CMS.

This isn’t a minor limitation. It’s the defining weakness of EmDash’s architecture — a single point of failure that forces a vendor lock-in for the feature that justifies the product’s existence. And the company’s response so far has been silence on a fix.

This isn’t a minor limitation. It’s the defining weakness of EmDash’s architecture — a single point of failure that forces a vendor lock-in for the feature that justifies the product’s existence.

The Architecture That Makes Sandboxing Possible

To understand why EmDash can’t sandbox plugins outside Cloudflare, you need to understand the underlying technology. Every plugin in EmDash runs inside a V8 isolate — a lightweight, hardware-isolated execution context that Cloudflare calls a dynamic worker. When a plugin triggers, the isolate spins up in milliseconds, executes the code, and disappears. It has no direct access to the database, file system, or network. Instead, the plugin declares a capability manifest — read content, send email — and the runtime enforces that boundary down to the hardware memory protection level.

This works because Cloudflare’s Workers runtime is built on V8 isolates combined with Linux namespaces, seccomp filters, and hardware memory protection keys. That stack is proprietary to Cloudflare. No other hosting provider replicates it. No open-source equivalent exists. When you deploy EmDash to a Cloudflare paid plan, you get the full sandbox. When you run it locally with npm create m-dash-latestcodecodecodecode and choose Node.js, plugins execute in the same process as the CMS core. One vulnerable plugin can read your entire SQLite database, modify files, or exfiltrate data.

The code on GitHub is MIT-licensed. The runtime that makes it secure is not.

The Counterargument — and Why It Collapses

The strongest defense Cloudflare could offer is: “EmDash is open source. You can run it anywhere. The sandbox is an optional feature of our paid infrastructure. That’s a trade-off, not a flaw.”

That sounds reasonable until you examine what “running it anywhere” actually means without the sandbox. On a self-hosted Node.js server, EmDash has no plugin ecosystem — it launched with zero third-party plugins. The entire value proposition over WordPress is the security model. Remove that, and you’re left with a v0.1 CMS written in TypeScript that has fewer features than WordPress had in 2005. The content editor is basic. Custom post types exist but must be created through the admin UI, not defined in code — a regression for developers who want schema-as-code. The theme system uses Astro, which is modern, but there are no pre-built themes beyond three starter templates.

In other words, the sandbox isn’t a “nice-to-have” feature. It’s the product. Without it, EmDash is an unfinished experiment that competes poorly against established alternatives like Ghost, Payload CMS, or even a plain Astro site with a headless CMS.

Cloudflare could have designed the sandbox to work with any Node.js runtime using a library like isolated-vmcodecodecodecode or vm2codecodecodecode. They chose not to. That’s not a trade-off; it’s a deliberate architectural lock-in.

The Billing Trap: Serverless Surprise

The lock-in doesn’t stop at features. EmDash’s serverless pricing model on Cloudflare introduces a financial single point of failure. Each page view triggers multiple Cloudflare services: a Workers invocation, a D1 database read, an R2 storage check, and possibly a KV lookup. Each service meters separately. Workers cost $0.30 per million requests after the first 10 million. D1 charges per row read. R2 charges per operation.

A small business owner migrating from fixed-price WordPress hosting ($20/month) to EmDash on Cloudflare faces unpredictable bills. One documented scenario on the Cloudflare forum calculated that a basic DDoS attack — 10,000 IPs, one request per second each — could rack up 26 billion billable requests in a month. At Workers pricing, that’s roughly $7,800 before CPU time. Add D1 and R2 charges, and you’re past $13,000. Cloudflare does not offer a global spending cap. There is no kill switch. The site keeps running, and the credit card keeps charging.

WordPress hosting has its own costs — managed plans at $50–$100/month, plus plugin subscriptions. But those are predictable. You know exactly what you’ll pay. EmDash’s serverless architecture inverts that certainty. For a CMS targeting bloggers and small publishers, this is a risk most won’t understand until they get the invoice.

Why the Plugin Ecosystem Won’t Save It

WordPress’s 62,000 plugins are not just a feature — they’re the economic engine. Agencies, freelancers, and hosting companies built businesses around WooCommerce, Elementor, Yoast, and thousands of others. EmDash launched with zero third-party plugins. The MCP server and AI agent integration are clever, but they don’t replace a mature ecosystem. A business that needs e-commerce, a membership system, and a contact form can install WordPress plugins in an afternoon. On EmDash, that’s weeks of custom development — assuming the functionality exists at all.

The MIT license removes GPL friction, which could attract commercial developers. But developers need users, and users need plugins. That chicken-and-egg problem has killed every WordPress competitor in the last decade. Ghost, Craft CMS, Statamic — all technically superior in some dimension, all stuck below 1% market share. EmDash is not special enough to break that pattern.

The 10195 Wall

When you try to deploy EmDash on Cloudflare’s free tier, you hit error code 10195: “Dynamic workers require the Workers Paid plan.” That’s the moment the marketing promise collides with reality. The sandbox — the headline feature — demands $5/month minimum. On the free tier, plugins run in-process with no isolation. On self-hosted Node.js, same story. So the “spiritual successor to WordPress” only works as advertised when you pay Cloudflare monthly.

This is not unusual for open-source infrastructure plays. Vercel’s Next.js has lock-in around its edge functions. Netlify’s deploy previews are proprietary. But those platforms don’t market themselves as replacements for a 24-year-old open-source CMS. They’re upfront about being hosted services. Cloudflare is positioning EmDash as “like WordPress but secure.” The reality is “like WordPress but only secure if you use our paid platform.”

What Cloudflare Should Have Done

The honest approach would have been to make the sandbox runtime available as an open-source library. Cloudflare could have built a V8 isolate manager that any hosting provider could run — similar to how Fly Machines or AWS Lambda SnapStart work. That would have decoupled the security model from the vendor. Hosting companies like WP Engine, Kinsta, or even small VPS providers could offer EmDash with full sandboxing. The ecosystem would grow faster. The billing model could remain serverless on Cloudflare’s own infrastructure, but the product wouldn’t be crippled elsewhere.

Instead, Cloudflare chose to keep the sandbox proprietary. That’s a business decision, not a technical limitation. And it’s the reason EmDash will struggle to gain traction beyond developers who already use Cloudflare for everything.

The One Scenario Where This Advice Fails

There is one use case where EmDash’s lock-in doesn’t matter: a developer building a single personal blog or a small marketing site who already uses Cloudflare for DNS and CDN, and is comfortable with serverless billing. For that user, EmDash’s sandbox is a genuine improvement over WordPress’s plugin security. The $5/month cost is trivial. The risk of a surprise bill from a DDoS is real but low for a low-traffic site. And the AI-native features — MCP server, agent skills — are ahead of anything WordPress offers today.

But that niche is tiny. Most people who need a CMS are not Cloudflare power users. They are small business owners, freelancers, and agencies who want a predictable bill, a large plugin ecosystem, and the ability to move hosts without rewriting their entire stack. EmDash fails all three requirements. For them, WordPress — for all its flaws — remains the safer bet.

Questions answered
  • Why can't EmDash sandbox plugins outside Cloudflare?EmDash relies on Cloudflare's proprietary Workers runtime, which uses V8 isolates, Linux namespaces, and hardware memory protection. This stack is not available elsewhere.
  • What happens when you self-host EmDash on Node.js?Plugins run in the same process as the CMS core, with no isolation. A vulnerable plugin can access the database, files, and network.
  • Is EmDash open source?Yes, the code is MIT-licensed on GitHub, but the secure runtime that enables sandboxing is proprietary to Cloudflare.
Share This Article