Deploying emdash to Cloudflare: What We Learned
April 3, 2026. We deployed our first emdash site to Cloudflare Workers.
emdash is a new CMS built from scratch on Astro. Structured content via Portable Text, server-rendered pages, an admin panel that feels more like Notion than WordPress. It runs on Cloudflare's serverless stack: Workers for compute, D1 for the database, R2 for media storage. We're evaluating it as a lighter alternative to WordPress for brochure and content-focused sites.
Why we're looking at emdash
We build and maintain client websites. WordPress is the workhorse, and it's not going anywhere. But for simpler sites, it carries a lot of weight: PHP hosting, MySQL databases, plugin updates, security patches. A complexity tax that grows every year.
emdash is interesting because it's AI-native from the ground up. It ships with a built-in MCP server, so Claude Code can manage content through the same tool-use protocol we use for everything else. No browser automation, no fragile API wrappers. Just MCP tools: create a page, publish it, add a form, check submissions. It fits naturally into how we already work.
The cost model is also compelling. A brochure site on Cloudflare Workers costs effectively nothing beyond the base $5/month account. No servers to patch. No scaling to configure. No 3 AM pages about disk space. Deploying a new site is a configuration change, not an infrastructure project.
The deployment
Getting emdash running on Cloudflare involved: creating a D1 database and R2 bucket, dumping the SQLite schema from a local init and applying it to D1 (stripping SQLite-specific pragmas that D1 rejects), setting auth secrets via wrangler, and deploying the Worker. The whole process took about an hour and we documented every step.
The gotcha that cost us the most time: emdash requires the paid Cloudflare Workers plan ($5/month). The free plan's 10ms CPU limit is too short for the runtime to initialize its plugin system and email pipeline. On the free plan, everything appears to work, but features silently fail because the runtime gets killed mid-initialization.
Working with the MCP
emdash's MCP server provides about 33 tools for content, schema, media, taxonomy, menu, and revision management. We connected it to Claude Code and used it to create pages, write blog posts, and manage the site entirely through tool calls. No admin panel needed for content operations.
The content workflow has a specific rhythm: content_create makes a draft, content_publish makes it live. Always two steps. Passing status: published on create sets the field but doesn't actually create a live revision. We learned that the hard way.
This is exactly the kind of workflow that works well with Claude Code. Create content, publish it, check the result. The MCP tools are the same interface whether a human or an AI is driving.
Comments
No comments yet. Be the first to share your thoughts.
Leave a comment