Skip to content

Guide · Open source

How to use EmDash: install, run and deploy the CMS

Updated · written with AI from the project's own documentation and checked against our catalogue data

EmDash is a full-stack TypeScript content management system built on the Astro web framework. It aims to offer WordPress-style extensibility and an admin panel without PHP. This guide shows you how to create a new site, understand how it is put together, and where to go next.

EmDashemdash-cms/emdash · ★ 14.1k · MIT

Quick start

  1. 1Check prerequisites. Confirm that Node.js and npm are installed on your machine.
  2. 2Create the site. Run npm create emdash@latest and follow the prompts to scaffold a new project.
  3. 3Pick a template or deploy. Choose one of the blog, marketing or portfolio templates, or use the Deploy to Cloudflare button to deploy directly to your account.
  4. 4Open the admin panel. Use the admin panel to manage content, media, menus and taxonomies.
  5. 5Define or adjust content types. Create collections in the admin UI, then run npx emdash types to generate TypeScript types.
  6. 6Query content in Astro. Use getEmDashCollection in your Astro pages to render entries from a collection.
  7. 7Add plugins or migrate content. Install plugins that declare the capabilities they need, or use the WordPress import wizard to bring over existing content.

What you need before you install EmDash

EmDash is installed with a package manager. The prerequisites listed for the project are Node.js and npm, so make sure both are on your machine before you start.

You do not need a Cloudflare account to try it locally. The project's development demo runs on Node.js with SQLite. A Cloudflare account is only needed if you want to deploy to Cloudflare's D1, R2 and Workers services.

  • Node.js
  • npm

Create a new EmDash site

To start a new site, run the scaffolding command from the README. It creates a new EmDash project using the create-emdash package.

npm create emdash@latest

Choose a starter template

EmDash ships with three starter templates. Each one is a working site you can adapt, and the project also includes starter and blank templates in its repository.

  • Blog: a classic blog with sidebar widgets, search, and RSS. Includes categories, tags, full-text search and dark/light mode.
  • Marketing: a photo-led landing page built from modular blocks, with pricing, FAQ and a closing call to action.
  • Portfolio: a visual portfolio with a project grid, tag filtering and case study pages.

Deploy to Cloudflare or run on Node.js

EmDash runs on Cloudflare using D1 for the database, R2 for storage and Workers for hosting, or on any Node.js server with SQLite. The README also offers a Deploy to Cloudflare button that links to the blog template, so you can deploy directly to your account.

The project lists other supported options as well, including Turso, PostgreSQL, AWS S3 and local filesystem storage. Check the documentation for the exact setup of each.

  • Cloudflare: D1 (database), R2 (storage), KV (sessions), Workers (plugin isolates).
  • Node.js: SQLite database, with sessions in a file-based store or Redis, and plugins run in a workerd child process.

Understand how EmDash is configured

EmDash is an Astro integration. You add it to your Astro config, and you get the admin panel, REST API, authentication, media library and plugin system. The database adapter is passed in when you register the integration.

Content types are defined in the database rather than in code. Non-developers can create and change collections through the admin UI. Each collection becomes a SQL table with typed columns, and developers can generate TypeScript types from the live schema.

// astro.config.mjs import emdash from "emdash/astro"; import { d1 } from "emdash/db"; export default defineConfig({ integrations: [emdash({ database: d1() })], });

Generate types and query content

After your schema is set up, run the types command to generate TypeScript types from it. You can then query a collection in an Astro page with getEmDashCollection, which the README describes as working with Astro's Live Collections, so content does not need a rebuild.

npx emdash types

Plugins, sandboxing and WordPress migration

Plugins are written with the definePlugin() API. Each plugin declares the capabilities it needs, such as content:read or email:send, and runs in a sandboxed Worker isolate on Cloudflare. The README says this limits what a plugin can access compared with WordPress plugins, which have full access to the database and filesystem.

If you are moving from WordPress, the admin includes an import wizard. It can import posts, pages, media and taxonomies from WXR exports, the WordPress REST API or WordPress.com.

  • Plugin features include lifecycle hooks, KV storage, settings, admin pages, dashboard widgets, custom block types and API routes.
  • Agent skills, a CLI and a built-in MCP server are provided for AI-assisted development.

What people use it for

  • A developer who already builds with Astro adds a blog with search and RSS using the blog template.
  • A small team runs a photo-led marketing site with modular blocks and a WordPress-style admin panel.
  • A creative professional publishes a portfolio with a project grid, tag filtering and case study pages.
  • A site owner moves an existing WordPress site's posts, pages, media and taxonomies into EmDash with the import wizard.
  • A team deploys a site to Cloudflare using D1, R2 and Workers.

Frequently asked questions

Is EmDash free to use?

EmDash is released under the MIT licence, and its source code is on GitHub. The README does not describe any paid hosting tier, and it states there is no separate hosting tier beyond deploying your Astro site.

What do I need to install EmDash?

The prerequisites are Node.js and npm. Create a new site with npm create emdash@latest. You do not need a Cloudflare account to run the local demo, which uses Node.js and SQLite.

Can I use EmDash without PHP?

Yes. EmDash is a TypeScript CMS built on Astro, and the README says it runs without PHP, so you deploy it as an Astro site.

Is EmDash stable enough for production?

The README describes the core packages as stable and says they follow semantic versioning. It also says first-party plugins and plugin tooling are still on 0.x and may change between minor releases.

Can I move my WordPress site to EmDash?

Yes, the admin includes a WordPress import wizard. It can import posts, pages, media and taxonomies from WXR exports, the WordPress REST API or WordPress.com. Plugins and themes are not moved automatically, though agent skills can help port them.

How does EmDash compare with WordPress or Ghost?

EmDash aims to offer WordPress-style extensibility and admin UX on a serverless, type-safe stack, and its plugins are sandboxed. It does not run WordPress plugins or themes, so teams that depend on the WordPress ecosystem should weigh that. Ghost, Payload CMS and Strapi are other comparable projects to consider.

New agent skills, repos and AI tools — every week

The best new skills and open-source projects, the fastest-growing repos, and one free prompt. Five minutes to read. Unsubscribe anytime.

Our verdict

EmDash suits developers who already build with Astro and want a CMS with a WordPress-style admin, especially on Cloudflare. It is a poor fit for non-technical users who need a fully hosted service, or for teams that rely on the WordPress plugin and theme ecosystem, since the README notes that first-party plugins are still on 0.x.

Install options & downloads