The Dark Side of EmDash: Why Self-Hosting Means Losing Its Killer Feature

Self-hosting EmDash removes the plugin sandbox, its core security feature, leaving you with an architecture identical to WordPress.

By Central
EmDash's plugin sandbox only works on Cloudflare's runtime, not on self-hosted servers.
Highlights
  • 96% of all WordPress security vulnerabilities come from plugins, a problem EmDash aims to solve.
  • Self-hosted EmDash runs plugins in-process, with no sandbox or isolation, mirroring WordPress's security model.
  • The sandbox only activates on Cloudflare's Workers Paid Plan, starting at $5 per month.

Everyone says the same thing about EmDash: it’s open source, MIT-licensed, and you can run it anywhere — your own server, AWS, a Raspberry Pi. “Not locked in.” That’s the pitch. You hear it from Cloudflare’s own blog, from early adopters, from every Hacker News comment that wants to sound reasonable.

They’re technically right. The code is on GitHub. You can npm create emdash-latestcodecodecodecodecode and deploy to any Node.js host. But here’s what nobody tells you in those glowing first impressions: the one feature that justifies EmDash’s existence — the plugin sandbox — vanishes the moment you leave Cloudflare’s runtime. Self-hosting EmDash is like buying a bulletproof car and removing the armor before you drive it.

Self-hosting EmDash is like buying a bulletproof car and removing the armor before you drive it.

Let’s be specific about what you lose.

The Plugin Sandbox Is Not Optional — It’s the Product

Cloudflare built EmDash to solve a single, well-documented problem. 96% of all WordPress security vulnerabilities come from plugins. In 2025 alone, researchers disclosed 11,334 new WordPress vulnerabilities — a 42% increase from the year before. Nearly half were exploitable without any authentication. The root cause isn’t bad plugin code; it’s the architecture. Every WordPress plugin runs in the same process as the core, with full access to the database, file system, and user sessions. Install a contact form plugin with a bug, and an attacker can read your entire database.

EmDash’s answer: every plugin runs in its own V8 isolate, a lightweight sandboxed environment that cannot touch anything unless a capability manifest explicitly grants it. A plugin that declares read contentcodecodecodecodecode and send emailcodecodecodecodecode can literally do nothing else — no database queries, no file system access, no unrestricted network calls. This isn’t policy; it’s architectural enforcement via dynamic workers.

That’s the killer feature. That’s the reason to switch from WordPress.

Now read the fine print.

Self-Hosted EmDash: No Sandbox, No Isolation

The EmDash documentation is honest about this. When you self-host on a regular Node.js server, plugins run in-process — the same model WordPress uses. No V8 isolate, no capability manifest enforcement, no sandbox. The plugin has full access to your database, your file system, your user data. Exactly the problem EmDash was supposed to fix.

Cloudflare’s lead engineer Matt Cain confirmed this in a podcast interview: “For the kind of plugins that very often end up having the biggest blast area in taking down your entire site, this does solve the vast majority of those kind of problems.” But he was talking about the sandboxed environment that only runs on Cloudflare’s runtime.

Even on Cloudflare’s free tier, plugins run in “in-process mode” — no real isolation. The sandbox only activates when you’re on the Workers Paid Plan, which starts at $5/month and requires dynamic workers. Without that, you’re running a brand-new CMS with zero plugins and no security advantage over WordPress.

So the common advice — “self-host to avoid vendor lock-in” — ignores a critical trade-off: you’re trading Cloudflare lock-in for a fundamentally less secure product.

The Architecture That Makes the Sandbox Possible Is Proprietary

Dynamic workers are not a standard Node.js feature. They’re a Cloudflare-specific product that runs on V8 isolates across Cloudflare’s 300+ data centers. The isolation model uses Linux namespaces, seccomp filters, and hardware memory protection keys — none of which exist in a typical Node.js deployment.

When you self-host, you get none of that. The code that makes the sandbox work is open source, but the runtime that enforces it is not. Cloudflare’s own blog post admits: “Plugins run in their own isolated container called a dynamic worker.” That container is a Cloudflare Workers feature, not something you can replicate on a $5 VPS.

One widely upvoted Hacker News comment put it bluntly: “Open source, but architecturally locked in.” WordPress runs on any server with PHP and MySQL; you can switch hosting providers in an afternoon. EmDash’s data is portable — D1 is SQLite-based, R2 is S3-compatible — but the security model isn’t. The feature that justifies EmDash’s existence requires Cloudflare’s paid infrastructure.

What You Actually Get on a Self-Hosted Instance

Let’s walk through what a self-hosted EmDash installation looks like today.

  • Zero sandboxed plugins. The only way to run plugins with isolation is via dynamic workers on Cloudflare’s paid plan. Without that, plugins are just Node.js scripts with full system access.
  • No performance advantage. The V8 isolate cold-start time is sub-5 milliseconds on Cloudflare’s edge. On a Node.js server, you’re dealing with process-level overhead and no auto-scaling to zero.
  • No AI agent integration. The built-in MCP server and agent skills still work, but the ability to let AI generate and run code safely depends on dynamic workers. Without them, you’re back to trusting AI-generated scripts with full access to your database.
  • No unlimited storage. EmDash on Cloudflare uses R2 with zero egress fees. Self-hosted, you’re paying for blob storage and bandwidth like any other CMS.

The value proposition collapses. You get a UI that looks like WordPress, a block editor, and a few built-in features like SEO and custom content types — but the core architectural innovation is gone.

Why the “Self-Host Anywhere” Advice Is Dangerous

The most common rebuttal from EmDash advocates is: “But you can self-host on any Node.js server!” That’s true in the narrowest sense — the code runs. But it ignores the context of why you’d choose EmDash in the first place.

If you’re running a simple blog and don’t need plugins, WordPress on a $5 VPS works fine. If you need a modern TypeScript stack, there are dozens of headless CMS options. The only reason to pick EmDash over those alternatives is the sandboxed plugin architecture. Remove that, and you’re left with a beta-quality CMS that has fewer features, fewer plugins, and a smaller community than WordPress.

Consider the migration path. EmDash’s WordPress import tool brings over posts, pages, and media — but not plugins, themes, or custom functionality. If you self-host EmDash and need any non-trivial feature (e-commerce, advanced forms, membership systems), you have to build it from scratch or install an in-process plugin that defeats the entire security model. At that point, you might as well have stayed on WordPress.

The Billing Nightmare Is Real — Even on Cloudflare

Self-hosting advocates also point to unpredictable Cloudflare billing as a reason to avoid the paid plan. They’re not wrong. The serverless model means every page view, admin panel click, and API call triggers a worker invocation. A small DDoS attack can rack up $13,000 in a single night — and there is no built-in spending cap. That’s a legitimate concern.

But the solution isn’t to self-host and lose the sandbox. The solution is to understand that EmDash, in its current form, is not a WordPress replacement for most users. It’s a developer preview of a new security model that only works on Cloudflare’s infrastructure. Self-hosting it is like buying a sports car and removing the engine — you still have wheels and a chassis, but the whole point is gone.

The Honest Assessment

The “self-host anywhere” advice is incomplete. It frames the choice as freedom versus lock-in, but the real choice is between a secure architecture and an insecure one. EmDash without the sandbox is not “EmDash on your own terms” — it’s a crippled version of a product that hasn’t even reached version 1.0.

Cloudflare has been transparent about this. The README says “EmDash works best on Cloudflare” and notes that sandboxed plugins require dynamic workers. But the marketing language — “spiritual successor to WordPress,” “open source, MIT licensed” — creates an expectation that the full feature set is portable. It isn’t.

If you’re a developer experimenting with new CMS architectures, by all means, self-host EmDash and kick the tires. But if you’re a business owner, an agency building client sites, or anyone who needs a production-ready CMS, self-hosting EmDash today means accepting a security model that is architecturally identical to WordPress — without the ecosystem, the battle-testing, or the 20 years of community contributions.

The real question isn’t “Can I self-host EmDash?” It’s “Why would I, when the only thing that makes it special requires a Cloudflare account?”

Questions answered
  • What is EmDash's killer feature?EmDash's killer feature is its plugin sandbox, which runs each plugin in a V8 isolate with restricted capabilities.
  • Does self-hosting EmDash preserve the sandbox?No, self-hosting EmDash on a regular Node.js server runs plugins in-process without any sandbox or isolation.
  • Why is the sandbox important?The sandbox prevents plugins from accessing the database, file system, or user data unless explicitly granted, solving the root cause of most WordPress vulnerabilities.
Share This Article