{"id":98046,"date":"2026-10-08T15:02:00","date_gmt":"2026-10-08T19:02:00","guid":{"rendered":"https:\/\/overcentral.com\/en\/?p=98046"},"modified":"2026-09-29T07:59:15","modified_gmt":"2026-09-29T11:59:15","slug":"cut-docs-load-time-emdash-cms-98046","status":"publish","type":"post","link":"https:\/\/overcentral.com\/en\/cut-docs-load-time-emdash-cms-98046\/","title":{"rendered":"How One Team Cut Docs Load Time 90% With EmDash CMS"},"content":{"rendered":"<p>The documentation team at OpenAPI-Tools (a fictional open-source project for API testing) had a familiar problem. Their WordPress site, which hosted 1,200+ technical articles, took 4.2 seconds to load on a good day. On bad days, it crashed under traffic spikes from Hacker News. They spent $240 a month on managed WordPress hosting with caching plugins, and security patches arrived weekly.<\/p>\n<p>They migrated to <a href=\"https:\/\/emdashcms.com\" target=\"_blank\" rel=\"noopener noreferrer\" data-iacss-external=\"1\">EmDash CMS<\/a> in April 2026. Their page load time dropped to 380 milliseconds. Their hosting bill fell to $15 a month. Their plugin count went from 14 to zero.<\/p>\n<p>Here is exactly how they did it \u2014 and what they learned.<\/p>\n<h2>The Problem: WordPress Couldn&#8217;t Scale Their Content<\/h2>\n<p>OpenAPI-Tools published documentation for a developer tool. Their audience expected speed. WordPress delivered the opposite.<\/p>\n<p>The site ran 14 plugins to handle SEO, caching, code syntax highlighting, search, redirects, and contact forms. Each plugin was a PHP script with full database access. In 2025 alone, they patched three plugin vulnerabilities \u2014 one in a syntax highlighter that could have exposed user session data.<\/p>\n<p>The hosting bill told its own story. Managed WordPress hosting on WP Engine cost $240 a month. Even then, the site hit CPU limits during traffic spikes. A post about a new API feature went viral. The site returned 503 errors for 45 minutes.<\/p>\n<p>The development team spent 8-10 hours per month on maintenance: plugin updates, cache clearing, PHP version compatibility checks. That was time they wanted to spend on documentation.<\/p>\n<h2>The Approach: Migrating to EmDash on Cloudflare Workers<\/h2>\n<p>The team evaluated alternatives. Ghost was fast but lacked custom content types. Sanity required a separate frontend build. Headless WordPress meant keeping PHP complexity.<\/p>\n<p>EmDash was different. It ran on <a href=\"https:\/\/workers.cloudflare.com\" target=\"_blank\" rel=\"noopener noreferrer\" data-iacss-external=\"1\">Cloudflare Workers<\/a> \u2014 serverless V8 isolates that scale to zero and back. The admin interface looked familiar. The import tool could pull WordPress content in minutes.<\/p>\n<h3>The migration took three days<\/h3>\n<p>Day one: They spun up the EmDash playground at emdashcms.com to test the admin. The dashboard loaded in under a second. They created custom content types for code snippets and API reference docs \u2014 features that required plugins in WordPress.<\/p>\n<p>Day two: They ran the WordPress export tool. EmDash&#8217;s import function read their WXR file and mapped posts, pages, media, and Yoast SEO fields to EmDash&#8217;s built-in SEO fields. The migrator handled 1,200 posts in 4 minutes.<\/p>\n<p>Day three: They ported their custom theme. EmDash themes use Astro components. The team fed their WordPress theme files to <a href=\"https:\/\/overcentral.com\/en\/ai-influencer-monetization-96595\/\" title=\"How to Monetize an AI Influencer Without Sponsors\" data-iacss-internal=\"1\">an AI<\/a> coding agent via EmDash&#8217;s built-in MCP server. The agent generated Astro-compatible templates in under an hour. They adjusted the CSS for dark mode support \u2014 two hours of manual work.<\/p>\n<h3>What they kept from WordPress<\/h3>\n<p>The core features that made WordPress productive remained. EmDash includes SEO controls, custom content types, user roles (admin, editor, author, contributor), and a block editor out of the box. The team did not need a single plugin.<\/p>\n<h2>The Results: 90% Faster, 94% Cheaper<\/h2>\n<p>The numbers tell a clear story.<\/p>\n<p><strong>Page load time:<\/strong> WordPress served pages in 4.2 seconds (with caching). EmDash served them in 380 milliseconds \u2014 measured from a test location in Sydney, Australia. The difference came from Cloudflare&#8217;s global edge network. WordPress ran on a single server in Virginia. EmDash ran across 330+ data centers.<\/p>\n<p><strong>Hosting cost:<\/strong> The WordPress bill was $240\/month. EmDash on Cloudflare&#8217;s $5 paid plan covered the site&#8217;s 8,000 daily visits. R2 storage for media cost $0.50\/month with zero egress fees. Total: $15\/month.<\/p>\n<p><strong>Maintenance time:<\/strong> Plugin updates and security patches consumed 10 hours per month. EmDash has no plugins to update. Core updates happen at the infrastructure level. Maintenance dropped to zero hours.<\/p>\n<p><strong>Security surface area:<\/strong> The WordPress site had 14 plugins, each with full database access. EmDash plugins run in sandboxed V8 isolates. They declare capabilities in a manifest \u2014 read content, send email \u2014 and can do nothing else. The team runs zero third-party plugins.<\/p>\n<h2>What Broke and What Didn&#8217;t<\/h2>\n<p>Not everything went smoothly.<\/p>\n<p><strong>The passkey issue:<\/strong> EmDash uses WebAuthn passkeys for authentication. The team&#8217;s Linux CI server could not create passkeys. The magic link fallback returned a 404 error on the first attempt. They worked around it by keeping one admin session active. Cloudflare has since patched the bug.<\/p>\n<p><strong>The form builder:<\/strong> EmDash ships with a basic form plugin. It supports name, email, and message fields. The team needed a multi-step form for documentation feedback requests. They built it as a sandboxed plugin in two hours. The plugin declares read content and send email capabilities. It cannot touch the database.<\/p>\n<p><strong>The widget system:<\/strong> EmDash includes widgets and sections \u2014 similar to WordPress&#8217;s widget areas. The team found the drag-and-drop interface functional but dated. They replaced it with custom Astro components for the header and footer, which performed better and required no admin configuration.<\/p>\n<h2>The Plugin Paradox \u2014 Solved<\/h2>\n<p>WordPress&#8217;s biggest strength became its biggest liability. Plugins made the platform extensible. They also made it vulnerable. 96% of WordPress security issues come from plugins \u2014 not from core.<\/p>\n<p>EmDash solves this architecturally. Every plugin runs in a dynamic worker \u2014 a lightweight V8 isolate that spins up in milliseconds, executes the code, and disappears. The plugin cannot access the database, file system, or other plugins unless the manifest grants it.<\/p>\n<p>For OpenAPI-Tools, this meant their custom syntax highlighter plugin could read post content but could not execute SQL queries, modify user data, or phone home to an external server. The team stopped worrying about plugin vulnerabilities entirely.<\/p>\n<h2>Who Should Not Switch Yet<\/h2>\n<p>The migration worked for a documentation site with standard content types. It would not work for every WordPress use case.<\/p>\n<p><strong>E-commerce:<\/strong> WooCommerce powers 35% of all online stores. EmDash has no e-commerce plugin. A store migration would require building payment, inventory, and shipping systems from scratch.<\/p>\n<p><strong>Page builders:<\/strong> Sites built with Elementor or Divi cannot export their layouts. The WordPress migration tool imports content only \u2014 posts, pages, media. Custom page structures must be rebuilt in Astro.<\/p>\n<p><strong>Plugin-dependent businesses:<\/strong> If your revenue depends on a specific WordPress plugin (a membership system, a learning management system, a booking calendar), EmDash cannot replace it today. The plugin ecosystem is zero.<\/p>\n<h2>The Edge Case Nobody Talks About<\/h2>\n<p>Here is the nuance that most coverage misses. EmDash&#8217;s sandboxed plugin model works \u2014 but only on Cloudflare&#8217;s paid runtime. Self-host on a regular Node.js server, and plugins run in-process with no isolation.<\/p>\n<p>The team at OpenAPI-Tools pays $5 a month for Cloudflare&#8217;s Workers Paid plan. That gives them dynamic workers, the sandbox, and the V8 isolate architecture. If they ever want to self-host, they lose the security model that justified the migration.<\/p>\n<p>WordPress runs on any server with PHP and MySQL. You can switch hosts in an afternoon. EmDash&#8217;s data is portable (D1 uses SQLite, R2 is S3-compatible), but the security model is not. The code is MIT-licensed. The runtime that makes the code secure is proprietary Cloudflare infrastructure.<\/p>\n<p>For a documentation site that needs speed and security, that trade-off made sense. For a business that needs hosting flexibility, it may not.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The documentation team at OpenAPI-Tools (a fictional open-source project for API testing) had a familiar problem. Their WordPress site, which hosted 1,200+ technical articles, took 4.2 seconds to load on a good day. On bad days, it crashed under traffic spikes from Hacker News. They spent $240 a month on managed WordPress hosting with caching [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":99773,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/cards.overcentral.com\/cards\/en\/98046.png","fifu_image_alt":"How One Team Cut Docs Load Time 90% With EmDash CMS","footnotes":""},"categories":[31],"tags":[],"class_list":["post-98046","post","type-post","status-publish","format-standard","has-post-thumbnail","category-technology"],"fifu_image_url":"https:\/\/cards.overcentral.com\/cards\/en\/98046.png","fifu_image_alt":"How One Team Cut Docs Load Time 90% With EmDash CMS","_links":{"self":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/98046","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=98046"}],"version-history":[{"count":1,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/98046\/revisions"}],"predecessor-version":[{"id":99774,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/98046\/revisions\/99774"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/media\/99773"}],"wp:attachment":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/media?parent=98046"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/categories?post=98046"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/tags?post=98046"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}