2tap2b

EmDash: der geistige Nachfolger von WordPress

Inhaltsverzeichnis

Was ist EmDash?

WordPress ist die Grundlage von rund 40 % aller Websites im Internet – und gleichzeitig ein Sicherheitsproblem, das nie wirklich gelöst wurde. Plugins haben vollen Zugriff auf die Datenbank, das Dateisystem und alle Nutzerdaten. Ein einziges kompromittiertes Plugin reicht aus, um die ganze Seite zu übernehmen.

EmDash will das von Grund auf neu denken. Es ist ein vollwertiges CMS, das auf Astro und TypeScript aufbaut – kein PHP, keine separate Hosting-Schicht, kein Haufen Abhängigkeiten. Stattdessen: ein einziger Node.js-Prozess (oder Cloudflare Worker), der alles in sich trägt.

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

Das Projekt ist noch frisch – Version 0.1, aktuell in der Public Beta – hat aber schon mehr Features als viele ausgereifte CMS-Lösungen. Der Code kommt von ascorbic (Astro Core Team) und hat in wenigen Tagen über 7.000 GitHub-Stars gesammelt. Astro wurde ja bekanntlich vor kurzen von Cloudflare gekauft und das scheint hier das erste neue Projekt Astro zu sein, seit dem Kauf durch Cloudflare


Was kann EmDash?

Content & Redaktion

Der Editor basiert auf TipTap und speichert Inhalte als Portable Text – also strukturiertes JSON statt serialisiertem HTML. Das klingt nach einem Detail, macht aber einen riesigen Unterschied: Der Inhalt ist von seiner Darstellung entkoppelt und kann als Webseite, Mobile App oder API-Response gerendert werden, ohne irgendwo HTML parsen zu müssen. Drafts, Revisionen und geplante Veröffentlichungen sind natürlich mit dabei.

Eigene Content-Typen lassen sich über den Admin anlegen, ohne eine einzige Zeile Code zu schreiben – dahinter stecken echte SQL-Tabellen in der Datenbank. TypeScript-Typen generiert man sich dann mit npx emdash types direkt aus dem live Schema. Die Volltext-Suche ist über SQLite FTS5 eingebaut, kein externer Dienst nötig.

Content abfragen sieht dann so aus:

---
import { getEmDashCollection } from "emdash";
const { entries: posts } = await getEmDashCollection("posts");
---

{posts.map((post) => <article>{post.data.title}</article>)}

Kein Build nötig, kein separates API — Astro Live Collections direkt im Template.

Admin-Panel

Das Admin-Panel ist direkt unter /_emdash/admin erreichbar. Es gibt einen visuellen Schema Builder für eigene Content-Typen, eine Media Library mit Drag-and-Drop, Navigation, Taxonomien, Widgets – alles was man erwartet. Besonders praktisch: Es gibt einen WordPress-Import-Wizard, der Posts, Pages, Media und Taxonomien aus WXR-Exports oder direkt über die WordPress REST API importiert. Migration aus WordPress ist damit kein mehrtägiges Projekt mehr.

Sandboxed Plugins – das eigentliche Highlight

Hier hebt sich EmDash wirklich ab. Plugins laufen nicht mit vollen Rechten im selben Prozess, sondern in isolierten Worker-Sandboxes mit einem deklarierten Capability-Manifest:

export default () =>
  definePlugin({
    id: "notify-on-publish",
    capabilities: ["read:content", "email:send"],
    hooks: {
      "content:afterSave": async (event, ctx) => {
        if (event.content.status !== "published") return;
        await ctx.email.send({
          to: "editors@example.com",
          subject: `New post: ${event.content.title}`,
        });
      },
    },
  });

Ein Plugin, das read:content und email:send anfordert, kann genau das — und nichts anderes. Kein Datenbankzugriff, kein Filesystem, kein Netzwerk außerhalb der deklarierten Capabilities. Das löst das fundamentale Sicherheitsproblem von WordPress-Plugins.

Hinweis: Die volle Sandbox-Isolation via Cloudflare Dynamic Worker Loaders erfordert einen bezahlten Cloudflare-Account (ab 5 $/Monat). Im Self-hosted-Modus laufen Plugins in-process (kein Sandboxing, aber funktional).

Passkey-Login – kein Passwort nötig

EmDash setzt auf WebAuthn/Passkeys als primären Authentifizierungsmechanismus – also Touch ID, Face ID oder Hardware-Keys direkt im Browser. Kein Passwort, kein Passwort-Reset-Flow, keine schwachen Credentials die irgendwo wiederverwendet werden. Wer doch lieber klassisch einloggen will, kann OAuth oder Magic Links nutzen. Rollen gibt es vier: Administrator, Editor, Author und Contributor.

KI-Integration out of the box

EmDash liefert einen eingebauten MCP-Server mit, über den AI-Tools wie Claude oder ChatGPT direkt mit der Seite interagieren können – Inhalte anlegen, Schema anpassen, Plugins entwickeln. Dazu kommen vorgefertigte Skill-Files, die dem Agenten erklären wie EmDash funktioniert. Das ist kein nachträglicher Gedanke, sondern von Anfang an eingebaut.


Wo läuft EmDash?

EmDash ist nicht an eine Plattform gebunden. Die Abstraktionen sind portabel:

LayerCloudflare (empfohlen)Self-hosted Alternative
DatabaseD1SQLite, Turso/libSQL, PostgreSQL
StorageR2AWS S3, S3-kompatibel, lokales Filesystem
SessionsKVRedis, File-based
PluginsWorker IsolatesIn-process (safe mode, kein Sandboxing)

Unter der Haube nutzt EmDash Kysely für SQL-Queries und die S3-API für Storage – das macht den Plattformwechsel reibungslos.


Lokal ausprobieren

Ihr braucht Node.js 20+ und pnpm. Das Demo läuft komplett ohne Cloud-Account:

Option 1: Neues Projekt scaffolden (empfohlen)

npm create emdash@latest

Den Assistenten durchlaufen, ein Template wählen (z.B. Blog) und Node.js als Plattform auswählen. Dann:

cd mein-blog
npm run bootstrap   # Datenbank initialisieren + Seed-Daten laden
npm run dev

Admin-Panel unter http://localhost:4321/_emdash/admin öffnen.

Option 2: Das Monorepo klonen (für Entwickler)

git clone https://github.com/emdash-cms/emdash.git && cd emdash
pnpm install
pnpm build

# Demo mit Node.js + SQLite starten (kein Cloudflare-Account nötig)
pnpm --filter emdash-demo seed
pnpm --filter emdash-demo dev

Admin-Panel ebenfalls unter http://localhost:4321/_emdash/admin.

pnpm test          # alle Tests
pnpm typecheck     # TypeScript-Check
pnpm lint:quick    # schneller Lint

Direkt auf Cloudflare deployen

Wer keinen eigenen Server betreiben will, kann EmDash mit einem Klick auf Cloudflare deployen:

Deploy to Cloudflare

Das setzt automatisch D1 (Datenbank), R2 (Storage) und Workers auf. Voraussetzung: Ein Cloudflare-Account, ab dem Free-Tier — für vollen Plugin-Support (Sandboxing) wird der Workers Paid Plan (5 $/Monat) benötigt.


Was fehlt noch?

EmDash ist Version 0.1 und Public Beta – das merkt man an einigen Stellen. Multisite gibt es noch nicht, das Plugin-Ökosystem besteht fast ausschließlich aus First-Party-Plugins, und die Doku hat noch Lücken.

Andererseits: Das Repo ist erst wenige Tage alt, hat bereits 34 Releases, 17 Contributors und über 7.000 Stars. Die Entwicklungsgeschwindigkeit ist bemerkenswert hoch.


Fazit

EmDash macht vieles richtig, was WordPress seit Jahren falsch macht – kein PHP, strukturierter Content statt serialisiertem HTML, sandboxed Plugins, passwortloser Login, und es läuft überall: Cloudflare, eigener Server, Docker auf Coolify.

Für einen produktiven Einsatz würde ich noch ein paar Monate warten – Beta ist Beta. Aber zum Ausprobieren, Mitentwickeln oder als Basis für ein neues Projekt ist EmDash schon heute sehr spannend.

Repo: github.com/emdash-cms/emdash