Render Mermaid diagram syntax as beautiful Unicode art in the terminal
Project description
termaid
Terminal-native Mermaid rendering for Python.
Render Mermaid diagrams as Unicode art directly in your terminal. Pure Python, zero dependencies.
Features
- 7 diagram types: flowcharts, sequence, class, ER, state, block, and git graphs
- Zero dependencies: pure Python, nothing to install beyond the package itself
- Rich and Textual integration: colored output and TUI widgets with optional extras
- 6 color themes: default, terra, neon, mono, amber, phosphor
- ASCII fallback: works on any terminal, even the most basic ones
- Pipe-friendly CLI:
cat diagram.mmd | termaidjust works
Why?
Mermaid is great for documentation, but rendering it usually means spinning up a browser or calling an external service. termaid lets you render diagrams over SSH, in CI logs, inside TUI apps, or anywhere you have a Python environment. It was built because the existing tools in this space, like mermaid-ascii (Go) and beautiful-mermaid (TypeScript), don't offer a native Python library you can import and call directly.
Install
pip install termaid
Quick start
CLI
termaid diagram.mmd
echo "graph LR; A-->B-->C" | termaid
termaid diagram.mmd --theme neon
termaid diagram.mmd --ascii
Python
from termaid import render
print(render("graph LR\n A --> B --> C"))
# Colored output (requires: pip install termaid[rich])
from termaid import render_rich
from rich import print as rprint
rprint(render_rich("graph LR\n A --> B", theme="terra"))
# Textual TUI widget (requires: pip install termaid[textual])
from termaid import MermaidWidget
widget = MermaidWidget("graph LR\n A --> B")
Supported diagram types
Flowcharts
All directions supported: LR, RL, TD/TB, BT.
graph TD
A[Start] --> B{Is valid?}
B -->|Yes| C(Process)
C --> D([Done])
B -->|No| E[Error]
┌─────────────┐
│ │
│ Start │
│ │
└──────┬──────┘
│
│
▼
┌──────◇──────┐
│ │
│ Is valid? │
│ │
└──────◇──────┘
│
│
╰──────────────────╮
Yes│ │No
▼ ▼
╭─────────────╮ ┌─────────────┐
│ │ │ │
│ Process │ │ Error │
│ │ │ │
╰──────┬──────╯ └─────────────┘
│
│
▼
╭─────────────╮
( )
( Done )
( )
╰─────────────╯
Node shapes: rectangle [text], rounded (text), diamond {text}, stadium ([text]), subroutine [[text]], circle ((text)), double circle (((text))), hexagon {{text}}, cylinder [(text)], asymmetric >text], parallelogram [/text/], trapezoid [/text\], and @{shape} syntax
Edge styles: solid -->, dotted -.->, thick ==>, bidirectional <-->, circle endpoint --o, cross endpoint --x, labeled -->|text|, variable length --->, ---->
Styling: classDef, style, linkStyle directives, :::className suffix
Subgraphs: nesting, cross-boundary edges, per-subgraph direction override
Other: %% comments, ; line separators, Markdown labels "`**bold** *italic*`", & operator (A & B --> C)
Sequence diagrams
sequenceDiagram
Alice->>Bob: Hello Bob
Bob-->>Alice: Hi Alice
Alice->>Bob: How are you?
Bob-->>Alice: Great!
┌──────────┐ ┌──────────┐
│ Alice │ │ Bob │
└──────────┘ └──────────┘
┆ Hello Bob ┆
──────────────────►
┆ Hi Alice ┆
◄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
┆ How are you? ┆
──────────────────►
┆ Great! ┆
◄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
┆ ┆
Message types: solid arrow ->>, dashed arrow -->>, solid line ->, dashed line -->
Participants: participant, actor, aliases
Class diagrams
classDiagram
class Animal {
+String name
+int age
+makeSound()
}
class Dog {
+String breed
+fetch()
}
Animal <|-- Dog
┌──────────────┐
│ Animal │
├──────────────┤
│ +String name │
│ +int age │
├──────────────┤
│ +makeSound() │
└──────────────┘
△
│
│
│
┌───────────────┐
│ Dog │
├───────────────┤
│ +String breed │
├───────────────┤
│ +fetch() │
└───────────────┘
Relationships: inheritance <|--, composition *--, aggregation o--, association --, dependency ..>, realization ..|>
Members: attributes and methods with visibility (+ public, - private, # protected, ~ package)
ER diagrams
erDiagram
CUSTOMER ||--o{ ORDER : places
ORDER ||--|{ LINE-ITEM : contains
┌──────────────┐
│ CUSTOMER │
└──────────────┘
│1
│ places
│
│0..*
┌──────────────┐
│ ORDER │
└──────────────┘
│1
│ contains
│
│1..*
┌──────────────┐
│ LINE-ITEM │
└──────────────┘
Cardinality: || (exactly one), o| (zero or one), }| (one or more), o{ (zero or more)
Line styles: solid --, dashed ..
Attributes: type, name, keys (PK, FK, UK), comments
State diagrams
stateDiagram-v2
[*] --> Idle
Idle --> Processing : start
Processing --> Done : complete
Done --> [*]
╭───────◯──────╮
│ │
│ ● │
│ │
╰───────◯──────╯
│
│
▼
╭──────────────╮
│ │
│ Idle │
│ │
╰───────┬──────╯
│
start│
▼
╭──────────────╮
│ │
│ Processing │
│ │
╰───────┬──────╯
│
complete│
▼
╭──────────────╮
│ │
│ Done │
│ │
╰───────┬──────╯
│
│
▼
╭───────◯──────╮
│ │
│ ◉ │
│ │
╰───────◯──────╯
Features: [*] start/end states, transition labels, state "name" as alias, composite states (state Parent { }), stereotypes (<<choice>>, <<fork>>, <<join>>)
Block diagrams
block-beta
columns 3
A["Frontend"] B["API"] C["Database"]
┌──────────┐ ┌──────────┐ ┌──────────┐
│ │ │ │ │ │
│ Frontend │ │ API │ │ Database │
│ │ │ │ │ │
└──────────┘ └──────────┘ └──────────┘
Features: columns N, column spanning (blockname:N), links between blocks, nested blocks
Git graphs
gitGraph
commit id: "init"
commit id: "feat"
branch develop
commit id: "dev-1"
commit id: "dev-2"
checkout main
commit id: "fix"
merge develop id: "merge"
main ───●─────●──────┼──────────────●──────●─
init feat │ fix merge
│ │
develop ●───────●─────────────┼
dev-1 dev-2
Directions: LR (default), TB, BT
Commands: commit (with id:, type:, tag:), branch (with order:), checkout/switch, merge, cherry-pick
Commit types: NORMAL (●), REVERSE (✖), HIGHLIGHT (■)
Config: %%{init: {"gitGraph": {"mainBranchName": "master"}}}%%
CLI options
| Flag | Description |
|---|---|
--ascii |
ASCII-only output (no Unicode box-drawing) |
--theme NAME |
Color theme: default, terra, neon, mono, amber, phosphor (requires pip install termaid[rich]) |
--padding-x N |
Horizontal padding inside boxes (default: 4) |
--padding-y N |
Vertical padding inside boxes (default: 2) |
--sharp-edges |
Sharp corners on edge turns instead of rounded |
Python API
render(source, ...) -> str
Render a Mermaid diagram as a plain text string. Auto-detects diagram type.
render_rich(source, ..., theme="default") -> rich.text.Text
Render as a Rich Text object with colors. Requires pip install termaid[rich].
MermaidWidget
A Textual widget with a reactive source attribute. Requires pip install termaid[textual]. Updates live when you change the source property.
from termaid import MermaidWidget
class MyApp(App):
def compose(self):
yield MermaidWidget("graph LR\n A --> B")
Themes
Six built-in themes for --theme / render_rich():
| Theme | Colors | Description |
|---|---|---|
default |
Cyan nodes, yellow arrows, white labels | |
terra |
Warm earth tones (browns, oranges) | |
neon |
Magenta nodes, green arrows, cyan edges | |
mono |
White/gray monochrome | |
amber |
Amber/gold CRT-style | |
phosphor |
Green phosphor terminal-style |
Optional extras
pip install termaid[rich] # Colored terminal output
pip install termaid[textual] # Textual TUI widget
Limitations
- Layout engine is approximate. Node positioning uses a grid-based barycenter heuristic. Graphs with many cross-layer edges may still produce crossings.
- Manhattan-only edge routing. Edges use A* pathfinding on a grid. Very dense graphs may have overlapping edges.
Acknowledgements
Inspired by mermaid-ascii by Alexander Grooff and beautiful-mermaid by Lukilabs.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file termaid-0.1.1.tar.gz.
File metadata
- Download URL: termaid-0.1.1.tar.gz
- Upload date:
- Size: 288.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9a5e0e484b75bf1a8956018f8edd1880430620ce37b091fd9d78a76862edd195
|
|
| MD5 |
f4fa8788c6e65678c58be9828ee65749
|
|
| BLAKE2b-256 |
04f5bfcfac010ef53988a6bdcbec57941d36e9d55645551a1a3f864b6bbed3d3
|
Provenance
The following attestation bundles were made for termaid-0.1.1.tar.gz:
Publisher:
publish.yml on fasouto/termaid
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
termaid-0.1.1.tar.gz -
Subject digest:
9a5e0e484b75bf1a8956018f8edd1880430620ce37b091fd9d78a76862edd195 - Sigstore transparency entry: 1030195075
- Sigstore integration time:
-
Permalink:
fasouto/termaid@a7cad4b00a945820e323d7ca6fd93fc68c6e0174 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/fasouto
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a7cad4b00a945820e323d7ca6fd93fc68c6e0174 -
Trigger Event:
release
-
Statement type:
File details
Details for the file termaid-0.1.1-py3-none-any.whl.
File metadata
- Download URL: termaid-0.1.1-py3-none-any.whl
- Upload date:
- Size: 95.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c80d67acb789de167dd820c69680c1cd468d04c4008c46ae84cd52a3e137235d
|
|
| MD5 |
6ae0e09659a48e91ade9341b0f5c08e5
|
|
| BLAKE2b-256 |
554441732ea27394f732aa233297667e67e843b1ce9f85f6ee20751053028156
|
Provenance
The following attestation bundles were made for termaid-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on fasouto/termaid
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
termaid-0.1.1-py3-none-any.whl -
Subject digest:
c80d67acb789de167dd820c69680c1cd468d04c4008c46ae84cd52a3e137235d - Sigstore transparency entry: 1030195119
- Sigstore integration time:
-
Permalink:
fasouto/termaid@a7cad4b00a945820e323d7ca6fd93fc68c6e0174 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/fasouto
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a7cad4b00a945820e323d7ca6fd93fc68c6e0174 -
Trigger Event:
release
-
Statement type: