{"id":97960,"date":"2026-09-30T00:38:00","date_gmt":"2026-09-30T04:38:00","guid":{"rendered":"https:\/\/overcentral.com\/en\/?p=97960"},"modified":"2026-09-29T08:09:41","modified_gmt":"2026-09-29T12:09:41","slug":"emdash-cms-dashboard-design-choices-97960","status":"publish","type":"post","link":"https:\/\/overcentral.com\/en\/emdash-cms-dashboard-design-choices-97960\/","title":{"rendered":"EmDash CMS Dashboard: What the Non-Obvious Design Choices Actually Mean"},"content":{"rendered":"<p>You&#8217;ve installed <a href=\"https:\/\/emdash.dev\" target=\"_blank\" rel=\"noopener noreferrer\" data-iacss-external=\"1\">EmDash<\/a>. You&#8217;ve clicked through the wizard, set your passkey, and landed on the admin. It looks like WordPress. That&#8217;s the point. But the surface familiarity hides decisions that change how you build, deploy, and maintain a site. Here&#8217;s what matters beyond the first impression.<\/p>\n<h2>The Dashboard Is a Trap \u2014 But a Useful One<\/h2>\n<p>The layout mimics WordPress&#8217;s left-nav structure. That&#8217;s deliberate. The team wanted your muscle memory to transfer. But the similarities end at the navigation.<\/p>\n<h3>Collapsing Content Management<\/h3>\n<p>Notice the sidebar collapses. That&#8217;s not just aesthetic. EmDash treats every section as a first-class citizen, not a plugin afterthought. In WordPress, you manage menus through one interface, redirects through another (often via Yoast or Redirection plugin), and widgets through the Customizer. EmDash consolidates these into logical groups: Content, Manage, Admin.<\/p>\n<p>The &#8220;Manage&#8221; section is where <a href=\"https:\/\/overcentral.com\/en\/star-wars-zero-company-ctd-fix-78585\/\" title=\"STAR WARS Zero Company CTD Mid-Mission: The Non-Obvious\" data-iacss-internal=\"1\">the non-obvious<\/a> lives. Redirects, widgets, sections, categories, tags, and bylines live here. Bylines aren&#8217;t author profiles \u2014 they&#8217;re attribution blocks you can attach to any content type. That&#8217;s a hint: EmDash thinks in structured content, not just posts and pages.<\/p>\n<h3>Content Types Are Not Post Types<\/h3>\n<p>WordPress gives you posts and pages. Custom post types require a plugin like ACF or CPT UI. EmDash bakes this into the core. Navigate to Admin &gt; Content Types. You&#8217;ll see pages and posts already defined. But you can create new ones \u2014 Projects, Products, Team Members \u2014 with custom fields, slugs, and URL patterns.<\/p>\n<p>The catch? These are stored in the database, not as code. For an experienced practitioner, that&#8217;s a red flag. In most production workflows, you want content type definitions in version control, not click-ops. EmDash currently offers no code-first configuration for schemas. You define types through the UI, and they live in D1 (or SQLite locally). That means migrating a site requires either exporting the database or manually recreating types. The team has hinted at code-based schema definitions, but they&#8217;re not here yet.<\/p>\n<h2>Security That&#8217;s Not a Plugin<\/h2>\n<p>The headline feature is plugin sandboxing via dynamic workers. If you&#8217;re on Cloudflare&#8217;s paid plan ($5\/month), every plugin runs in its own V8 isolate. It cannot access your database, file system, or network unless you explicitly declare capabilities in a manifest.<\/p>\n<h3>What That Means for Your Workflow<\/h3>\n<p>You write plugins as functions with a <code>definePlugin<\/code>codecodecodecode call. You specify capabilities: <code>read content<\/code>codecodecodecode, <code>send email<\/code>codecodecodecode, <code>read media<\/code>codecodecodecode. The runtime enforces these boundaries. A compromised plugin cannot create an admin user, read password hashes, or exfiltrate data. This isn&#8217;t a policy \u2014 it&#8217;s architectural enforcement via V8 isolates, Linux namespaces, and seccomp filters.<\/p>\n<p>But here&#8217;s the non-obvious part: on the free Cloudflare tier, plugins run in-process. No sandbox. Self-host on Node.js, same story. The feature that justifies EmDash&#8217;s existence requires Cloudflare&#8217;s paid runtime. The code is MIT-licensed, but the security model is vendor-locked.<\/p>\n<h2>AI Integration That&#8217;s Not an Add-On<\/h2>\n<p>EmDash ships with a built-in MCP server and agent skills files. This is where it diverges most sharply from WordPress.<\/p>\n<h3>The MCP Server<\/h3>\n<p>Model Context Protocol (MCP) is Anthropic&#8217;s standard for <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> communication. EmDash&#8217;s MCP server lets Claude, Cursor, or GitHub Copilot connect directly to your CMS. Agents can create content types, migrate themes, update content, and manage plugins \u2014 all through natural language.<\/p>\n<p>The agent skills files are structured documentation that tells <a href=\"https:\/\/overcentral.com\/en\/ai-avatar-empire-96590\/\" title=\"Build an AI Avatar Empire Without Showing Your Face\" data-iacss-internal=\"1\">an AI<\/a> exactly how to operate the CMS. No custom prompting needed. This is designed for the world where vibe coding or agent-driven development is the norm. You can say &#8220;Build me a new custom content type for testimonials with fields for company name and quote&#8221; and the agent handles it.<\/p>\n<h3>Portable Text<\/h3>\n<p>Content is stored as structured JSON, not HTML. Portable text, the same format Sanity pioneered, renders to web, mobile, email, or API without markup parsing. For an experienced developer, this means you can reuse content across frontends without scraping HTML. WordPress stores content as HTML in the <code>post_content<\/code>codecodecodecode column. EmDash stores it as structured blocks. Migration tools convert WXR exports to portable text, but custom blocks or layouts require manual porting.<\/p>\n<h2>The Real Cost Question<\/h2>\n<p>EmDash is serverless. You pay per request, per CPU millisecond, per database read, per storage operation. WordPress hosting is a flat monthly fee. EmDash&#8217;s paid plan starts at $5\/month with 10 million requests. After that, $0.30 per additional million, plus CPU time, D1 reads, R2 operations, and KV lookups.<\/p>\n<h3>The Hidden Metering<\/h3>\n<p>One page view can hit five billing meters simultaneously: Workers (compute), D1 (database reads), R2 (media storage), KV (session state), and potentially Workers AI. Predict your monthly bill as a small business owner. You can&#8217;t. Cloudflare doesn&#8217;t offer a global spending cap. You can set CPU time limits per request and WAF rate limiting, but a distributed bot attack from thousands of IPs bypasses per-IP limits.<\/p>\n<p>For an experienced practitioner, this means EmDash is cheap for low-traffic sites and unpredictable for anything viral. A blog post hitting Hacker News could cost you more than your hosting bill. Compare that to WordPress: your server might crash under load, but your bill stays the same.<\/p>\n<h2>Migration Is a Content-Only Affair<\/h2>\n<p>EmDash includes a WordPress migration tool. It imports posts, pages, media, and custom post types via WXR export. That&#8217;s it. No plugins, no themes, no WooCommerce products, no membership systems, no SEO configurations. All of that, you rebuild.<\/p>\n<h3>The Portable Text Hiccup<\/h3>\n<p>WordPress stores content as HTML. EmDash uses portable text. Migration converts block-level content, but custom HTML, shortcodes, or page-builder markup may not survive. For any site with Elementor, Divi, or custom blocks, migration is a rewrite, not a move.<\/p>\n<p>The team provides an AI-assisted porting guide. Feed your WordPress theme files to an MCP agent, and it generates Astro-compatible templates. That works for simple themes. For anything with custom post types, advanced fields, or complex logic, you&#8217;re building from scratch.<\/p>\n<h2>The Ecosystem Challenge<\/h2>\n<p>WordPress has 60,000 plugins, 12,000 themes, and millions of developers. EmDash launched with zero third-party plugins. The sandbox model means plugins are isolated, but isolation doesn&#8217;t create features. Every plugin you need \u2014 e-commerce, forms, SEO, caching \u2014 must be built or ported.<\/p>\n<p>The counter-strategy is AI. The MCP server and agent skills let developers generate plugins programmatically. The MIT license removes GPL friction for commercial developers. But signals don&#8217;t ship features. A business that needs WooCommerce, Yoast SEO, and Gravity Forms can install WordPress plugins in an afternoon. On EmDash, that&#8217;s weeks of custom development \u2014 assuming the functionality exists yet.<\/p>\n<p>For an experienced practitioner, the bet is that AI-generated plugins will close the gap faster than traditional ecosystem growth. That&#8217;s plausible, but unproven. Ghost launched a decade ago with better technology than WordPress and has 0.1% market share. Ecosystem is not architecture.<\/p>\n<h2>Where the General Advice Fails<\/h2>\n<p>The common advice is to wait for v1.0, a real ecosystem, and predictable billing. That&#8217;s safe. But it misses the point for greenfield projects where security and modern tooling matter more than legacy compatibility.<\/p>\n<p>If you&#8217;re building a content site in TypeScript, security is a primary concern, and you can manage serverless costs with monitoring, EmDash is worth a serious look today. The architecture is right. The sandbox model solves a real problem. The AI integration isn&#8217;t an afterthought.<\/p>\n<p>But if you need e-commerce, a membership system, or any functionality beyond basic content management, WordPress still wins by default. Not because it&#8217;s better, but because its ecosystem has no substitute yet.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>You&#8217;ve installed EmDash. You&#8217;ve clicked through the wizard, set your passkey, and landed on the admin. It looks like WordPress. That&#8217;s the point. But the surface familiarity hides decisions that change how you build, deploy, and maintain a site. Here&#8217;s what matters beyond the first impression. The Dashboard Is a Trap \u2014 But a Useful [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":98616,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/cards.overcentral.com\/cards\/en\/97960.png","fifu_image_alt":"EmDash CMS Dashboard: What the Non-Obvious Design Choices Actually Mean","footnotes":""},"categories":[31],"tags":[],"class_list":["post-97960","post","type-post","status-publish","format-standard","has-post-thumbnail","category-technology"],"fifu_image_url":"https:\/\/cards.overcentral.com\/cards\/en\/97960.png","fifu_image_alt":"EmDash CMS Dashboard: What the Non-Obvious Design Choices Actually Mean","_links":{"self":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/97960","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=97960"}],"version-history":[{"count":1,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/97960\/revisions"}],"predecessor-version":[{"id":98499,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/97960\/revisions\/98499"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/media\/98616"}],"wp:attachment":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/media?parent=97960"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/categories?post=97960"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/tags?post=97960"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}