Getestet mit EmDash 1.2.0 und dem Update von 1.1.0 mit der Blog-Vorlage für Cloudflare, Astro 7.3.6 und Node.js 22. Die Screenshots stammen aus einem Vorab-Build kurz vor dem Release.
Knapp eine Woche nach 1.1.0 ist EmDash 1.2 da. Und dieses Tempo hat einen Grund: Seit dem letzten Release setzen immer mehr Leute EmDash wirklich ein. Sie stolpern über Fehler, melden sie, schicken Übersetzungen und bauen Fixes oft gleich selbst. 128 Pull Requests sind so in knapp einer Woche zusammengekommen, von 24 Leuten und einem Bot. 51 davon sind von Daniel und mir, der grösste Teil des Rests kommt aus der Community. Genau so soll sich ein Open-Source-CMS anfühlen.
Das Ergebnis merkst du, sobald du einen Beitrag öffnest. Der Editor ist kein Formular mit einem Textfeld mehr, sondern eine Schreibfläche: Titel oben, Text darunter, ein Schrägstrich für jeden Block. Videos ziehst du einfach in den Text. Eine Site zieht auf eine neue Domain um, ohne dass sich danach niemand mehr anmelden kann. Und ein präparierter Alt-Text kann keine Skripte mehr im Browser deiner Redakteure ausführen.
Wir sagen dir, was davon im Alltag zählt, was du davon hast und welche neun Punkte du vor dem Update prüfen solltest. Neu bei EmDash? Dann fang mit unserem Einstieg in EmDash an und komm danach hierher zurück.
EmDash 1.2 in Kürze
- Der Editor wird zur Seite. Neue Leiste oben, Slash-Menü mit Gruppen, Griffe an jedem Block und ein ablenkungsfreier Modus mit Veröffentlichen und Live-Ansicht.
- Videos direkt im Text. Ein neuer Video-Block lädt Videos in die Mediathek und spielt sie auf der Website ab, auch in Safari.
- Domainwechsel im Admin. EmDash prüft die neue Domain, informiert alle Benutzer per E-Mail und hilft beim Passkey für die neue Adresse.
- Ein Sicherheitsfix. Über die Bearbeitungsleiste konnten Inhalte Skripte einschleusen. Allein deshalb lohnt sich das Update.
- Viel Feinarbeit für Cloudflare. Weniger Datenbankabfragen, weniger CPU-Zeit im Gratis-Plan und Schreibvorgänge, die nicht mehr abbrechen.
- Der WordPress-Import wird gründlicher. Tabellen, geplante Beiträge, Buttons und Medien-Links kommen jetzt richtig an.
Der neue Editor in EmDash 1.2
Die grösste sichtbare Änderung betrifft den Ort, an dem Redakteure den ganzen Tag arbeiten. Der Inhaltseditor ist neu als Seite aufgebaut (#3710). Der Titel steht als grosse Überschrift oben, der Text ohne Rahmen darunter. Eine Leiste über der Seite hält den Weg zurück zur Liste, den Titel des Eintrags, den Speicherstatus, „Live-Ansicht“, „Vorschau“ und Veröffentlichen. Im ablenkungsfreien Modus kommen Verwerfen und Planen dazu.

Der ablenkungsfreie Modus mit der neuen Leiste.
Wer viel schreibt, merkt die Details:
- Schrägstrich-Menü:
/öffnet die Blöcke, gruppiert und mit der passenden Markdown-Abkürzung daneben. Die Suche versteht Abkürzungen wie/blfür die Aufzählung und Markdown wie/#. - Griffe an jedem Block: Fährst du mit der Maus über einen Absatz, erscheinen links ein Plus und ein Griff. Das Plus fügt darunter einen Block ein, der Griff verschiebt ihn oder öffnet ein Menü mit Umwandeln, Ausrichten, Duplizieren, Verschieben und Löschen.
- Tastatur: Enter im Titel springt in den Text, Escape markiert den aktuellen Block, die Pfeiltasten wandern dann von Block zu Block. Alles auswählen markiert zuerst nur den aktuellen Block und beim zweiten Mal das ganze Dokument.
- Links: Ein Klick auf einen Link zeigt, wohin er führt, mit Bearbeiten und Entfernen. Eine nackte Domain wie
example.combekommt automatischhttps://. - Schmale Bildschirme: Auf Tablet und Handy zeigt die Leiste nur noch Symbole, damit sie auf eine Zeile passt.

Das Slash-Menü zeigt zu jedem Block das Markdown-Kürzel. Einige neue Texte sind im deutschen Admin noch englisch.

Plus und Griff erscheinen, sobald die Maus über einem Block steht. Darunter ein leerer Video-Block.
Einige neue Texte sind im deutschen Admin noch englisch, etwa „Basic blocks“ oder „Upload or choose a video“. Übersetzungen ziehen bei EmDash meist kurz nach; Daniel hat die deutschen Texte zuletzt am 4. Oktober vervollständigt (#3835).
Kleinere Fixes rund um den Editor:
- Neue Einträge starten mit den Standardwerten der Felder. Bisher war ein Schalter mit
defaultValue: truebeim Anlegen trotzdem aus (#3758). - Ein Eintrag, der nicht geladen werden kann, zeigt eine Fehlerseite statt eines leeren Bildschirms (#3878).
- Der Feld-Editor bleibt offen und zeigt die Fehlermeldung, wenn der Server eine Änderung ablehnt (#3701).
- „Ausstehende Änderungen“ erscheint in der Liste nur noch bei Einträgen, die schon einmal veröffentlicht waren (#3010).
Der Video-Block: Videos direkt im Text
Bisher brauchte ein Video im Text ein Plugin oder einen HTML-Block. Jetzt gibt es einen eigenen Video-Block (#3827). /video öffnet die Mediathek, dort wählst du ein Video oder lädst eines hoch. Videodateien, die du in den Text ziehst oder einfügst, landen ebenfalls in der Mediathek und stehen dann an der Stelle, an der du sie fallen gelassen hast.
Ich habe ein vier Sekunden langes Testvideo hochgeladen und den Beitrag veröffentlicht. Auf der Website erscheint es mit dem Player des Browsers, ohne Änderung an der Blog-Vorlage.

Das Testvideo auf der Website. Die Vorlage braucht dafür keine Änderung.
Dazu passen zwei Fixes an der Auslieferung von Medien. Videos aus der Mediathek spielen jetzt auch in Safari und auf iPhones und lassen sich vorspulen, weil EmDash Teilanfragen beantwortet (#3828). Und Bilder und Dateien senden ETag und Last-Modified, sodass der Browser bei einem erneuten Besuch nur kurz nachfragt, statt alles neu zu laden (#3855).
Uploads sind standardmässig auf 50 MiB begrenzt. Für längere Videos ist ein Videodienst oder ein Plugin weiter die bessere Wahl.
Listen mit Seitenzahlen
Jede Liste im Admin hat jetzt Seitenzahlen wie die Mediathek (#3773). Unten stehen der Bereich, die Wahl zwischen 20, 50 und 100 Einträgen pro Seite und die Seitensteuerung. Eine Sammlung lädt beim Öffnen 20 Einträge statt 100, und der Papierkorb zählt alle Einträge statt bei 50 aufzuhören. Eine Auswahl bleibt beim Blättern erhalten.

Die neue Fusszeile der Listen. Bei grossen Sammlungen öffnet die Liste spürbar schneller.
Domain ändern ohne Passkey-Chaos
Eine Site auf eine neue Domain zu ziehen, war bei EmDash bisher heikel, weil Passkeys an die Adresse gebunden sind, unter der sie angelegt wurden. EmDash 1.2 baut dafür einen eigenen Ablauf (#3744):
- Domain ändern: Unter Einstellungen → Allgemein prüft ein Dialog, ob die neue Domain die Site wirklich ausliefert, und stellt erst dann um. Danach nutzen E-Mails, Plugins, Sitemaps,
robots.txt, hreflang, Canonical-Links und Social-Media-Bilder die neue Adresse. - Benutzer per E-Mail informieren: Eine Aktion schickt allen anderen Benutzern eine E-Mail mit einem Knopf zur Anmeldeseite unter der neuen Adresse. Dafür braucht die Site ein Plugin, das E-Mails verschickt.
- Weiter auf der neuen Adresse: Wer noch unter der alten Adresse angemeldet ist, wechselt mit „Continue on“ zur neuen, ohne E-Mail. Der Link gilt fünf Minuten und öffnet direkt die Seite, auf der man einen Passkey für die neue Adresse anlegt. Bei Anmeldung über Cloudflare Access fehlt der Knopf, weil Access die Anmeldung übernimmt.

Der neue Dialog erklärt die Schritte und warnt vor dem Passkey-Problem.
Das Feld „Website-URL“ kann man dafür nicht mehr direkt bearbeiten. Ist siteUrl in der Konfiguration gesetzt, zeigt die Seite diese Adresse an, und sie hat weiter Vorrang.
Ein Sicherheitsfix, der allein das Update wert ist
EmDash fügt angemeldeten Redakteuren eine Bearbeitungsleiste in die Website ein. Sie wurde vor dem ersten </body> im HTML eingesetzt. Weil Astro < und > in Attributen nicht maskiert, konnte ein Alt-Text mit </body> die Leiste in ein Attribut verschieben und den Rest als echtes HTML ausführen lassen (#3681).
Damit konnte veröffentlichter Inhalt eines Autors Skripte bei jedem angemeldeten Autor, Redakteur oder Admin ausführen, der die Seite ansah. Mit toolbar: "client" traf es sogar jeden Besucher. Die Leiste steht jetzt nur noch vor dem schliessenden Body-Tag eines ganzen HTML-Dokuments. Wer mehreren Leuten Schreibrechte gibt, sollte das Update nicht lange liegen lassen.
Ein zweiter Fix gehört in dieselbe Ecke. Mit einem Cache wie cacheCloudflare() konnte eine Seite, die für einen angemeldeten Benutzer erzeugt wurde, im Cache landen und an anonyme Besucher gehen, zum Beispiel ein Kommentarformular mit Name und E-Mail (#3898). Solche Antworten speichert der Cache jetzt nicht mehr.
Besser auf Cloudflare
Viele Fixes zielen auf Cloudflare Workers, wo EmDash am häufigsten läuft. An der Konfiguration ändert sich nichts, die Site wird einfach sparsamer und zuverlässiger.
Weniger Last im Gratis-Plan. Der Cron-Job, der jede Minute läuft, räumt jetzt nur noch einmal pro Stunde auf. Auf kalten Instanzen hatte er sonst die 10 Millisekunden Rechenzeit des Gratis-Plans überschritten (#3861). Die Bereinigung des 404-Protokolls liest nicht mehr bei jedem Lauf die ganze Tabelle (#3753).
Schnellere erste Aufrufe. Die Prüfung der Datenbank läuft beim Start einer neuen Instanz parallel zum Hochfahren statt davor (#3573). Widget-Bereiche kommen mit einer Abfrage statt mehreren (#3575).
Schreibvorgänge, die nicht mehr verloren gehen. Ein Worker darf nach der Antwort weiterarbeiten, aber nur, wenn die Arbeit bei waitUntil angemeldet ist. Sonst bricht Cloudflare sie ab. Genau das passierte an mehreren Stellen:
- Hooks für neue Kommentare. Ein Plugin, das Admins über neue Kommentare per E-Mail informiert, schickte deshalb nichts (#3631).
- Zähler für Weiterleitungen und Einträge im 404-Protokoll (#3287).
- „Zuletzt verwendet“ bei API-Tokens und das Aufräumen abgelaufener Anmeldedaten (#3767).
Auf dieser Site haben wir das bei den Kommentar-Hooks mit einem eigenen Plugin umgangen. Mit dem Update fällt der Umweg weg.
Grenzen von D1. D1 erlaubt pro Abfrage nur eine begrenzte Zahl von Parametern. Mehr als etwa 30 Kategorien oder Tags an einem Eintrag scheiterten deshalb, auch beim WordPress-Import (#3889), und Plugins konnten nicht mehr als 98 Einträge auf einmal lesen oder löschen (#3776). Beides ist behoben.
Für Websites: Kommentare, Bilder und Sitemaps
- Kommentare in jeder Sprache.
CommentsundCommentFormnehmen jetzt Beschriftungen entgegen und formatieren Daten in der Sprache der Seite (#3697). Diesen PR habe ich für unsere deutsche Ausgabe geschrieben, die bisher „No comments yet“ zeigte. Nach dem Absenden sagt das Formular jetzt auch, ob der Kommentar sofort erscheint oder erst geprüft wird. - Scharfe kleine Bilder. Avatare und Symbole bekommen auf hochauflösenden Bildschirmen eine doppelt so grosse Variante, und EmDash fordert keine Grössen mehr an, die über dem Original liegen (#3750).
- Sitemaps ohne Obergrenze. Bisher brach eine Sitemap stillschweigend nach 50'000 Einträgen ab. Jetzt hat jede Datei bis zu 2'000 Einträge und geht in
-2.xml,-3.xmlweiter (#3806). - Widget „Neueste Beiträge“. Es zeigt jetzt Datum und Vorschaubild (#3736) und kann mit
urlTemplateauf Beiträge verlinken, die nicht unter/posts/liegen (#1899).
Von WordPress zu EmDash: der Import wird gründlicher
Wer von WordPress umzieht, profitiert von mehreren Fixes. Was der Import bei ACF-Feldern noch nicht kann und wie wir das gelöst haben, steht im Artikel zum ACF-Import. Ob sich der Umzug für Kundenprojekte überhaupt lohnt, klärt unser Leitfaden für Agenturen.
- Links auf Medien zeigen nach dem Import auch ausserhalb von Bildblöcken auf die importierten Dateien: Hintergründe, Datei-Blöcke, Audio, Video, Links im Text und in Tabellen, Buttons und HTML-Blöcke (#3896). Schon importierte Inhalte ändert das nicht.
- Geplante Beiträge kommen als geplant an statt als Entwurf (#3895).
- Tabellen aus dem klassischen Editor werden zu Tabellen statt zu einem Absatz (#3762).
- Buttons behalten ihren Link (#3893).
- Beiträge mit tausenden verschachtelten Tags brechen nicht mehr ab (#3837, #3792).
- Der Medien-Import bleibt auf Cloudflare unter der CPU-Grenze, weil er kleinere Pakete schickt (#3751).
Für Plugin-Entwickler
- `plugin:install` und `plugin:activate` laufen jetzt auch für Plugins aus `astro.config.mjs` (#3785). Bisher liefen sie dort nie, was zum Beispiel Cron-Jobs aus
plugin:activateverhinderte. Mehr dazu unten bei „Vor dem Update prüfen“. - Admin-Seiten in Gruppen: Plugin-Seiten können mit
groupin die einklappbaren Ordner der Seitenleiste wandern (#3546). - Lesbare Berechtigungen: Alle Fähigkeiten eines Plugins haben jetzt verständliche Beschriftungen (#3732). Welche Rolle diese Berechtigungen für die Sicherheit spielen, steht im Artikel zur Plugin-Sandbox.
- Richtige Adresse:
ctx.site.urlkennt jetzt die konfigurierte Adresse und nicht nur die, unter der die Site eingerichtet wurde (#3744). - Rückmeldung bei Aktionen: Plugin-Seiten und Widgets zeigen einen Ladezustand, solange eine Aktion läuft (#3369).
Einrichtung und Admin-Sprachen
Der Website-Titel aus dem Einrichtungs-Assistenten kommt jetzt an (#3749). Den Fehler habe ich im Einsteiger-Artikel beschrieben, Daniel hat ihn behoben. Meine frisch eingerichtete Test-Site hiess danach wie eingegeben „Mein Blog“ statt „My Blog“. Sites, die schon eingerichtet sind, behalten ihren Titel; den änderst du wie bisher unter Einstellungen → Allgemein.
Der Admin spricht mehr Sprachen: Hebräisch mit Darstellung von rechts nach links (#3293) und europäisches Portugiesisch (#3796) sind neu, Thai, Koreanisch, Deutsch, Dänisch, Spanisch, Katalanisch, Serbisch, Indonesisch und traditionelles Chinesisch sind vollständiger. Wer nur ein oder zwei Sprachen braucht, kann den Admin mit admin.locales darauf beschränken und so kleiner bauen (#3056):
emdash({
admin: { locales: ["en", "de"] },
});Update auf EmDash 1.2: das solltest du vorher prüfen
Die meisten Änderungen brauchen nichts von dir. Neun Punkte solltest du vor dem Update anschauen:
- Plugins in `astro.config.mjs`: Beim ersten Start nach dem Update laufen
plugin:installundplugin:activatefür jedes dieser Plugins, das du im Admin nie aktiviert, deaktiviert oder beim MCP-Zugriff geändert hast. Ein Install-Hook, der auf einer Site mit bestehenden Daten Schaden anrichten kann, läuft dann. Wirft ein Hook einen Fehler, deaktiviert EmDash das Plugin. - Website-URL: E-Mail-Links nutzen jetzt die Website-URL aus den Einstellungen, wenn
siteUrlnicht gesetzt ist. Steht dort noch eine alte Domain, zeigen die Links nach dem Update dorthin. - Sitemaps: Hast du eine einzelne Sammlungs-Sitemap direkt bei der Search Console eingereicht und hat die Sammlung mehr als 2'000 Einträge, reiche
/sitemap.xmlein. Eigene Sitemap-Routen müssen die neuen Folgeseiten kennen. - Cloudflare Access: Namen aus dem Login-Anbieter überschreiben weiter die Namen im Admin, das Feld ist jetzt aber als schreibgeschützt erkennbar. Mit
syncName: falsebleiben im Admin geänderte Namen erhalten (#3875, #3877). - Eigene Video-Blöcke: Definiert ein Plugin schon einen Block namens
video, behält der Editor diesen und bietet den neuen nicht an. Wer Portable Text mit eigenem TipTap-Schema bearbeitet, braucht einenvideoBlock-Knoten. - Links auf mehrsprachigen Sites: Bei Einträgen in einer Sprache mit Präfix enthält
entry.idjetzt immer das Präfix, etwaen/mein-beitrag. Auf Cloudflare fehlte es bisher manchmal, und zwar nur in Produktion, nicht inastro dev(#3922). Baut deine Site Links ausentry.id, nimm dafürentry.data.slug. - Datum bei Kommentaren:
Commentsformatiert Daten jetzt in der Sprache der Seite statt immer im amerikanischen Format. Willst du das alte Format behalten, giblocale="en-US"mit (#3697). - Seeds ohne Inhalte:
emdash seed --no-contentüberspringt jetzt wie dokumentiert Inhalte, Autoren und Begriffe. Die Schreibweise--noContent, die bisher als einzige funktionierte, erkennt EmDash nicht mehr. Passe Skripte entsprechend an (#3525). - Bilder hinter einem Proxy: Setzt du die öffentliche Adresse mit
EMDASH_SITE_URLoderSITE_URL, optimiert EmDash jetzt auch lokal gespeicherte Bilder. Die Variable muss dafür schon beimastro buildgesetzt sein, zur Laufzeit allein reicht nicht (#3781).
So aktualisierst du auf EmDash 1.2
Einen Update-Knopf im Admin gibt es nicht. Ein Update ist ein Deployment: Du hebst die Pakete im Projekt an und stellst die Site neu online. Deine Inhalte bleiben dabei in der Datenbank.
Neu gibt es dafür einen eigenen Befehl, upgrade-emdash (#3804). Du rufst ihn im Projektordner auf und stellst die Site danach wie gewohnt online:
npx upgrade-emdash@latest
npm run deployDer Befehl findet alle Pakete von EmDash im Projekt, also emdash und alles, was mit @emdash-cms/ beginnt, und hebt sie zusammen an. Danach installiert er mit deinem Paketmanager und schreibt die Datei .emdash/UPGRADE.md. Darin stehen alle Changelog-Einträge zwischen deiner und der neuen Version und ob eine Migration dazukommt, gedacht als Arbeitsauftrag für dich oder einen KI-Agenten. Geht unterwegs etwas schief, stellt er die geänderten Dateien wieder her. Code ändern, Migrationen ausführen oder deployen tut er nicht. Mit --dry-run zeigt er nur den Plan: Auf dieser Site meldete der Probelauf nach 7 Sekunden zwei Pakete von 1.1.0 auf 1.2.0 und 67 Changelog-Einträge, ohne eine Datei anzufassen.
Von Hand geht es weiterhin, bei einer Site aus der Cloudflare-Vorlage mit zwei Befehlen:
npm install emdash@latest @emdash-cms/cloudflare@latest
npm run deployIn meinem Test mit der Blog-Vorlage lief das Update von 1.1.0 auf 1.2.0 ohne Überraschung: npm install brauchte 26 Sekunden, eine neue Migration kam nicht dazu, die Datenbank blieb bei 90, und alle acht Beiträge waren danach noch da.
Nutzt du weitere Pakete, die mit @emdash-cms/ beginnen, etwa Plugins, hebst du sie im selben Schritt an. Teste das Update zuerst lokal mit npm run dev oder auf einer Vorschau, bevor du es live schaltest. Wie du vorher einen Sicherungspunkt setzt, was beim ersten Aufruf mit der Datenbank passiert und wie du im Notfall zurückkommst, zeige ich Schritt für Schritt in EmDash aktualisieren. Wie das Projekt aufgebaut ist und was deploy genau macht, steht im Einstieg in EmDash.
Und bei dir?
Hast du schon auf EmDash 1.2 aktualisiert? Welche Änderung hilft dir im Alltag am meisten, und wo hakt es noch? Schreib es unten in die Kommentare. Daniel und ich sind beide Maintainer bei EmDash und lesen mit: Was du hier meldest, nehmen wir direkt ins Projekt mit.
Änderungen an diesem Artikel
- : Den neuen Update-Befehl upgrade-emdash und drei weitere Punkte vor dem Update ergänzt.

Kommentare
No comments yet
Erstkommentare erscheinen nach unserer Freigabe. Was mit deinen Angaben passiert