Mermaid Diagramming
Create professional software diagrams using Mermaid's text-based syntax.
Core Syntax Structure
All Mermaid diagrams follow this pattern:
diagramType
definition content
Key principles:
- First line declares diagram type (e.g.,
classDiagram, sequenceDiagram, flowchart)
- Use
%% for comments
- Whitespace aids readability; not required
- Typos break diagrams silently -- validate in Mermaid Live
Diagram Type Selection Guide
| Type |
When to use |
Reference |
| Class Diagram |
Domain modelling, OOP design, entity relationships |
references/class-diagrams.md |
| Sequence Diagram |
API flows, authentication, component interactions |
references/sequence-diagrams.md |
| Flowchart |
Processes, algorithms, decision trees, user journeys |
references/flowcharts-basic.md, references/flowcharts-advanced.md |
| ERD |
Database schemas, table relationships, data modelling |
references/erd-basic.md, references/erd-patterns.md |
| C4 Diagram |
Software architecture at Context, Container, Component levels |
references/c4-diagrams.md |
| State Diagram |
State machines, lifecycle states, workflow status |
references/other-diagrams.md |
| Git Graph |
Branching strategies, commit history |
references/other-diagrams.md |
| Gantt Chart |
Project timelines, scheduling, sprint planning |
references/other-diagrams.md |
| Pie/Quadrant |
Data distribution, prioritisation matrices |
references/other-diagrams.md |
Default to flowchart when the user's intent is unclear. Flowcharts cover the widest range of use cases.
Class Diagram
classDiagram
Title -- Genre
Title *-- Season
Title *-- Review
User --> Review : creates
class Title {
+string name
+int releaseYear
+play()
}
class Genre {
+string name
+getTopTitles()
}
Sequence Diagram
sequenceDiagram
participant User
participant API
participant Database
User->>API: POST /login
API->>Database: Query credentials
Database-->>API: Return user data
alt Valid credentials
API-->>User: 200 OK + JWT token
else Invalid credentials
API-->>User: 401 Unauthorized
end
Flowchart
flowchart TD
Start([User visits site]) --> Auth{Authenticated?}
Auth -->|No| Login[Show login page]
Auth -->|Yes| Dashboard[Show dashboard]
Login --> Creds[Enter credentials]
Creds --> Validate{Valid?}
Validate -->|Yes| Dashboard
Validate -->|No| Error[Show error]
Error --> Login
ERD
erDiagram
USER ||--o{ ORDER : places
ORDER ||--|{ LINE_ITEM : contains
PRODUCT ||--o{ LINE_ITEM : includes
USER {
int id PK
string email UK
string name
datetime created_at
}
ORDER {
int id PK
int user_id FK
decimal total
datetime created_at
}
State Diagram
stateDiagram-v2
[*] --> Draft
Draft --> Submitted : submit
Draft --> Cancelled : cancel
Submitted --> Processing : approve
Processing --> Shipped : ship
Shipped --> Delivered : confirm
Delivered --> [*]
Cancelled --> [*]
Detailed References
- references/class-diagrams.md - Domain modelling, relationships (association, composition, aggregation, inheritance), multiplicity, methods/properties
- references/sequence-diagrams.md - Actors, participants, messages (sync/async), activations, loops, alt/opt/par blocks, notes
- references/flowcharts-basic.md - Node shapes, connections, subgraphs
- references/flowcharts-advanced.md - Styling, comprehensive examples, patterns
- references/erd-basic.md - Entities, relationships, cardinality, attributes
- references/erd-patterns.md - Schema examples, design patterns
- references/c4-diagrams.md - System context, container, component diagrams, boundaries
- references/advanced-features.md - Configuration, layout, export options
- references/theming.md - Themes, colours, visual styling
- references/other-diagrams.md - State diagrams, git graphs, gantt charts, pie/quadrant
Best Practices
- Draft core entities first - Add 3-5 main nodes, then connect. Add attributes and detail in a second pass.
- Label every node and edge - Unlabelled arrows force readers to guess the relationship.
- Add
%% comments above complex sections - Explain why, not what. Future editors read comments before syntax.
- Split at 15 nodes - Diagrams with more than 15 nodes lose clarity. Break into focused views linked by a parent diagram.
- Store
.mmd files next to the code they describe - Keep diagrams and source in the same PR so they stay in sync.
- Set a title on every diagram - Use the
title keyword or a Markdown heading directly above the code block.
- Test in Mermaid Live before committing - Paste the diagram into mermaid.live to catch silent failures.
- Check colour contrast - Verify foreground/background pairs meet WCAG AA (4.5:1 ratio). Do not rely on colour alone to convey meaning.
Validation Loop (Required)
Every diagram passes through this generate-validate-repair cycle before output.
Step 1: Generate
Write the diagram using strict Mermaid syntax. Apply these rules during generation:
| Rule |
Wrong |
Correct |
Why |
| Escape parentheses in labels |
node[Node (example)] |
node["Node (example)"] |
Bare parentheses crash the parser |
| Quote text with special characters |
A[Price: $100] |
A["Price: $100"] |
$, %, &, <, > break parsing |
Quote the reserved word end |
A --> end |
A --> End["end"] |
Unquoted end silently breaks diagrams |
| Use HTML entities when quotes fail |
A["alert()"] |
A["alert()"] |
Nested parens inside quotes still fail |
Avoid {} in comments |
%% config: {dark} |
%% config dark theme |
Curly braces in comments break parsing |
| Use unique node IDs |
Reusing A across subgraphs |
A1, A2 for distinct nodes |
Duplicate IDs cause silent overwrites |
Step 2: Validate
Self-check the generated diagram against these failure patterns:
- Scan all node labels for unescaped special characters:
( ) { } $ % & < > #
- Check for bare
end used as a node name or label (not as a block closer)
- Verify arrow syntax matches the diagram type (e.g.,
--> for flowchart, ->> for sequence)
- Confirm diagram type keyword is spelled correctly on line 1
- Check participant/actor names for spaces (wrap in quotes if present)
If any issue is found, fix it before output. Do not ask the user to fix syntax.
Step 3: Render verification
After outputting the diagram, recommend the user verify rendering:
- Quick check: paste into Mermaid Live
- CLI validation:
npx @mermaid-js/mermaid-cli -i diagram.mmd -o test.png
- MCP tools: if a Mermaid MCP server is available, use it for in-session validation
Step 4: Repair (if rendering fails)
If the user reports a rendering failure:
- Read the error message (if available) and identify the failing line
- Check the syntax rules table above for the matching pattern
- Fix and re-output the corrected diagram
- Never output the same broken syntax twice
Configuration and Theming
Configure diagrams using frontmatter:
---
config:
theme: base
themeVariables:
primaryColor: "#ff6b6b"
---
flowchart LR
A --> B
Themes (default to default; use base for full colour control):
| Theme |
When to use |
default |
General-purpose diagrams (recommended) |
forest |
Green earth tones for environmental or organic topics |
dark |
Dark-mode pages or presentations |
neutral |
Grayscale professional documentation |
base |
Full colour customisation via themeVariables |
Layout: Default to dagre. Switch to elk when dagre produces crossed lines on 20+ node diagrams.
Look: Default to classic. Use handDrawn for informal docs or whiteboard-style presentations.
Exporting and Rendering
Platform support:
| Platform |
Status |
Notes |
| GitHub README/Issues |
Works |
Wiki rendering broken. C4 diagrams often fail. |
| GitLab |
Works |
May need cache refresh after adding new diagrams. |
| VS Code |
Works |
Requires Markdown Mermaid extension. |
| Obsidian |
Partial |
Desktop works. iOS fails entirely. Pie charts render as empty boxes. |
| Azure DevOps |
Works |
Requires ::: mermaid syntax, not backtick fences. |
| PDF export |
Fails |
Export as PNG/SVG from mermaid.live first. |
Export commands:
- Online: Mermaid Live Editor with PNG/SVG export
- CLI:
mmdc -i input.mmd -o output.png (install via npm install -g @mermaid-js/mermaid-cli)
- Docker:
docker run --rm -v $(pwd):/data minlag/mermaid-cli -i /data/input.mmd -o /data/output.png
Common Pitfalls
Syntax failures (most frequent):
- Unescaped special characters - Parentheses, brackets,
$, % in node labels crash the parser. Always quote labels containing these characters.
- Reserved word
end - Using end as a node name breaks diagrams silently. Wrap in quotes or rename.
- Misspelled diagram types -
classDiagram not classdiagram. Case matters for the type keyword.
- Wrong arrow syntax - Each diagram type uses different arrows. Flowcharts use
-->, sequence uses ->>, class uses ..>.
Platform-specific failures:
- GitHub Wiki - Mermaid rendering is broken despite documentation claiming support. Use README or Pages instead.
- Azure DevOps - Requires
::: mermaid syntax, not standard backtick fences.
- Obsidian iOS - Mermaid fails to render entirely on iOS. Desktop works.
- C4 diagrams on GitHub - C4 is experimental in Mermaid. Renders in mermaid.live but often fails on GitHub.
Structural issues:
- Overcomplexity - Split diagrams with more than 15 nodes into multiple focused views.
- Nested subgraphs - Deep nesting fails on some platforms. Keep to 2 levels maximum.
Converted and distributed by TomeVault — claim your Tome and manage your conversions.
1---2name: costa-marcello-skillkit-mermaid-diagrams3description: Mermaid Diagramming4---56# Mermaid Diagramming78Create professional software diagrams using Mermaid's text-based syntax.910<instructions>1112## Core Syntax Structure1314All Mermaid diagrams follow this pattern:1516```mermaid17diagramType18 definition content19```2021**Key principles:**22- First line declares diagram type (e.g., `classDiagram`, `sequenceDiagram`, `flowchart`)23- Use `%%` for comments24- Whitespace aids readability; not required25- Typos break diagrams silently -- validate in Mermaid Live2627## Diagram Type Selection Guide2829| Type | When to use | Reference |30|------|-------------|-----------|31| Class Diagram | Domain modelling, OOP design, entity relationships | `references/class-diagrams.md` |32| Sequence Diagram | API flows, authentication, component interactions | `references/sequence-diagrams.md` |33| Flowchart | Processes, algorithms, decision trees, user journeys | `references/flowcharts-basic.md`, `references/flowcharts-advanced.md` |34| ERD | Database schemas, table relationships, data modelling | `references/erd-basic.md`, `references/erd-patterns.md` |35| C4 Diagram | Software architecture at Context, Container, Component levels | `references/c4-diagrams.md` |36| State Diagram | State machines, lifecycle states, workflow status | `references/other-diagrams.md` |37| Git Graph | Branching strategies, commit history | `references/other-diagrams.md` |38| Gantt Chart | Project timelines, scheduling, sprint planning | `references/other-diagrams.md` |39| Pie/Quadrant | Data distribution, prioritisation matrices | `references/other-diagrams.md` |4041Default to **flowchart** when the user's intent is unclear. Flowcharts cover the widest range of use cases.4243</instructions>4445<example name="Class Diagram (Domain Model)">4647### Class Diagram48```mermaid49classDiagram50 Title -- Genre51 Title *-- Season52 Title *-- Review53 User --> Review : creates5455 class Title {56 +string name57 +int releaseYear58 +play()59 }6061 class Genre {62 +string name63 +getTopTitles()64 }65```6667</example>6869<example name="Sequence Diagram (API Flow)">7071### Sequence Diagram72```mermaid73sequenceDiagram74 participant User75 participant API76 participant Database7778 User->>API: POST /login79 API->>Database: Query credentials80 Database-->>API: Return user data81 alt Valid credentials82 API-->>User: 200 OK + JWT token83 else Invalid credentials84 API-->>User: 401 Unauthorized85 end86```8788</example>8990<example name="Flowchart (User Journey)">9192### Flowchart93```mermaid94flowchart TD95 Start([User visits site]) --> Auth{Authenticated?}96 Auth -->|No| Login[Show login page]97 Auth -->|Yes| Dashboard[Show dashboard]98 Login --> Creds[Enter credentials]99 Creds --> Validate{Valid?}100 Validate -->|Yes| Dashboard101 Validate -->|No| Error[Show error]102 Error --> Login103```104105</example>106107<example name="ERD (Database Schema)">108109### ERD110```mermaid111erDiagram112 USER ||--o{ ORDER : places113 ORDER ||--|{ LINE_ITEM : contains114 PRODUCT ||--o{ LINE_ITEM : includes115116 USER {117 int id PK118 string email UK119 string name120 datetime created_at121 }122123 ORDER {124 int id PK125 int user_id FK126 decimal total127 datetime created_at128 }129```130131</example>132133<example name="State Diagram (Order Lifecycle)">134135### State Diagram136```mermaid137stateDiagram-v2138 [*] --> Draft139 Draft --> Submitted : submit140 Draft --> Cancelled : cancel141 Submitted --> Processing : approve142 Processing --> Shipped : ship143 Shipped --> Delivered : confirm144 Delivered --> [*]145 Cancelled --> [*]146```147148</example>149150<references>151152## Detailed References153154- **[references/class-diagrams.md](references/class-diagrams.md)** - Domain modelling, relationships (association, composition, aggregation, inheritance), multiplicity, methods/properties155- **[references/sequence-diagrams.md](references/sequence-diagrams.md)** - Actors, participants, messages (sync/async), activations, loops, alt/opt/par blocks, notes156- **[references/flowcharts-basic.md](references/flowcharts-basic.md)** - Node shapes, connections, subgraphs157- **[references/flowcharts-advanced.md](references/flowcharts-advanced.md)** - Styling, comprehensive examples, patterns158- **[references/erd-basic.md](references/erd-basic.md)** - Entities, relationships, cardinality, attributes159- **[references/erd-patterns.md](references/erd-patterns.md)** - Schema examples, design patterns160- **[references/c4-diagrams.md](references/c4-diagrams.md)** - System context, container, component diagrams, boundaries161- **[references/advanced-features.md](references/advanced-features.md)** - Configuration, layout, export options162- **[references/theming.md](references/theming.md)** - Themes, colours, visual styling163- **[references/other-diagrams.md](references/other-diagrams.md)** - State diagrams, git graphs, gantt charts, pie/quadrant164165</references>166167<best-practices>168169## Best Practices1701711. **Draft core entities first** - Add 3-5 main nodes, then connect. Add attributes and detail in a second pass.1722. **Label every node and edge** - Unlabelled arrows force readers to guess the relationship.1733. **Add `%%` comments above complex sections** - Explain why, not what. Future editors read comments before syntax.1744. **Split at 15 nodes** - Diagrams with more than 15 nodes lose clarity. Break into focused views linked by a parent diagram.1755. **Store `.mmd` files next to the code they describe** - Keep diagrams and source in the same PR so they stay in sync.1766. **Set a title on every diagram** - Use the `title` keyword or a Markdown heading directly above the code block.1777. **Test in Mermaid Live before committing** - Paste the diagram into [mermaid.live](https://mermaid.live) to catch silent failures.1788. **Check colour contrast** - Verify foreground/background pairs meet WCAG AA (4.5:1 ratio). Do not rely on colour alone to convey meaning.179180</best-practices>181182<validation>183184## Validation Loop (Required)185186Every diagram passes through this generate-validate-repair cycle before output.187188### Step 1: Generate189Write the diagram using strict Mermaid syntax. Apply these rules during generation:190191| Rule | Wrong | Correct | Why |192|------|-------|---------|-----|193| Escape parentheses in labels | `node[Node (example)]` | `node["Node (example)"]` | Bare parentheses crash the parser |194| Quote text with special characters | `A[Price: $100]` | `A["Price: $100"]` | `$`, `%`, `&`, `<`, `>` break parsing |195| Quote the reserved word `end` | `A --> end` | `A --> End["end"]` | Unquoted `end` silently breaks diagrams |196| Use HTML entities when quotes fail | `A["alert()"]` | `A["alert()"]` | Nested parens inside quotes still fail |197| Avoid `{}` in comments | `%% config: {dark}` | `%% config dark theme` | Curly braces in comments break parsing |198| Use unique node IDs | Reusing `A` across subgraphs | `A1`, `A2` for distinct nodes | Duplicate IDs cause silent overwrites |199200### Step 2: Validate201Self-check the generated diagram against these failure patterns:2022031. **Scan all node labels** for unescaped special characters: `( ) { } $ % & < > #`2042. **Check for bare `end`** used as a node name or label (not as a block closer)2053. **Verify arrow syntax** matches the diagram type (e.g., `-->` for flowchart, `->>` for sequence)2064. **Confirm diagram type keyword** is spelled correctly on line 12075. **Check participant/actor names** for spaces (wrap in quotes if present)208209If any issue is found, fix it before output. Do not ask the user to fix syntax.210211### Step 3: Render verification212After outputting the diagram, recommend the user verify rendering:213- **Quick check**: paste into [Mermaid Live](https://mermaid.live)214- **CLI validation**: `npx @mermaid-js/mermaid-cli -i diagram.mmd -o test.png`215- **MCP tools**: if a Mermaid MCP server is available, use it for in-session validation216217### Step 4: Repair (if rendering fails)218If the user reports a rendering failure:2191. Read the error message (if available) and identify the failing line2202. Check the syntax rules table above for the matching pattern2213. Fix and re-output the corrected diagram2224. Never output the same broken syntax twice223224</validation>225226<configuration>227228## Configuration and Theming229230Configure diagrams using frontmatter:231232```mermaid233---234config:235 theme: base236 themeVariables:237 primaryColor: "#ff6b6b"238---239flowchart LR240 A --> B241```242243**Themes (default to `default`; use `base` for full colour control):**244245| Theme | When to use |246|-------|-------------|247| `default` | General-purpose diagrams (recommended) |248| `forest` | Green earth tones for environmental or organic topics |249| `dark` | Dark-mode pages or presentations |250| `neutral` | Grayscale professional documentation |251| `base` | Full colour customisation via `themeVariables` |252253**Layout:** Default to `dagre`. Switch to `elk` when dagre produces crossed lines on 20+ node diagrams.254255**Look:** Default to `classic`. Use `handDrawn` for informal docs or whiteboard-style presentations.256257## Exporting and Rendering258259**Platform support:**260261| Platform | Status | Notes |262|----------|--------|-------|263| GitHub README/Issues | Works | Wiki rendering broken. C4 diagrams often fail. |264| GitLab | Works | May need cache refresh after adding new diagrams. |265| VS Code | Works | Requires Markdown Mermaid extension. |266| Obsidian | Partial | Desktop works. iOS fails entirely. Pie charts render as empty boxes. |267| Azure DevOps | Works | Requires `::: mermaid` syntax, not backtick fences. |268| PDF export | Fails | Export as PNG/SVG from mermaid.live first. |269270**Export commands:**271- **Online**: [Mermaid Live Editor](https://mermaid.live) with PNG/SVG export272- **CLI**: `mmdc -i input.mmd -o output.png` (install via `npm install -g @mermaid-js/mermaid-cli`)273- **Docker**: `docker run --rm -v $(pwd):/data minlag/mermaid-cli -i /data/input.mmd -o /data/output.png`274275</configuration>276277<pitfalls>278279## Common Pitfalls280281**Syntax failures (most frequent):**282- **Unescaped special characters** - Parentheses, brackets, `$`, `%` in node labels crash the parser. Always quote labels containing these characters.283- **Reserved word `end`** - Using `end` as a node name breaks diagrams silently. Wrap in quotes or rename.284- **Misspelled diagram types** - `classDiagram` not `classdiagram`. Case matters for the type keyword.285- **Wrong arrow syntax** - Each diagram type uses different arrows. Flowcharts use `-->`, sequence uses `->>`, class uses `..>`.286287**Platform-specific failures:**288- **GitHub Wiki** - Mermaid rendering is broken despite documentation claiming support. Use README or Pages instead.289- **Azure DevOps** - Requires `::: mermaid` syntax, not standard backtick fences.290- **Obsidian iOS** - Mermaid fails to render entirely on iOS. Desktop works.291- **C4 diagrams on GitHub** - C4 is experimental in Mermaid. Renders in mermaid.live but often fails on GitHub.292293**Structural issues:**294- **Overcomplexity** - Split diagrams with more than 15 nodes into multiple focused views.295- **Nested subgraphs** - Deep nesting fails on some platforms. Keep to 2 levels maximum.296297</pitfalls>298299---300> Converted and distributed by [TomeVault](https://tomevault.io/claim/costa-marcello) — claim your Tome and manage your conversions.301<!-- tomevault:4.0:skill_md:2026-04-13 -->