Mermaid-Gantt-Diagramme: Syntax, Fallstricke und der Weg zurück in einen Editor
Mermaid-Gantt-Blöcke werden in GitHub, GitLab, Notion und Obsidian direkt gerendert, das macht sie zum einfachsten Weg, einen Terminplan dorthin zu bringen, wo die Arbeit ohnehin stattfindet: ins Repository, prüfbar im Pull Request. Sie zu bearbeiten ist dagegen mühsam: Ein Datum verschieben heißt, jede after-Kette dahinter von Hand neu abzuleiten. Hier stehen die Syntax Feld für Feld, ein vollständiges Beispiel zum Einfügen, die Fallstricke, die tadellos rendern und trotzdem falsch sind, und der fehlende Schritt: visuell bearbeiten und den Text zurückbekommen.
Die Syntax in einem Durchgang
Ein Gantt-Block beginnt mit dem Schlüsselwort gantt und einigen Kopfzeilen, danach folgen section-Überschriften mit Vorgangszeilen darunter. Die Einrückung ist Konvention und nicht Grammatik, Mermaid liest den Block auch ohne sie.
Eine Vorgangszeile besteht aus einem Namen, einem Doppelpunkt und dann kommagetrennten Feldern:
Name des Vorgangs :tag, id, start, dauer
- Tags, beliebig viele aus
done,active,critundmilestone, in beliebiger Reihenfolge. Optional. - id, ein einzelnes Wort ohne Leerzeichen, nur nötig, wenn sich etwas anderes über
afterauf diesen Vorgang bezieht. - start, ein Datum, oder
after eineId, oder ganz weggelassen, um an den Vorgang darüber anzuschließen. - dauer,
5d,2w, oder ein zweites absolutes Datum.
Wissenswerte Kopfzeilen: dateFormat (wie die Daten in Ihrer Datei geschrieben sind), excludes weekends, title und axisFormat (wie die Achse beschriftet wird, in strftime-Codes). Die Felder werden nach ihrer Form erkannt und nicht streng nach ihrer Position, deshalb funktionieren :done, spec, 2026-03-02, 5d und :spec, done, 2026-03-02, 5d gleichermaßen.
Ein Beispiel, das Sie in eine README einfügen können
Ein vollständiger, gültiger Block für eine reale Aufgabe: die Ablösung der internen Zeiterfassungs-API eines mittelständischen Unternehmens, Version 1 auf Version 2. Er nutzt Abschnitte, absolute Daten, after-Ketten, alle Tags, einen Meilenstein sowie ausgeschlossene Wochenenden und Feiertage. Fügen Sie ihn in einen Codeblock mit der Sprache mermaid in einer beliebigen Markdown-Datei auf GitHub ein, und er wird gerendert.
gantt
title Abloesung der Zeiterfassungs-API (v1 auf v2)
dateFormat YYYY-MM-DD
axisFormat %d.%m.
excludes weekends 2026-04-03 2026-04-06 2026-05-01
section Analyse
Bestand v1 erheben :done, best, 2026-03-02, 5d
OpenAPI-Spezifikation :done, spec, after best, 4d
Spezifikation abstimmen :active, abst, after spec, 2d
section Datenschutz und Mitbestimmung
Datenschutz-Folgenabschaetzung :crit, dsfa, after abst, 8d
Betriebsvereinbarung verhandeln :crit, bv, after dsfa, 15d
Betriebsvereinbarung unterzeichnet :milestone, bvm, 2026-04-24, 0d
section Umsetzung
Authentifizierungsdienst :auth, after bvm, 10d
Fachendpunkte :fach, after auth, 12d
Client-SDK neu erzeugen :sdk, after fach, 3d
section Umstellung
Testbetrieb :test, after sdk, 5d
Abschaltung v1 :ab, after test, 2w
Zeile für Zeile gelesen:
dateFormat YYYY-MM-DDsagt Mermaid, wie es die von Ihnen getippten Daten lesen soll. Das ist das Eingabeformat, nicht das Ausgabeformat, es zu ändern ändert die Achse nicht.axisFormat %d.%m.ist die Ausgabeseite: Die Achse liest sich als „02.03.“ statt als ISO-Datum, also so, wie ein deutscher Leser Termine erwartet. Für alles, was länger als ein Quartal läuft, ist%Vmit Kalenderwochen die bessere Wahl.excludes weekends 2026-04-03 2026-04-06 2026-05-01lässt jeden Balken über Samstag und Sonntag springen und zusätzlich über Karfreitag, Ostermontag und den 1. Mai. Das gilt für das gesamte Diagramm; es gibt keine Ausnahme je Vorgang. Wer bundeslandspezifische Feiertage braucht, Fronleichnam etwa, , hängt sie einfach an dieselbe Zeile an.Bestand v1 erheben :done, best, 2026-03-02, 5d, Tag, id, ein absoluter Beginn (ein Montag), fünf Tage. Dauern schließen den Starttag ein, dieser Vorgang endet also am Freitag, dem 6. März.after bestheißt „beginne, wennbestfertig ist“, bei ausgeschlossenen Wochenenden also am Montag, dem 9. März, und nicht am Samstag, dem 7.:crit, dsfa, ...färbt den Balken in der Farbe des kritischen Pfads. Beachten Sie: färbt, mehr dazu weiter unten.Fachendpunkte :fach, after auth, 12dträgt überhaupt kein Tag; das erste Feld ist nur eine id. Ohne Tag gilt der Vorgang als anstehende Arbeit.Betriebsvereinbarung unterzeichnet :milestone, bvm, 2026-04-24, 0dist eine Marke ohne Länge auf einem festen Datum. Meilensteine bekommen wie alles andere eine id, deshalb istafter bvmin der nächsten Zeile zulässig. Dass die Umsetzung erst nach der Unterschrift beginnt, ist hier kein Zieren: Ein System, das Arbeitszeit erfasst, unterliegt der Mitbestimmung, und ohne Betriebsvereinbarung darf es nicht in Betrieb gehen.2wsind zwei Wochen. Mermaid akzeptiert auchhundm, was hier selten hilft.
Die Leerzeilen zwischen den Abschnitten sind Dekoration, Mermaid ignoriert sie, und unser Import tut es ebenso. Lassen Sie sie trotzdem stehen; ein Block mit vierzig Vorgängen ist ohne sie in einem Diff nicht lesbar.
Referenz der Vorgangszeile
Jedes Feld, was es bewirkt und wie es in der Praxis aussieht.
| Feld oder Zusatz | Beispiel | Wirkung |
|---|---|---|
id | best | Ein einzelnes Wort, das den Vorgang benennt, damit after sich darauf beziehen kann. Keine Leerzeichen, keine Satzzeichen. Optional, solange nichts von dem Vorgang abhängt. |
after | after best | Beginnt, wenn der genannte Vorgang endet. Nur Ende-Anfang, ohne Zeitabstand. Mehrere ids sind erlaubt, after a b wartet auf den späteren der beiden. |
done | :done, best, … | Zeichnet den Balken als abgeschlossen. Ohne Prozentwert, 100 Prozent und „im Grunde fertig“ sehen identisch aus. |
active | :active, abst, … | Zeichnet den Balken als laufend. Ebenfalls ohne jede Zahl daran. |
crit | :crit, dsfa, … | Färbt den Balken als kritisch. Eine Behauptung, die Sie tippen, und nichts, was Mermaid ableitet, nichts prüft sie gegen das Abhängigkeitsnetz. |
milestone | :milestone, bvm, … | Zeichnet eine Raute statt eines Balkens. Sinnvoll nur zusammen mit 0d. |
| Dauereinheiten | 5d · 2w · 8h | Tage, Wochen, Stunden (auch m). Einschließlich des Starttags: 5d ab Montag endet am Freitag. |
| Enddatum | 2026-03-02, 2026-03-06 | Ein zweites Datum statt einer Dauer, für ein von außen festgelegtes Ende. |
dateFormat | dateFormat YYYY-MM-DD | Wie die Daten in der Datei gelesen werden. Kopfzeile, einmal je Diagramm. |
axisFormat | axisFormat %d.%m. | Wie die Achse beschriftet wird, in strftime-Codes. Rein kosmetisch. |
excludes | excludes weekends | Arbeitsfreie Tage. Nimmt auch einzelne Daten (excludes 2026-04-06) und Wochentagsnamen. Gilt für das ganze Diagramm. |
Vier Dinge, über die Sie stolpern werden
1. Dauern schließen den Starttag ein. 5d ab Montag, dem 5., läuft bis Freitag, den 9., nicht bis zum 10. Ein Fehler um eins verschiebt hier jeden Vorgang der Datei und wird trotzdem tadellos gerendert, das ist die schlimmste denkbare Fehlerart, weil nichts kaputt aussieht.
2. after zusammen mit excludes weekends ist die eigentliche Fehlerquelle. Endet ein Vorgänger an einem Freitag, beginnt sein Nachfolger am Montag, nicht am Samstag. Jedes Werkzeug, das after durch Addition eines einzelnen Kalendertages auflöst, legt Vorgänge klammheimlich auf Wochenenden in einer Datei, die genau das verbietet, und ab dort läuft jedes weitere Datum weg. Unseres tat das kurzzeitig. Die Korrektur führt die Rechnung über den Arbeitskalender, damit der Import mit dem übereinstimmt, was Mermaid zeichnet; der absichernde Test prüft die Eigenschaft statt bestimmter Daten: Kein abgeleitetes Anfangs- oder Enddatum darf auf einen ausgeschlossenen Tag fallen. Daten, die Sie selbst getippt haben, bleiben dagegen stehen, wo Sie sie hingeschrieben haben, Wochenende hin oder her, das ausdrückliche Datum einer Autorin stillschweigend zu verschieben ist die falsche Art von Hilfsbereitschaft.
3. Es gibt keine Maskierung. Ein Doppelpunkt beginnt die Feldliste und ein Komma trennt die Felder, aus Phase 2: Entwurf, Prüfung wird also ein Vorgang namens „Phase 2“ mit unsinnigen Feldern. Halten Sie Doppelpunkte, Kommas und Semikolons aus Vorgangsnamen heraus; beim Export ersetzen wir sie durch Leerzeichen, statt eine Zeile auszugeben, die sich nicht lesen lässt.
4. Eine unlesbare Dauer wird stillschweigend null. Schreiben Sie 3dd, erhalten Sie einen Balken der Länge null statt einer Fehlermeldung. Suchen Sie nach jeder größeren Änderung gezielt nach unsichtbaren Vorgängen.
Die Grenzen eines Diagrammformats
Mermaid gantt ist eine Darstellungssprache und keine Terminplanungsmaschine. Der Unterschied fällt in dem Moment auf, in dem das Diagramm eine Frage beantworten statt eine Antwort bebildern soll.
- Keine Ressourcen. Kein Feld für die zuständige Person, keine Kosten, kein Aufwand. Sie können in Mermaid niemanden überlasten, weil Mermaid nicht weiß, dass es Menschen gibt.
- Kein Puffer und kein berechneter kritischer Pfad.
critist eine Farbe, die Sie von Hand vergeben. Nichts läuft das Abhängigkeitsnetz ab, nichts rechnet frühe und späte Lagen aus, nichts sagt Ihnen, welche Kette das Enddatum bestimmt. Ein Diagramm, in dem jeder Balkencritträgt, ist genauso gültig wie eines, in dem es keiner tut. - Kein Basisplan. Es gibt keine Stelle, an der stünde, was der Plan im vergangenen Monat gesagt hat, also auch keine Abweichung und keinen messbaren Verzug.
- Nur Ende-Anfang.
afterist eine EA-Verknüpfung ohne Zeitabstand. Anfang-Anfang, Ende-Ende, Anfang-Ende und jeder Zeitabstand haben keinen Platz. Echte Pläne stecken voller Sätze wie „der Test beginnt drei Tage nach dem Beginn der Entwicklung“, in Mermaid wird daraus ein fest eingetragenes Datum, und die Verknüpfung ist verschwunden. - Kein Fortschritt in Prozent. Ein Vorgang bei 40 Prozent und einer bei 90 Prozent sind beide schlicht
active. - Flache Abschnitte. Keine verschachtelten Gruppen, eine Gliederung mit mehr als einer Ebene wird beim Einlesen also flach.
Nichts davon macht Mermaid zu einem schlechten Format. Es macht es zu einem Veröffentlichungsformat, gut darin, einen Terminplan zu zeigen, ungeeignet, einen herzuleiten. Genau deshalb zählt der Rückweg.
Visuell bearbeiten, dann den Text zurückkopieren
Mermaid rendern können viele Werkzeuge. Gefehlt hat die Gegenrichtung, Balken ziehen und die Syntax wieder herausbekommen.
- Fügen Sie Ihr Diagramm über ✨ In Gantt einfügen ein oder öffnen Sie die Datei über 📂 Öffnen, eine
.mmd-Datei oder eine.md-Datei mit eingebettetem Block, beides funktioniert. Ein Gantt-Block wird an seinem Inhalt erkannt, nicht an der Dateiendung. - Ziehen, verknüpfen und umdatieren Sie wie in jedem anderen Diagramm.
excludes weekendsschaltet den Arbeitskalender ein, sodass die erzeugten Termine zu der Datei passen, aus der sie stammen; unter Kalender ergänzen Sie die Feiertage Ihres Bundeslandes. - Setzen Sie den Haken bei Kritischer Pfad. Die schraffierten Balken sind das berechnete Ergebnis, und nicht das, was in der Datei behauptet wurde.
- Über ⬇ Export ▸ 🧜 Mermaid-Gantt (Text) erhalten Sie den aktualisierten Text, entweder über In die Zwischenablage kopieren oder als .mmd herunterladen. Zurück in die README einfügen, Diff einchecken, fertig.
Der Hin- und Rückweg verliert etwas, aber auf bekannte, langweilige Weise. Der Fortschritt wird beim Export als 100 Prozent auf done und alles zwischen 1 und 99 Prozent auf active abgebildet; beim Import kommt active als 50 Prozent zurück, eine Schätzung, auf die Sie hingewiesen werden, statt sie später in einem Statusbericht zu entdecken. Verknüpfungen, die sich nicht als after schreiben lassen, alles mit Zeitabstand und jede AA-, EE- oder AE-Beziehung, , fallen auf feste Termine zurück. Die bleiben korrekt, hören aber auf, pflegbar zu sein.
Eine Asymmetrie ist Absicht und kein Fehler: crit wird exportiert, aber niemals importiert. Auf dem Weg hinaus ist der Wert abgeleitet, der Editor hat den kritischen Pfad aus dem Abhängigkeitsnetz berechnet, das Tag ist im Moment des Schreibens also wahr. Auf dem Weg hinein ist es ein Wort, das jemand in eine womöglich wochenalte Datei getippt hat; ihm zu vertrauen hieße, eine unkritische Kette rot einzufärben. Also wird es geschrieben und danach ignoriert: Der kritische Pfad, den Sie nach einem Import sehen, ist neu berechnet und nicht behauptet.
Für alle, die Terminpläne mit einem Sprachmodell entwerfen, gibt es einen angenehmen Nebeneffekt: Lassen Sie sich Mermaid-Gantt-Syntax ausgeben, fügen Sie die Antwort ein, und Sie haben ein echtes, bearbeitbares Diagramm mit berechnetem kritischem Pfad, ohne API-Schlüssel und ohne Server.
Häufige Fragen
Wie schreibt man ein Gantt-Diagramm in Mermaid?
Beginnen Sie den Block mit gantt, ergänzen Sie dateFormat YYYY-MM-DD und darunter section-Überschriften mit Vorgangszeilen der Form „Name :tag, id, start, dauer“, zum Beispiel „Recherche :done, rec, 2026-01-05, 5d“.
Schließt 5d in Mermaid den Starttag ein?
Ja. Ein Vorgang mit 5d ab Montag, dem 5., endet am Freitag, dem 9. Diese einschließende Zählweise ist die häufigste Ursache für Fehler um einen Tag, und sie erzeugt ein Diagramm, das einwandfrei rendert, während jedes Datum um einen Tag danebenliegt.
Wie funktionieren Abhängigkeiten in Mermaid gantt?
Über „after eineId“ im Startfeld. Es ist immer eine Ende-Anfang-Verknüpfung ohne Zeitabstand; Anfang-Anfang, Ende-Ende und Abstände lassen sich nicht ausdrücken. Mehrere Vorgänger sind möglich, etwa „after a b“, der Vorgang wartet dann auf den späteren der beiden.
Überspringt after die Wochenenden?
Ja, sofern das Diagramm „excludes weekends“ enthält. Der Nachfolger eines Vorgangs, der freitags endet, beginnt dann am Montag, und die Dauer zählt in Arbeitstagen. Werkzeuge, die after durch Addition eines Kalendertages auflösen, legen Vorgänge auf Samstage in einer Datei, die das ausdrücklich verbietet.
Kann Mermaid den kritischen Pfad berechnen?
Nein. Das Tag crit ist eine Farbe, die Sie von Hand vergeben; nichts in Mermaid läuft das Abhängigkeitsnetz ab oder rechnet Puffer aus. Genau deshalb exportiert gantts.app crit, ignoriert es beim Import aber: Die Kritikalität wird aus den Abhängigkeiten neu berechnet, statt einer möglicherweise veralteten Datei geglaubt zu werden.
Kann ich ein Mermaid-Gantt-Diagramm bearbeitbar machen?
Ja. Öffnen Sie die .mmd- oder die Markdown-Datei in gantts.app, bearbeiten Sie sie visuell und holen Sie sich die aktualisierte Syntax über ⬇ Export ▸ 🧜 Mermaid-Gantt (Text) wieder heraus.
Passende Vorlagen
Passend dazu
Dieser Artikel ist auch auf Englisch verfügbar.