EmDash 1.4: ein aufgeräumter Admin und weniger verlorene Änderungen

Getestet mit EmDash 1.4.0 und dem Update von 1.3.1 mit der Blog-Vorlage für Cloudflare und Node.js 22.

EmDash 1.3 hat das Arbeiten im Team möglich gemacht. EmDash 1.4, erschienen am 29. Oktober 2026, macht es angenehmer. Du kannst Bereiche des Admins ausblenden, die deine Redaktion nie braucht. Änderungen gehen nicht mehr still verloren, wenn zwei gleichzeitig speichern oder du den Editor zu schnell verlässt. Und für Sites auf Cloudflare gibt es eine Suche mit Cloudflare AI Search als eigenes Plugin.

Seit 1.3.1 sind 115 Änderungen zusammengekommen, von 23 Leuten und zwei Bots. 24 davon sind von Daniel und mir. Es ist ein kleineres Update als 1.3, mit einer neuen Funktion im Kern, einem neuen Plugin und vielen Fixes. Ich sage dir, was davon für dich zählt, was ich beim Update erlebt habe und was du vorher prüfen solltest. Neu bei EmDash? Dann fang mit dem Einstieg in EmDash bei The Weekly Dash an.

EmDash 1.4 in Kürze

  • Für Redaktionen: Bereiche wie Kommentare oder Weiterleitungen lassen sich ausblenden, und die Aktionen in den Inhaltslisten stecken in einem Menü.
  • Gegen verlorene Arbeit: Zwei gleichzeitige Saves überschreiben sich nicht mehr, und wer den Editor direkt nach dem Tippen verlässt, verliert nichts.
  • Für Sites auf Cloudflare: eine KI-Suche als Plugin, weniger Abfragen auf D1 und keine veralteten Seiten mehr nach dem Löschen.
  • Für Menüs: keine toten Links auf Beiträge im Papierkorb, und Übersetzen klappt auch bei grossen Menüs auf D1.
  • Für alle Sprachen: deutlich mehr Übersetzungen im Admin, darunter der deutsche Versionsverlauf.

Ein Admin nur mit dem, was du brauchst

Ein Blog ohne Kommentare braucht keinen Menüpunkt Kommentare. Bisher zeigte EmDash trotzdem alle eingebauten Bereiche, und Redakteure klickten sich durch Weiterleitungen, Widgets und Abschnitte, die auf ihrer Site nichts tun. Mit 1.4 legst du in astro.config.mjs fest, was verschwindet (#3856). Diesen PR habe ich geschrieben:

emdash({
	// ...
	admin: { hiddenNavItems: ["comments", "redirects", "widgets", "sections", "import"] },
}),

Möglich sind calendar, media, comments, menus, redirects, widgets, sections, bylines und import. Ein Tippfehler bricht den Build ab, statt still nichts zu tun. Die Bereiche verschwinden aus der Seitenleiste und der Befehlspalette. Gesperrt sind sie damit nicht: Wer die nötige Rolle hat, erreicht Seiten und API weiterhin über die Adresse. Es ist Aufräumen, keine Rechteverwaltung.

Das Dashboard von EmDash 1.4 im deutschen Admin. Die Seitenleiste zeigt Dashboard, Kalender, Pages, Posts, Medien, Menüs, Categories, Tags, Autorenangaben und darunter die Admin-Bereiche. Kommentare, Weiterleitungen, Widgets, Abschnitte und Import fehlen, weil sie ausgeblendet sind.

In den Inhaltslisten sind die Knöpfe am Ende jeder Zeile in ein Menü „…“ gewandert (#4446). Darin stehen Bearbeiten, Duplizieren und In den Papierkorb verschieben, bei veröffentlichten Einträgen auch der Link zur Seite. Ein Klick auf den Titel öffnet den Eintrag wie bisher.

Die Beitragsliste von EmDash 1.4. In einer Zeile ist das Menü „…“ geöffnet, mit den Einträgen Bearbeiten, Duplizieren und In den Papierkorb verschieben.

Kleinere Dinge im Admin:

  • Der Papierkorb bei Menüeinträgen und Widgets löscht nicht mehr beim ersten Klick, sondern fragt vorher (#4434).
  • Eine Adresse im Admin, die es nicht gibt, zeigt jetzt eine Fehlerseite mit Seitenleiste und Weg zurück statt einer nackten Zeile „Not Found“ (#4433).
  • Der Dialog zum Planen schlägt die nächste volle Stunde vor und sagt, was fehlt, wenn Datum oder Uhrzeit nicht stimmen. Bisher tat der Knopf in diesem Fall einfach nichts (#4307).
  • Wer admin.logo und admin.siteName gesetzt hat, sieht beides jetzt auch im Einrichtungsassistenten und im Willkommensdialog statt der Marke EmDash (#4315, #4165).
  • Fehlermeldungen erscheinen wieder rot statt neutral (#4303).
Der Dialog „Veröffentlichung planen“ in EmDash 1.4 mit einem Kalender für November 2026, einer Uhrzeit und der Zeitzone Europe/Zurich. Unten die Knöpfe Abbrechen und Planen.

Keine still verlorenen Änderungen mehr

Das Unangenehmste an einem CMS ist Arbeit, die weg ist, ohne dass es jemand merkt. Daniel hat in 1.4 drei solche Stellen geschlossen:

  • Zwei Saves gleichzeitig. Speicherten zwei Clients denselben Eintrag auf Basis derselben Fassung fast im selben Moment, etwa zwei KI-Agenten über MCP oder ein Skript mit emdash content update --rev, meldeten beide Erfolg, und der erste war still überschrieben. Jetzt bekommt der zweite 409 CONFLICT, wie bisher schon jeder Save auf einer veralteten Fassung. Das gilt für D1, Durable Objects und PostgreSQL (#4286).
  • Editor zu schnell verlassen. Wer direkt nach dem Tippen auf eine andere Seite im Admin klickte, verlor die letzten Änderungen. Jetzt schickt der Editor sie vor dem Wechsel ab, und klappt das nicht, fragt er nach (#4298).
  • Hin und zurück wechseln. Wechselte man zu einem anderen Eintrag und zurück, während das automatische Speichern noch unterwegs war, konnte eine ältere Kopie die neuen Änderungen überschreiben. Auch das ist behoben (ebenfalls #4298).

Dazu kommen Felder, die beim Speichern nicht mehr stolpern: Ein leeres optionales Datumsfeld führt nicht mehr zu „Invalid input“, auch nicht in neuen Zeilen eines Wiederholungsfelds (#4425). Ein leeres Bild- oder Dateifeld wird als null gespeichert statt als leeres Bildobjekt, das sich bei jedem Save wieder änderte (#3129). Und beim Tippen in einer Bildunterschrift springt der Cursor nicht mehr ans Ende (#4368).

Suche mit Cloudflare AI Search

Neu ist das Plugin @emdash-cms/plugin-ai-search (#4071). Es legt veröffentlichte Inhalte und Autorenprofile in einen Index von Cloudflare AI Search, hält ihn bei jeder Änderung aktuell und bringt eine Komponente AiSearch mit Suchknopf und Dialog mit. Was in den Index kommt, wählst du in einem Assistenten im Admin. Auf Workers verbindet es sich über ein Binding, auf jeder anderen Plattform, auch Node.js, über einen API-Token von Cloudflare (#4310).

Das Plugin ersetzt aiSearch aus @emdash-cms/cloudflare/plugins. Wer das bisher nutzt, findet den Wechsel und die Grenzen für API-Tokens in der Anleitung zum Plugin. Ausprobiert habe ich es noch nicht: The Weekly Dash, das Blog von Daniel und mir, sucht weiter mit der eingebauten Suche.

Schneller und verlässlicher auf Cloudflare

Weniger Abfragen und ein Cache, der nicht lügt

  • Autoren in einer Abfrage. Sites mit eigenen Feldern für Autoren oder mit Einträgen, die einen Autor, aber keine ausdrückliche Autorenangabe haben, sparen auf D1 pro Seite zwei bis sechs Abfragen, die nacheinander liefen (#4167). Jede davon ist eine Fahrt zur Datenbank. Wie viel das je nach Region ausmacht, steht in D1-Region und Ladezeit.
  • Widget-Bereiche im Object Cache. Mit eingeschaltetem Object Cache fragen Widget-Bereiche nicht mehr bei jedem Aufruf die Datenbank. Änderungen im Admin, durch einen Seed oder einen Umzug leeren ihn. Diesen PR habe ich geschrieben (#3596).
  • Kein `304` mehr für veraltete Seiten. EmDash schickte bisher einen Last-Modified-Header aus dem Datum des Eintrags. Cloudflare antwortete darauf mit 304 Not Modified, auch wenn sich eine Liste auf der Seite geändert hatte oder ein Beitrag gelöscht war, und Leser sahen die alte Fassung. Jetzt fällt der automatische Header weg (#4243). Was das für eigene Vorlagen heisst, steht unten unter den Punkten zum Prüfen.

Was 1.4 nicht ändert: Beim Veröffentlichen leert EmDash weiterhin alle Seiten mit einer Beitragsliste. Warum das auf Cloudflare so viel ausmacht und was dagegen hilft, habe ich bei The Weekly Dash in Kalter Cache statt Cold Start gemessen.

Fixes für Cloudflare

  • Menüs auf D1. Grössere Menüs liessen sich auf D1 nicht übersetzen, und zurück blieb ein leeres übersetztes Menü. Übersetzen, Löschen und Umsortieren speichern jetzt entweder vollständig oder gar nicht (#4364).
  • Cloudflare Access und KV. Wer sich über Cloudflare Access anmeldet, schrieb bei jeder Anfrage im Admin die Session in Workers KV. Das konnte das tägliche Schreiblimit des Free-Plans aufbrauchen. Jetzt schreibt EmDash nur, wenn sich der Benutzer ändert (#4157).
  • Plugins in der Sandbox. Sandbox-Plugins mit email:send können auf Workers wieder Mails verschicken (#4281), und Inhalte anlegen, Begriffe setzen und Veröffentlichen klappen auch, wenn die Anfrage über mehrere Isolates läuft (#4394). Projekte mit cloudflare.config.ts, der neuen Konfiguration von @astrojs/cloudflare 15, schalten die Sandbox nicht mehr still ab. Diesen Fix habe ich geschrieben (#4278).
  • Bilder. Der Bild-Endpunkt hielt den Lesezugriff auf R2 offen, nachdem er schon mit 304 geantwortet hatte. Auch das habe ich behoben (#4186).

Menüs ohne tote Links

getMenu() lässt Einträge weg, die auf Beiträge im Papierkorb oder auf unveröffentlichte Beiträge zeigen. Bisher führten sie Leser auf eine 404-Seite. Fällt ein Eintrag weg, verschwinden seine Untereinträge mit, statt ganz oben im Menü zu landen. Im Bearbeitungsmodus bleiben die Links sichtbar, und mit Object Cache wird ein Menü neu geladen, sobald sich ein verlinkter Eintrag ändert (#4285).

WordPress-Import und Inhaltstypen

  • Eigene Beitragstypen mit Bindestrich. Typen wie team-member liessen sich über das Plugin EmDash Exporter nicht importieren: Die Sammlung team_member entstand, dann scheiterte jeder Eintrag. Jetzt zeigt die Vorschau den Namen der Sammlung, und eigene Taxonomien werden verknüpft. Diesen Fix habe ich geschrieben (#3890).
  • Slugs aus dem richtigen Feld. Hat eine Sammlung name als Titelfeld und daneben ein Feld title, etwa die Berufsbezeichnung einer Person, entstand der Slug aus title. Zwei Leute mit demselben Beruf kollidierten. Jetzt zählt das eingestellte Titelfeld (#4386).
  • Referenzfelder namens `title` oder `name`. Daniel hat drei Fehler behoben, die solche Felder auslösten: Die Suche in Inhaltslisten scheiterte (#4208), ein durchsuchbares Referenzfeld verhinderte das Anlegen von Einträgen (#4205), und die Mediathek wusste nicht, wo Bilder verwendet werden (#4296).
  • Downloads mit Namen. PDFs und andere Dateien aus der Mediathek laden mit ihrem ursprünglichen Namen herunter statt mit einer kryptischen Kennung (#3192).

Der Admin in mehr Sprachen

Daniel hat den deutschen Admin weiter vervollständigt (#4210, #4355). Die englischen Reste aus 1.3, die wir bei The Weekly Dash im Artikel zu EmDash 1.3 erwähnt hatten, sind übersetzt: der Versionsverlauf samt Wiederherstellen, das Umbenennen von Menüs, der Schalter gegen KI-Training und die Fehler im Autorenformular. Neu deutsch sind auch der Dialog beim Verlassen ohne Speichern und die Fehler beim Planen.

Vereinfachtes Chinesisch ist jetzt vollständig (#4124), brasilianisches Portugiesisch bekam 1'170 Texte dazu (#4037), Türkisch ist fertig (#3572), und Japanisch kam in vier PRs fast überall an. Niederländisch, Hindi und Indonesisch sind vollständiger. Wer den Admin in Arabisch nutzt, sieht Slugs, Adressen und Muster wieder in der richtigen Reihenfolge (#4299).

Für Entwickler und KI-Agenten

  • OAuth und `emdash login`. Abgelaufene Tokens und unbenutzte Login-Codes von emdash login und MCP-Clients bleiben nicht mehr ewig in der Datenbank (#4287). Der Token-Endpunkt antwortet mit dem Standardcode invalid_grant, damit Clients eine neue Anmeldung starten (#4459).
  • Plugins in der Sandbox. Operationen über ctx.content, ctx.taxonomies und ctx.comments musst du jetzt abwarten, bevor eine Route oder ein Hook endet. Arbeit, die die Anfrage überdauert, funktioniert über diese Verbindung nicht mehr (#4394).
  • `site import`. Der Import scheitert nicht mehr mit COLLECTION_EXISTS, wenn eine von Hand gelöschte Sammlung noch aufgeräumt wird (#4380).
  • Build. Abhängigkeiten wie zustand/traditional brechen den Build nicht mehr ab (#4276).

Update auf EmDash 1.4: das solltest du vorher prüfen

Eine neue Datenbank-Migration bringt 1.4 nicht mit. Diese sechs Punkte solltest du vor dem Update anschauen:

  1. Entwürfe in Menüs: getMenu() lässt Einträge weg, die auf Entwürfe oder Beiträge im Papierkorb zeigen, samt ihren Untereinträgen. Hast du Menüs absichtlich mit Entwürfen gebaut, etwa um angekündigte Teile zu zeigen, verschwinden diese Einträge. Ein eigener Link bleibt stehen (#4285).
  2. `cacheHint.lastModified`: EmDash füllt den Wert nicht mehr aus. Für das angezeigte Änderungsdatum nimmst du entry.data.updatedAt. Seiten, die sich auf den automatischen Header verlassen haben, verlieren auch das automatische Cache-Control: no-cache von Astro. Setze es selbst, wenn Browser bei jedem Besuch nachfragen sollen (#4243).
  3. Leere Bild- und Dateifelder über die API: Schickst du "" an ein Pflichtfeld für ein Bild oder eine Datei, bekommst du jetzt einen Fehler statt eines leeren Bilds. Der Admin ist nicht betroffen (#3129).
  4. Gleichzeitige Saves: Skripte oder Agenten, die parallel denselben Eintrag speichern, bekommen jetzt 409 CONFLICT. Lies den Eintrag neu und speichere noch einmal (#4286).
  5. Fehlgeschlagene Menü-Übersetzungen: Ist das Übersetzen eines Menüs auf D1 früher gescheitert, lösche das leere übersetzte Menü und übersetze noch einmal (#4364).
  6. Mediennutzung: Hast du eine Sammlung mit einem Referenzfeld title oder name, öffne Einstellungen → Media usage tracking und warte, bis dort Ready steht. Steht Needs attention, repariere die Sammlung einmal mit npx emdash media repair-usage --collection <sammlung> (#4296).

So aktualisierst du auf EmDash 1.4

Ein Update ist ein Deployment: Du hebst die Pakete im Projekt an und stellst die Site neu online. Deine Inhalte bleiben in der Datenbank. Am einfachsten geht das mit upgrade-emdash:

npx upgrade-emdash@latest
npm run deploy

Ich habe das an einer Kopie unserer Testsite mit der Blog-Vorlage für Cloudflare ausprobiert. Der Probelauf mit --dry-run meldete zwei Pakete von 1.3.1 auf 1.4.0 und 26 Changelog-Einträge. Das echte Update brauchte 29 Sekunden, brachte keine neue Migration, und der Build lief danach ohne Fehler durch. Danach habe ich hiddenNavItems eingeschaltet, daher stammen die Bilder oben.

Von Hand geht es weiterhin mit zwei Befehlen:

npm install emdash@latest @emdash-cms/cloudflare@latest
npm run deploy

Halte emdash und @emdash-cms/cloudflare auf derselben Version. Auf Cloudflare startet jeder Deploy mit einem leeren Cache, ausser du hast cross_version_cache eingeschaltet. Wie du vorher einen Sicherungspunkt setzt und im Notfall zurückkommst, zeige ich Schritt für Schritt in EmDash aktualisieren.

Und bei dir?

Welche Bereiche blendest du aus, und hat dich schon einmal ein überschriebener Save erwischt? Schreib es mir auf LinkedIn oder per Mail. Daniel und ich sind beide Maintainer bei EmDash und lesen mit: Was du hier meldest, nehmen wir direkt ins Projekt mit.