{"id":98047,"date":"2026-10-08T17:26:00","date_gmt":"2026-10-08T21:26:00","guid":{"rendered":"https:\/\/overcentral.com\/en\/?p=98047"},"modified":"2026-09-29T07:59:24","modified_gmt":"2026-09-29T11:59:24","slug":"emdash-sandbox-lock-in-cloudflare-98047","status":"publish","type":"post","link":"https:\/\/overcentral.com\/en\/emdash-sandbox-lock-in-cloudflare-98047\/","title":{"rendered":"EmDash\u2019s Single Point of Failure: Why You Can\u2019t Run Sandboxed Plugins Outside Cloudflare"},"content":{"rendered":"<p>Cloudflare\u2019s EmDash CMS promises a revolution: plugins locked in isolated V8 sandboxes, ending the 96% of WordPress vulnerabilities that originate from plugins. It\u2019s a brilliant pitch. But there\u2019s a catch buried in the fine print \u2014 one that makes the entire security model conditional on remaining inside Cloudflare\u2019s 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.<\/p>\n<p>This isn\u2019t a minor limitation. It\u2019s the defining weakness of EmDash\u2019s architecture \u2014 a single point of failure that forces a vendor lock-in for the feature that justifies the product\u2019s existence. And the company\u2019s response so far has been silence on a fix.<\/p>\n<h2>The Architecture That Makes Sandboxing Possible<\/h2>\n<p>To understand why EmDash can\u2019t sandbox plugins outside <a href=\"https:\/\/www.cloudflare.com\" target=\"_blank\" rel=\"noopener noreferrer\" data-iacss-external=\"1\">Cloudflare<\/a>, you need to understand the underlying technology. Every plugin in EmDash runs inside a <strong>V8 isolate<\/strong> \u2014 a lightweight, hardware-isolated execution context that Cloudflare calls a <strong>dynamic worker<\/strong>. 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 \u2014 read content, send email \u2014 and the runtime enforces that boundary down to the hardware memory protection level.<\/p>\n<p>This works because Cloudflare\u2019s 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. <a href=\"https:\/\/overcentral.com\/en\/eu-cra-reporting-requirements-80362\/\" title=\"EU CRA Demands What Shipped and When You Knew\" data-iacss-internal=\"1\">When you<\/a> deploy EmDash to a Cloudflare paid plan, you get the full sandbox. When you run it locally with <code>npm create m-dash-latest<\/code>codecodecodecode 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.<\/p>\n<p>The code on GitHub is MIT-licensed. The runtime that makes it secure is not.<\/p>\n<h2>The Counterargument \u2014 and Why It Collapses<\/h2>\n<p>The strongest defense Cloudflare could offer is: <em>\u201cEmDash is open source. You can run it anywhere. The sandbox is an optional feature of our paid infrastructure. That\u2019s a trade-off, not a flaw.\u201d<\/em><\/p>\n<p>That sounds reasonable until you examine what \u201crunning it anywhere\u201d actually means without the sandbox. On a self-hosted Node.js server, EmDash has no plugin ecosystem \u2014 it launched with zero third-party plugins. The entire value proposition over WordPress is the security model. Remove that, and you\u2019re 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 \u2014 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.<\/p>\n<p>In other words, the sandbox isn\u2019t a \u201cnice-to-have\u201d feature. It\u2019s 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.<\/p>\n<p>Cloudflare could have designed the sandbox to work with any Node.js runtime using a library like <code>isolated-vm<\/code>codecodecodecode or <code>vm2<\/code>codecodecodecode. They chose not to. That\u2019s not a trade-off; it\u2019s a deliberate architectural lock-in.<\/p>\n<h2>The Billing Trap: Serverless Surprise<\/h2>\n<p>The lock-in doesn\u2019t stop at features. EmDash\u2019s 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.<\/p>\n<p>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 \u2014 10,000 IPs, one request <a href=\"https:\/\/overcentral.com\/en\/meta-launches-zgateway-proxy-handles-1-billion-ops-per-second\/\" title=\"Meta Launches ZGateway Proxy, Handles 1 Billion Ops Per Second\" data-iacss-internal=\"1\">per second<\/a> each \u2014 could rack up 26 billion billable requests in a month. At Workers pricing, that\u2019s roughly $7,800 before CPU time. Add D1 and R2 charges, and you\u2019re 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.<\/p>\n<p>WordPress hosting has its own costs \u2014 managed plans at $50\u2013$100\/month, plus plugin subscriptions. But those are predictable. You know exactly what you\u2019ll pay. EmDash\u2019s serverless architecture inverts that certainty. For a CMS targeting bloggers and small publishers, this is a risk most won\u2019t understand until they get the invoice.<\/p>\n<h2>Why the Plugin Ecosystem Won\u2019t Save It<\/h2>\n<p>WordPress\u2019s 62,000 plugins are not just a feature \u2014 they\u2019re 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 <a href=\"https:\/\/overcentral.com\/en\/meta-muse-ai-agent-80441\/\" title=\"Meta Launches Muse AI Agent, Needs User Trust\" data-iacss-internal=\"1\">AI agent<\/a> integration are clever, but they don\u2019t 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\u2019s weeks of custom development \u2014 assuming the functionality exists at all.<\/p>\n<p>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 \u2014 all technically superior in some dimension, all stuck below 1% market share. EmDash is not special enough to break that pattern.<\/p>\n<h2>The 10195 Wall<\/h2>\n<p>When you try to deploy EmDash on Cloudflare\u2019s free tier, you hit error code <strong>10195<\/strong>: \u201cDynamic workers require the Workers Paid plan.\u201d That\u2019s the moment the marketing promise collides with reality. The sandbox \u2014 the headline feature \u2014 demands $5\/month minimum. On the free tier, plugins run in-process with no isolation. On self-hosted Node.js, same story. So the \u201cspiritual successor to WordPress\u201d only works as advertised when you pay Cloudflare monthly.<\/p>\n<p>This is not unusual for open-source infrastructure plays. Vercel\u2019s Next.js has lock-in around its edge functions. Netlify\u2019s deploy previews are proprietary. But those platforms don\u2019t market themselves as replacements for a 24-year-old open-source CMS. They\u2019re upfront about being hosted services. Cloudflare is positioning EmDash as \u201clike WordPress but secure.\u201d The reality is \u201clike WordPress but only secure if you use our paid platform.\u201d<\/p>\n<h2>What Cloudflare Should Have Done<\/h2>\n<p>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 \u2014 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\u2019s own infrastructure, but the product wouldn\u2019t be crippled elsewhere.<\/p>\n<p>Instead, Cloudflare chose to keep the sandbox proprietary. That\u2019s a business decision, not a technical limitation. And it\u2019s the reason EmDash will struggle to gain traction beyond developers who already use Cloudflare for everything.<\/p>\n<h2>The One Scenario Where This Advice Fails<\/h2>\n<p>There is one use case where EmDash\u2019s lock-in doesn\u2019t 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\u2019s sandbox is a genuine improvement over WordPress\u2019s 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 \u2014 MCP server, agent skills \u2014 are ahead of anything WordPress offers today.<\/p>\n<p>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 \u2014 for all its flaws \u2014 remains the safer bet.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cloudflare\u2019s EmDash CMS promises a revolution: plugins locked in isolated V8 sandboxes, ending the 96% of WordPress vulnerabilities that originate from plugins. It\u2019s a brilliant pitch. But there\u2019s a catch buried in the fine print \u2014 one that makes the entire security model conditional on remaining inside Cloudflare\u2019s paid ecosystem. If you self-host EmDash on [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":99781,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/cards.overcentral.com\/cards\/en\/98047.png","fifu_image_alt":"EmDash\u2019s Single Point of Failure: Why You Can\u2019t Run Sandboxed Plugins Outside","footnotes":""},"categories":[31],"tags":[],"class_list":["post-98047","post","type-post","status-publish","format-standard","has-post-thumbnail","category-technology"],"fifu_image_url":"https:\/\/cards.overcentral.com\/cards\/en\/98047.png","fifu_image_alt":"EmDash\u2019s Single Point of Failure: Why You Can\u2019t Run Sandboxed Plugins Outside","_links":{"self":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/98047","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/comments?post=98047"}],"version-history":[{"count":1,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/98047\/revisions"}],"predecessor-version":[{"id":99782,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/98047\/revisions\/99782"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/media\/99781"}],"wp:attachment":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/media?parent=98047"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/categories?post=98047"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/tags?post=98047"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}