# 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.

- Author: Harish Chouhan
- Published: 2026-10-10
- Page: https://workerdock.app/blog/emdash-cloudflare-cms/

EmDash is an open-source CMS written in TypeScript and built on [Astro](https://astro.build). Its project page describes it as a spiritual successor to WordPress. It is MIT licensed, and the code lives in the [emdash-cms/emdash](https://github.com/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](/blog/launch-web-app-free-on-cloudflare/) while you experiment.

## Trying it

The quickest way to start is the create command:

```bash
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:

```bash
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](/tools/d1-local/) builds the right `wrangler d1` commands.
