Top Related Projects
Generation of diagrams like flowcharts or sequence diagrams from text in a similar manner as markdown
Generate diagrams from textual description
draw.io is a JavaScript, client-side editor for general diagramming.
Creates diagrams from textual descriptions!
Virtual whiteboard for sketching hand-drawn like diagrams
Quick Overview
D2 is a modern diagram scripting language that turns text to diagrams. It aims to be faster and easier to use than traditional diagram tools, allowing users to create diagrams using a simple, intuitive syntax. D2 can generate various types of diagrams, including flowcharts, sequence diagrams, and entity-relationship diagrams.
Pros
- Simple and intuitive syntax for creating diagrams
- Supports a wide range of diagram types
- Version control friendly, as diagrams are defined in plain text
- Offers both CLI and web-based playground for diagram creation
Cons
- Learning curve for users unfamiliar with text-based diagramming
- Limited customization options compared to some graphical diagram tools
- Requires installation of additional software for local use
- May not be suitable for highly complex or specialized diagrams
Code Examples
- Creating a simple flowchart:
start: Start
process: Process data
decision: Make decision
end: End
start -> process
process -> decision
decision -> end: Yes
decision -> process: No
- Defining a sequence diagram:
alice -> bob: Hello
bob -> charlie: Hi
charlie -> alice: Greetings
- Creating an entity-relationship diagram:
User {
shape: sql_table
id: int
username: varchar
email: varchar
}
Post {
shape: sql_table
id: int
title: varchar
content: text
user_id: int
}
User.id -> Post.user_id
Getting Started
-
Install D2:
curl -fsSL https://d2lang.com/install.sh | sh -s --
-
Create a new file with a
.d2
extension (e.g.,diagram.d2
). -
Write your diagram script in the file.
-
Generate the diagram:
d2 diagram.d2 output.png
-
View the generated diagram in your preferred image viewer.
Competitor Comparisons
Generation of diagrams like flowcharts or sequence diagrams from text in a similar manner as markdown
Pros of Mermaid
- Wider adoption and community support
- Extensive documentation and examples
- Supports a broader range of diagram types
Cons of Mermaid
- Steeper learning curve for complex diagrams
- Limited customization options for diagram styling
Code Comparison
Mermaid:
graph TD
A[Start] --> B{Is it?}
B -->|Yes| C[OK]
B -->|No| D[End]
D2:
direction: right
x -> y -> z
a -> b -> c
Key Differences
- Syntax: Mermaid uses a more verbose syntax, while D2 opts for a simpler, more concise approach
- Rendering: Mermaid is primarily JavaScript-based, whereas D2 is a standalone binary
- Use cases: Mermaid excels in web-based environments, while D2 is more versatile for various platforms
Conclusion
Both Mermaid and D2 offer powerful diagramming capabilities. Mermaid's extensive features and community support make it ideal for web-based projects, while D2's simplicity and platform independence cater to users seeking a lightweight, versatile solution. The choice between the two depends on specific project requirements and personal preferences.
Generate diagrams from textual description
Pros of PlantUML
- Extensive diagram types supported (sequence, class, use case, etc.)
- Large community and ecosystem with numerous integrations
- Text-based syntax allows for version control and easy sharing
Cons of PlantUML
- Steeper learning curve for complex diagrams
- Limited customization options for diagram aesthetics
- Can be slower to render, especially for large diagrams
Code Comparison
PlantUML:
@startuml
Alice -> Bob: Hello
Bob --> Alice: Hi there
@enduml
D2:
Alice -> Bob: Hello
Bob -> Alice: Hi there
D2 offers a more straightforward syntax for simple diagrams, while PlantUML requires specific start and end tags. Both tools allow for easy creation of basic sequence diagrams, but PlantUML's syntax may be more verbose for complex scenarios.
PlantUML excels in its wide range of diagram types and established ecosystem, making it suitable for diverse diagramming needs. D2, being newer, focuses on simplicity and modern design principles, potentially offering a more intuitive experience for users who prioritize ease of use and aesthetics over extensive features.
draw.io is a JavaScript, client-side editor for general diagramming.
Pros of draw.io
- Rich graphical user interface for easy diagram creation
- Extensive library of pre-built shapes and icons
- Collaborative features for real-time editing
Cons of draw.io
- Steeper learning curve for complex diagrams
- Limited text-based diagram creation options
- Requires a web browser or desktop application to use
Code Comparison
draw.io uses XML-based format for diagram representation:
<mxGraphModel>
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="2" value="Start" style="rounded=1;" vertex="1" parent="1">
<mxGeometry x="120" y="120" width="80" height="40" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
D2 uses a simple text-based format for diagram creation:
shape: {
style: {
stroke: black
fill: white
}
}
Start -> End
D2 offers a more straightforward approach to diagram creation using text, while draw.io provides a comprehensive graphical interface with more advanced features. D2 is better suited for quick, code-like diagram creation, whereas draw.io excels in creating visually rich and complex diagrams with its extensive shape library and collaborative features.
Creates diagrams from textual descriptions!
Pros of Kroki
- Supports a wide variety of diagram types and markup languages
- Offers a unified API for multiple diagramming tools
- Provides both self-hosted and cloud-based options
Cons of Kroki
- Requires external dependencies for each supported diagram type
- May have a steeper learning curve due to multiple syntax options
- Potentially higher resource usage when running all supported tools
Code Comparison
Kroki (PlantUML syntax):
@startuml
Alice -> Bob: Hello
Bob --> Alice: Hi there
@enduml
D2:
Alice -> Bob: Hello
Bob -> Alice: Hi there
Key Differences
- D2 uses its own custom syntax, while Kroki supports multiple existing syntaxes
- D2 is a single, standalone tool, whereas Kroki integrates multiple diagramming tools
- D2 focuses on simplicity and performance, while Kroki prioritizes versatility and compatibility
Both projects aim to simplify the process of creating diagrams from text, but they take different approaches. D2 offers a streamlined experience with its own syntax, while Kroki provides a broader range of options by integrating existing tools.
Virtual whiteboard for sketching hand-drawn like diagrams
Pros of Excalidraw
- User-friendly interface with a focus on hand-drawn aesthetics
- Collaborative real-time editing capabilities
- Extensive library of pre-made shapes and elements
Cons of Excalidraw
- Limited support for complex diagrams and flowcharts
- Less suitable for programmatic diagram generation
- Fewer options for customizing diagram styles and layouts
Code Comparison
Excalidraw (JavaScript):
const element = createElement({
type: "rectangle",
x: 100,
y: 100,
width: 200,
height: 100,
backgroundColor: "lightblue",
});
D2 (D2 language):
shape: {
rectangle: {
x: 100
y: 100
width: 200
height: 100
style: {
fill: lightblue
}
}
}
Both repositories offer diagramming solutions, but they cater to different use cases. Excalidraw provides a more intuitive, collaborative drawing experience with a hand-drawn style, making it ideal for quick sketches and brainstorming sessions. D2, on the other hand, offers a text-based approach to diagram creation, which is better suited for version control and programmatic generation of complex diagrams. The choice between the two depends on the specific needs of the project and the preferred workflow of the users.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
A modern diagram scripting language that turns text to diagrams.
Docs | Cheat sheet | Comparisons | Playground
https://user-images.githubusercontent.com/3120367/206125010-bd1fea8e-248a-43e7-8f85-0bbfca0c6e2a.mp4
Table of Contents
- What does D2 look like?
- Quickstart
- Install
- D2 as a library
- Themes
- Fonts
- Export file types
- Language tooling
- Plugins
- Comparison
- Contributing
- License
- Related
- FAQ
- Notable open-source projects documenting with D2
What does D2 look like?
vars: {
d2-config: {
layout-engine: elk
# Terminal theme code
theme-id: 300
}
}
network: {
cell tower: {
satellites: {
shape: stored_data
style.multiple: true
}
transmitter
satellites -> transmitter: send
satellites -> transmitter: send
satellites -> transmitter: send
}
online portal: {
ui: {shape: hexagon}
}
data processor: {
storage: {
shape: cylinder
style.multiple: true
}
}
cell tower.transmitter -> data processor.storage: phone logs
}
user: {
shape: person
width: 130
}
user -> network.cell tower: make call
user -> network.online portal.ui: access {
style.stroke-dash: 3
}
api server -> network.online portal.ui: display
api server -> logs: persist
logs: {shape: page; style.multiple: true}
network.data processor -> api server
Open in playground
For more examples, see ./docs/examples.
Quickstart
The most convenient way to use D2 is to just run it as a CLI executable to
produce SVGs from .d2
files.
# First, install D2
curl -fsSL https://d2lang.com/install.sh | sh -s --
echo 'x -> y -> z' > in.d2
d2 --watch in.d2 out.svg
A browser window will open with out.svg
and live-reload on changes to in.d2
.
Install
The easiest way to install is with our install script:
curl -fsSL https://d2lang.com/install.sh | sh -s --
You can run the install script with --dry-run
to see the commands that will be used
to install without executing them.
Or if you have Go installed you can install from source though you won't get the manpage:
go install oss.terrastruct.com/d2@latest
You can also install a release from source which will include manpages. See ./docs/INSTALL.md#source-release.
To uninstall with the install script:
curl -fsSL https://d2lang.com/install.sh | sh -s -- --uninstall
For detailed installation docs, see ./docs/INSTALL.md. We demonstrate alternative methods and examples for each OS.
As well, the functioning of the install script is described in detail to alleviate any concern of its use. We recommend using your OS's package manager directly instead for improved security but the install script is by no means insecure.
D2 as a library
In addition to being a runnable CLI tool, D2 can also be used to produce diagrams from Go programs.
For examples, see ./docs/examples/lib. This blog post also demos a complete, runnable example of using D2 as a library for a real-world use case.
Themes
D2 includes a variety of official themes to style your diagrams beautifully right out of the box. See ./d2themes to browse the available themes and make or contribute your own creation.
Fonts
D2 ships with "Source Sans Pro" as the font in renders. If you wish to use a different one, please see ./d2renderers/d2fonts.
Export file types
D2 currently supports SVG, PNG and PDF exports. More coming soon.
Language tooling
D2 is designed with language tooling in mind. D2's parser can parse multiple errors from a broken program, has an autoformatter, syntax highlighting, and we have plans for LSP's and more. Good language tooling is necessary for creating and maintaining large diagrams.
The extensions for VSCode and Vim can be found in the Related section.
Plugins
D2 is designed to be extensible and composable. The plugin system allows you to change out layout engines and customize the rendering pipeline. Plugins can either be bundled with the build or separately installed as a standalone binary.
Layout engines:
- dagre (default, bundled): A fast, directed graph layout engine that produces layered/hierarchical layouts. Based on Graphviz's DOT algorithm.
- ELK (bundled): A directed graph layout engine particularly suited for node-link diagrams with an inherent direction and ports.
- TALA (binary): Novel layout engine designed specifically for software architecture diagrams. Requires separate install, visit the Github page for more.
D2 intends to integrate with a variety of layout engines, e.g. dot
, as well as
single-purpose layout types like sequence diagrams. You can choose whichever layout engine
you like and works best for the diagram you're making.
Comparison
For a comparison against other popular text-to-diagram tools, see https://text-to-diagram.com.
Contributing
Contributions are welcome! See ./docs/CONTRIBUTING.md.
License
Open sourced under the Mozilla Public License 2.0. See ./LICENSE.txt.
Related
We are constantly working on new plugins, integrations, extensions. Contributions are welcome in any official or community plugins. If you have somewhere in your workflow that you want to use D2, feel free to open a discussion. We have limited bandwidth and usually choose the most high-demand ones to work on. If you make something cool with D2 yourself, let us know and we'll be happy to include it here!
Official plugins
- VSCode extension: https://github.com/terrastruct/d2-vscode
- Vim extension: https://github.com/terrastruct/d2-vim
- Obsidian plugin: https://github.com/terrastruct/d2-obsidian
- Slack app: https://d2lang.com/tour/slack
- Discord plugin: https://d2lang.com/tour/discord
Community plugins
- Tree-sitter grammar: https://git.pleshevski.ru/pleshevskiy/tree-sitter-d2
- Emacs major mode: https://github.com/andorsk/d2-mode
- Goldmark extension: https://github.com/FurqanSoftware/goldmark-d2
- Telegram bot: https://github.com/meinside/telegram-d2-bot
- Postgres importer: https://github.com/zekenie/d2-erd-from-postgres
- Structurizr to D2 exporter: https://github.com/goto1134/structurizr-d2-exporter
- MdBook preprocessor: https://github.com/danieleades/mdbook-d2
- ROS2 D2 Exporter: https://github.com/Greenroom-Robotics/ros-d2
- D2 org-mode support: https://github.com/xcapaldi/ob-d2
- Python D2 diagram builder: https://github.com/MrBlenny/py-d2
- Clojure D2 transpiler: https://github.com/judepayne/dictim
- JavaScript D2 diagram builder: https://github.com/Kreshnik/d2lang-js
- C# & dotnet SDK: https://github.com/Stephanvs/d2lang-cs
- Maven plugin: https://github.com/andrinmeier/unofficial-d2lang-maven-plugin
- Confluence plugin: https://github.com/andrinmeier/unofficial-d2lang-confluence-plugin
- CIL (C#, Visual Basic, F#, C++ CLR) to D2: https://github.com/HugoVG/AppDiagram
- D2 Snippets (for text editors): https://github.com/Paracelsus-Rose/D2-Language-Code-Snippets
- Mongo to D2: https://github.com/novuhq/mongo-to-D2
- Pandoc filter: https://github.com/ram02z/d2-filter
- Logseq-D2: https://github.com/b-yp/logseq-d2
- ent2d2: https://github.com/tmc/ent2d2
- MkDocs Plugin: https://github.com/landmaj/mkdocs-d2-plugin
- Remark Plugin: https://github.com/mech-a/remark-d2
Misc
- Comparison site: https://github.com/terrastruct/text-to-diagram-site
- Playground: https://github.com/terrastruct/d2-playground
- Language docs: https://github.com/terrastruct/d2-docs
- Hosted icons: https://icons.terrastruct.com
FAQ
- Does D2 collect telemetry?
- No, D2 does not use an internet connection after installation, except to check for version updates from Github periodically.
- Does D2 need a browser to run?
- No, D2 can run entirely server-side.
- What's coming in the next release?
- I have a question or need help.
- The best way to get help is to ask on D2 Discord
- I have a feature request, proposal, or bug report.
- Please open up a Github Issue.
- I have a private inquiry.
- Please reach out at hi@d2lang.com.
Notable open-source projects documenting with D2
Do you have or see an open-source project with .d2
files? Please submit a PR adding to
this selected list of featured projects using D2.
- ElasticSearch
- Sourcegraph
- Temporal
- Tauri
- Rust GUI framework (78.5k stars)
- Intellij
- Coder
- UC Berkeley
- Coronacheck
- Official app of the Netherlands for coronavirus entry passes.
- Block
Protocol
- The Block Protocol is an open standard for building and using data-driven blocks (1.2k stars).
- Dagger
- A programmable CI/CD engine that runs your pipelines in containers (8k stars).
- Ivy
Wallet
- Open-source money manager app for Android (1.1k stars).
- LocalStack
- Cloud service emulator (46k stars)
- Queue Library
- Queue is a Golang library for spawning and managing a Goroutine pool
Top Related Projects
Generation of diagrams like flowcharts or sequence diagrams from text in a similar manner as markdown
Generate diagrams from textual description
draw.io is a JavaScript, client-side editor for general diagramming.
Creates diagrams from textual descriptions!
Virtual whiteboard for sketching hand-drawn like diagrams
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot