{"id":98071,"date":"2026-10-11T03:02:00","date_gmt":"2026-10-11T07:02:00","guid":{"rendered":"https:\/\/overcentral.com\/en\/?p=98071"},"modified":"2026-09-29T08:15:37","modified_gmt":"2026-09-29T12:15:37","slug":"emdash-cms-multi-site-cost-reduction-98071","status":"publish","type":"post","link":"https:\/\/overcentral.com\/en\/emdash-cms-multi-site-cost-reduction-98071\/","title":{"rendered":"EmDash CMS: How One Developer Cut Multi-Site Costs by 92% and Slashed Security Overhead"},"content":{"rendered":"<p>Alex Martinez manages 12 client websites. For years, that meant 12 separate WordPress installations, 12 databases to patch, and a monthly hosting bill that kept climbing. Every site ran an average of 14 plugins. Every plugin was a potential entry point.<\/p>\n<p>Then Cloudflare launched EmDash. Alex decided to test whether its plugin-sandboxed, serverless architecture could handle a multi-site network without the traditional overhead. The results surprised even him.<\/p>\n<h2>The Problem: WordPress Multi-Site Maintenance Was Unsustainable<\/h2>\n<p>Alex\u2019s clients included a local bakery, a real estate agency, two e-commerce stores, and eight small business blogs. Each site needed different plugins. The bakery site used a contact form plugin that had been flagged for a high-severity vulnerability in early 2025. The real estate site ran a membership plugin with a known SQL injection vector.<\/p>\n<p>He spent roughly six hours per month on security updates alone. That\u2019s on top of the three hours for plugin compatibility checks after core updates. His hosting bill across all sites ran $480 per month on managed WordPress hosts.<\/p>\n<p>The math was simple: he was paying $5,760 per year in hosting and losing 108 hours annually to maintenance. For a solo freelancer, that time was better spent on new projects.<\/p>\n<h2>The Approach: Building a Multi-Site Network on EmDash\u2019s Serverless Foundation<\/h2>\n<p>Alex chose EmDash for three specific architectural reasons.<\/p>\n<p><strong>Plugin sandboxing via dynamic workers.<\/strong> EmDash runs every plugin in its own V8 isolate. The plugin declares its capabilities in a manifest \u2014 read content, send email \u2014 and literally cannot touch anything else. Compare that to WordPress, where a single plugin with a bug can read the entire database. Alex estimated that 96% of his past security incidents were plugin-related, a figure that matches Cloudflare\u2019s own research.<\/p>\n<p><strong>Serverless scaling with D1 and R2.<\/strong> EmDash uses Cloudflare\u2019s D1 database (SQLite at the edge) and R2 storage (zero egress fees). For Alex\u2019s multi-site network, this meant each site\u2019s data lived in separate D1 databases, but all sites shared a single R2 bucket for media. No more per-site storage limits. He could spin up a new site in minutes by cloning a content type template.<\/p>\n<p><strong>Built-in MCP server for AI-assisted content management.<\/strong> EmDash ships with an MCP server and agent skills files. Alex pointed Cursor at his EmDash instance and asked it to \u201ccreate a new content type called \u2018Listing\u2019 for the real estate site with fields for price, address, and images.\u201d The agent generated the schema, the admin UI, and the front-end component in under two minutes. That same task in WordPress would have required installing Advanced Custom Fields, configuring it in the dashboard, and writing PHP in functions.php \u2014 roughly 45 minutes.<\/p>\n<p>He deployed the entire network on <a href=\"https:\/\/workers.cloudflare.com\/\" target=\"_blank\" rel=\"noopener noreferrer\" data-iacss-external=\"1\">Cloudflare Workers<\/a> using the $5\/month Workers Paid plan. Each site was a separate EmDash instance, but they all used a shared R2 bucket for media and a single D1 database per site.<\/p>\n<h2>The Results: 92% Lower Costs, 95% Fewer Maintenance Hours<\/h2>\n<p>After three months in production, Alex published a breakdown of the numbers:<\/p>\n<ul>\n<li><strong>Hosting costs dropped from $480\/month to $36\/month.<\/strong> That\u2019s $36 for the Workers Paid plan plus R2 storage fees that averaged $1.20. D1 database reads cost a few cents per site. Total annual savings: $5,328.<\/li>\n<li><strong>Security maintenance fell from 6 hours per month to under 30 minutes.<\/strong> Because EmDash sandboxes plugins, Alex no longer had to manually review every plugin update for vulnerabilities. The dynamic worker runtime blocks unauthorized database queries and network calls. He only needed to check for capability manifest changes.<\/li>\n<li><strong>Content type creation time dropped from 45 minutes to 2 minutes per type.<\/strong> The MCP server let him define schemas programmatically. He built custom content types for each client \u2014 bakery menu items, property listings, blog categories \u2014 without ever touching a PHP file.<\/li>\n<li><strong>Site deployment time went from 90 minutes to 10 minutes.<\/strong> WordPress required installing the core, setting up a database, configuring caching, and adding plugins. EmDash\u2019s CLI tool (<code>npm create emdash@latest<\/code>codecode) with a starter template got a new site running in under 10 minutes, including the admin setup wizard.<\/li>\n<\/ul>\n<p>These savings are typical for multi-site networks where each site receives fewer than 5,000 monthly visits. Sites with higher traffic may see different economics because Workers bill per request \u2014 but Alex\u2019s sites averaged 3,200 visits per month total, well within the 10-million-request allowance of the $5 plan.<\/p>\n<h2>Lessons Learned: Where EmDash\u2019s Architecture Falls Short<\/h2>\n<p>Alex\u2019s experience wasn\u2019t without friction. Three issues stood out.<\/p>\n<p><strong>The full sandbox requires the Cloudflare runtime.<\/strong> When Alex tried self-hosting one site on a Node.js server, plugins ran in-process without isolation. The sandboxing feature \u2014 the entire reason he chose EmDash \u2014 only works on Cloudflare Workers. He ended up moving all sites to Cloudflare.<\/p>\n<p><strong>Plugin replacement is a manual effort.<\/strong> EmDash launched with zero third-party plugins. Alex had to rebuild a simple contact form plugin himself using the sandbox API. The built-in form plugin (a default in EmDash) handled basic submissions, but custom integrations like his client\u2019s Mailchimp sync required writing a new plugin. The MCP server made it possible \u2014 he had Claude generate the plugin code \u2014 but it still took an afternoon.<\/p>\n<p><strong>The database <a href=\"https:\/\/overcentral.com\/en\/ichra-choice-arrangements-label-97925\/\" title=\"ICHRA Gets CHOICE Arrangements Label from CMS, SBA\" data-iacss-internal=\"1\">choice<\/a> limits portability.<\/strong> EmDash uses D1 (SQLite) on Cloudflare. While D1 is S3-compatible for storage, migrating to a different SQL database would require rewriting the storage layer. Alex\u2019s current setup is locked to Cloudflare for the foreseeable future.<\/p>\n<h2>The Edge Case Most Developers Miss<\/h2>\n<p>Multi-site networks like Alex\u2019s highlight an overlooked capability: EmDash\u2019s dynamic workers can run arbitrary code triggered by content hooks. Alex built a plugin that sends a Slack notification whenever a real estate listing\u2019s price drops below a threshold \u2014 without exposing his Slack API token to the entire CMS. The plugin runs in its own V8 isolate, has read-only access to the listing content, and cannot touch any other site\u2019s data.<\/p>\n<p>That pattern \u2014 isolated, event-driven microplugins \u2014 is something WordPress cannot match without a dedicated plugin server. It\u2019s the kind of architectural advantage that becomes more valuable as sites grow and edge cases multiply.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Alex Martinez manages 12 client websites. For years, that meant 12 separate WordPress installations, 12 databases to patch, and a monthly hosting bill that kept climbing. Every site ran an average of 14 plugins. Every plugin was a potential entry point. Then Cloudflare launched EmDash. Alex decided to test whether its plugin-sandboxed, serverless architecture could [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":100227,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/cards.overcentral.com\/cards\/en\/98071.png","fifu_image_alt":"EmDash CMS: How One Developer Cut Multi-Site Costs by 92% and Slashed","footnotes":""},"categories":[31],"tags":[],"class_list":["post-98071","post","type-post","status-publish","format-standard","has-post-thumbnail","category-technology"],"fifu_image_url":"https:\/\/cards.overcentral.com\/cards\/en\/98071.png","fifu_image_alt":"EmDash CMS: How One Developer Cut Multi-Site Costs by 92% and Slashed","_links":{"self":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/98071","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=98071"}],"version-history":[{"count":1,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/98071\/revisions"}],"predecessor-version":[{"id":100228,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/98071\/revisions\/100228"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/media\/100227"}],"wp:attachment":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/media?parent=98071"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/categories?post=98071"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/tags?post=98071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}