Skip to content

Introduction to EmDash

EmDash is an Astro-native content management system. It brings familiar CMS patterns—collections, taxonomies, menus, widgets, and a polished admin UI—directly into your Astro site with full TypeScript support and portable deployment.

EmDash is a CMS built specifically for Astro. It uses Astro 6’s Live Content Collections to serve content at runtime without rebuilds. Content is stored in SQLite-compatible databases (D1, libSQL, local SQLite) and media in S3-compatible storage (R2, local filesystem).

Key characteristics:

  • Database-first schema — Collections and fields are defined in the database, not code. Create and modify content types from the admin UI.
  • Live Collections — Content changes are immediately available. No static rebuilds needed.
  • Plugin system — WordPress-inspired hooks, storage, settings, and admin UI extensions.
  • Cloud-portable — Runs on Cloudflare (Workers + D1 + R2), Node.js, local SQLite, and any S3-compatible storage.
  • Not a headless CMS — EmDash is tightly integrated with Astro. It’s not a separate service you call via API.
  • Not WordPress-compatible — No PHP, no WordPress plugins running directly. But WordPress content and concepts migrate cleanly.
  • Not a page builder — EmDash focuses on structured content. For visual page building, use Astro components.

Agency developers

Spin up client sites quickly with reusable plugins and themes. No PHP security updates, no plugin conflicts.

Solo developers

Full-stack framework with CMS built in. No separate headless CMS to manage.

Content editors

Intuitive admin panel. Create and edit content without touching code.

WordPress users

Migration path for content and plugins. Modern tooling, familiar concepts.

┌─────────────────────────────────────────────────────────────┐
│ Your Astro Site │
│ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ EmDash Integration │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌──────────────┐ │ │
│ │ │ Content │ │ Admin │ │ Plugins │ │ │
│ │ │ Engine │ │ Panel │ │ │ │ │
│ │ └─────────────┘ └─────────────┘ └──────────────┘ │ │
│ │ │ │
│ │ ┌───────────────────────────────────────────────────┐│ │
│ │ │ Data Layer ││ │
│ │ │ SQLite/D1 ←→ Kysely ←→ R2/S3/Local ││ │
│ │ └───────────────────────────────────────────────────┘│ │
│ └───────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ Astro Framework │ │
│ │ Live Collections • Sessions • Middleware │ │
│ └───────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘

Before diving in, familiarize yourself with these key concepts:

  • Collections — Content types defined in the database (posts, pages, products, etc.)
  • Fields — The properties of a collection (title, content, price, etc.)
  • Taxonomies — Classification systems (categories, tags, custom taxonomies)
  • Menus — Admin-editable navigation structures
  • Widget Areas — Configurable content regions for sidebars and footers
  • Plugins — Extensions that add functionality via hooks, storage, and UI