Blog

EmDash: Cloudflare's open-source CMS built on Astro

What EmDash is, what it can do, how to try it, and how it fits with Astro, D1 and R2. A plain guide for developers coming from WordPress.

EmDash is an open-source CMS written in TypeScript and built on Astro. Its project page describes it as a spiritual successor to WordPress. It is MIT licensed, and the code lives in the emdash-cms/emdash repository.

The project now describes itself as stable, with its core packages following semantic versioning. First-party plugins and plugin tooling are still on 0.x versions. Check the repository for the current release before you start.

What EmDash gives you

According to the project, EmDash includes:

  • Content types defined in the database, with a visual schema builder, so you can change your content model without redeploying.
  • Rich text stored as structured JSON (Portable Text), not HTML blobs.
  • Revisions, drafts, scheduled publishing and full-text search.
  • Passkey-first login, with OAuth and magic links as fallbacks, and role-based access.
  • A built-in MCP server and agent skills, so AI tools can work with your content.
  • Three starter templates: Blog, Marketing and Portfolio.

Because it is an Astro integration, EmDash runs inside your Astro site. You build the front end with normal Astro components and the admin comes along with it.

Where it runs

EmDash is designed for Cloudflare, using D1 for the database, R2 for media and Workers for compute. It also runs on any Node.js server with SQLite, and other backends such as Turso, PostgreSQL and S3 are supported. If you are already using Cloudflare, you can stay on its free tier while you experiment.

Trying it

The quickest way to start is the create command:

npm create emdash@latest

There is also a one-click Cloudflare deploy button in the repository README. To generate TypeScript types for your content model, run:

npx emdash types

Plugins

Plugins are written with definePlugin(), which declares the hooks a plugin uses and a manifest of the capabilities it needs, such as content:read or email:send. Each plugin runs in its own isolated sandbox: a Worker isolate on Cloudflare, or a workerd child process on Node.js. Plugins can add admin pages, dashboard widgets, custom blocks and API routes.

WordPress plugins and themes do not run on EmDash. The project provides agent skills to help port them.

Coming from WordPress

The admin includes an import wizard. It can bring in posts, pages, media and taxonomies from a WordPress export file (WXR), from the WordPress REST API or from WordPress.com. Plan the migration on a staging site first, and check that your slugs, authors, media and publication dates arrive as expected before you switch over.

Working on EmDash locally

An EmDash site is an Astro project with a Worker behind it, a local D1 database and an R2 bucket. If you run several of these, a tool that shows what each project is wired to saves time. That is what WorkerDock is for, and it has an EmDash shortcut that opens the site’s admin login page. If you hit database problems along the way, our local D1 helper builds the right wrangler d1 commands.

Directory

Apps and projects built on Cloudflare

Hand-picked open-source projects you can run in your own Cloudflare account.

Browse the directory
  • Email

    Box Ox

    Browser inbox, sending API, webhooks and agent access, all in your own Cloudflare account.

    • Functional Source License
    • Workers
    • R2
    • D1
  • Email

    EmailFlare

    A REST API, dashboard and scoped API keys for sending app email through Cloudflare.

    • MIT
    • Workers
    • Email Sending
  • Developer tools

    Appflare

    App manager for your Cloudflare account. Install open-source Workers apps from your browser.

    • Apache-2.0
    • Workers

Running more than one Worker?

WorkerDock finds your local Workers, Pages and Astro projects and shows each one's port, logs and bindings in one window.

v0.1.2 · macOS 14+ · Free