EmDash is the project I wanted to inspect right after Monolith.

Monolith is a Cloudflare-native blog CMS. EmDash is broader: it is a full-stack TypeScript CMS built on Astro, and the repository explicitly describes it as the spiritual successor to WordPress.

That distinction matters. EmDash is not just an editor bolted onto a blog. It is trying to rebuild the WordPress mental model for Astro: content types, admin UX, media, taxonomies, users, roles, plugins, importers, CLI tooling, and automation.

What is EmDash?

EmDash is an MIT-licensed CMS for Astro sites.

The repo describes the goal clearly:

EmDash is a full-stack TypeScript CMS based on Astro; the spiritual successor to WordPress.

The feature set includes:

  • posts, pages, and custom content types;
  • visual editing with TipTap and Portable Text;
  • drafts, revisions, scheduled publishing, and full-text search;
  • admin panel for schemas, media, menus, taxonomies, widgets, and imports;
  • passkey-first auth, OAuth, magic links, and RBAC;
  • sandboxed plugins;
  • WordPress import paths;
  • CLI tooling;
  • built-in MCP endpoint for agents.

That is a serious CMS surface, not a toy admin panel.

Architecture Overview

The clean mental model:

Astro app -> EmDash integration -> SQL content database -> Portable Text -> Astro routes

The stack is portable:

Layer EmDash Uses
Site framework Astro
CMS integration emdash Astro integration
Content query layer Astro Live Collections
Rich text model Portable Text JSON
Editor TipTap
Local database SQLite
Cloudflare database D1
Other database paths Turso/libSQL, PostgreSQL
Local uploads Filesystem
Cloudflare uploads R2
Other upload paths S3-compatible object storage
Auth @emdash-cms/auth
Plugins Worker isolates through Cloudflare Worker Loader or local workerd
Automation CLI and MCP endpoint

That portability is the part I like. EmDash is Cloudflare-friendly, but not Cloudflare-only.

Deployment Paths

There are two practical paths to understand.

Path What Runs
Node / Docker Astro Node standalone server, SQLite database, local upload directory
Cloudflare Astro Cloudflare adapter, Workers runtime, D1 database, R2 media bucket

The repository ships a root compose.yaml and Dockerfile. The Dockerfile builds the blog template, serves it through Astro’s Node standalone adapter, and exposes port 4321.

For Cloudflare, the blog template uses D1 and R2 bindings. The documented Cloudflare template also includes optional Worker Loader support for sandboxed plugins.

That makes EmDash different from pure-static Astro:

static Astro site = build HTML once, upload to CDN
EmDash site       = Astro server output, live CMS database, media storage

Home-Lab Compose

I added a Home-Lab folder and a matching site snippet:

The compose builds from a pinned source commit:

services:
  emdash:
    build:
      context: https://github.com/emdash-cms/emdash.git#a17408fe6326999e2acf94949f657621291d54e5
      dockerfile: Dockerfile
    ports:
      - "${EMDASH_PORT:-4321}:4321"
    volumes:
      - emdash-data:/app/data
      - emdash-uploads:/app/uploads

Open:

http://localhost:4321/
http://localhost:4321/_emdash/admin

Important caveat: this is a source build, not a tiny prebuilt image. It pulls the monorepo, installs pnpm workspace dependencies, builds packages, and then builds the template.

Field Note: Local Validation

I tested the parts that were safe to test locally without creating a production CMS instance.

The upstream compose shape validates:

docker compose config

The repository requires a modern Node runtime. This machine has Node 18.19.1, so I used temporary Node 22 and pnpm 11 through npx.

These checks passed:

npx -y -p node@22 node -v
npx -y -p node@22 -p [email protected] pnpm -v
NODE22_DIR=$(dirname "$(npx -y -p node@22 which node)") && PATH="$NODE22_DIR:$PATH" npx -y [email protected] install --frozen-lockfile --ignore-scripts
npx -y -p node@22 -p [email protected] bash -lc 'pnpm --filter emdash build'
npx -y -p node@22 -p [email protected] bash -lc 'pnpm --filter @emdash-cms/auth build'

I did not get to a clean running UI in this local trial. A direct template build exposed missing workspace build artifacts, and a full workspace build later stopped in the admin package because @tailwindcss/cli was not found in that local install path.

So the honest status is:

compose config: verified
core package build: verified
auth package build: verified
running local UI: not verified in this pass

EmDash vs Monolith

Both are interesting for Cloudflare-era publishing, but they are not the same product.

Question EmDash Monolith
Main identity Astro-native CMS Cloudflare-native blog CMS
Frontend framework Astro React + Vite
Backend style Astro integration/API routes Hono Worker API
Content model Portable Text in SQL Markdown text in database
WordPress migration First-class focus Importer support, but narrower
Plugin model Sandboxed plugin isolates App-level feature modules
Agent/MCP surface Built-in MCP endpoint Not the main focus
Local Docker path Node + SQLite template No classic Docker path in the repo
Cloudflare path Workers + D1 + R2 Pages + Workers + D1 + R2

If you want an Astro site with a serious CMS layer, EmDash is the more relevant project.

If you want a ready-made Cloudflare blog system with Markdown editing, comments, backups, and analytics, Monolith is narrower but more direct.

EmDash vs WordPress

EmDash intentionally borrows the productive parts of WordPress:

  • content types;
  • admin workflows;
  • plugin extensibility;
  • media library;
  • roles;
  • importer path;
  • theme/template concepts.

But it avoids the WordPress runtime model:

WordPress EmDash
PHP runtime TypeScript / Astro
MySQL-first SQLite, D1, Turso/libSQL, PostgreSQL paths
plugin code inside main PHP runtime sandboxed plugin isolates
Gutenberg blocks TipTap and Portable Text
wp-admin EmDash admin
theme templates Astro routes/components

This is why I would not call it “WordPress with a new coat of paint.” It is more like a reinterpretation of WordPress concepts for Astro and edge/serverless deployment.

FAQ

Prompt Used for the Cover

Text-free editorial cover for EmDash, an Astro-native TypeScript CMS. Show a polished publishing dashboard, Astro-like star motif, SQL database cylinder, media bucket, cloud edge nodes, plugin sandbox capsules, and content blocks flowing into a modern website preview. High-end technical illustration, dark graphite background, white, teal, amber, and violet accents, no logos, no readable UI text, no watermarks.