Install
openclaw skills install @ricardodpalmeida/excalidraw-diagramsTurn a plain list of boxes and arrows into a clean, hand-drawn Excalidraw diagram: an Obsidian Excalidraw note (.excalidraw.md) or a .excalidraw file for excalidraw.com. A deterministic script does the layout, labels and arrow bindings. Use only when the user explicitly asks for an Excalidraw drawing or an Excalidraw file in Obsidian.
openclaw skills install @ricardodpalmeida/excalidraw-diagramsDo not write Excalidraw JSON by hand. Describe the diagram as a small spec and let {baseDir}/scripts/build_diagram.py compute positions, sizes, text bindings, arrow bindings and IDs; then check the file with {baseDir}/scripts/validate.py. Both scripts use only the Python standard library and make no network calls.
<name>.excalidraw.md, opens in the Obsidian Excalidraw plugin) or a standard file (<name>.excalidraw, opens on excalidraw.com). Ask for the folder and file name. Never pick a path yourself.\n for a second line.python3 {baseDir}/scripts/build_diagram.py --spec <spec.json> --out "<folder>/<name>.excalidraw.md". The format follows the extension; --format obsidian|excalidraw overrides it. Add --tag <tag> for extra Obsidian tags.--force. If warnings mention an edge crossing a node, change the spec (pin a rank, switch direction, or reorder nodes) and build again.python3 {baseDir}/scripts/validate.py "<file>". Fix every error before telling the user the file is ready.{
"title": "Order service",
"direction": "TB",
"theme": "sketch",
"groups": [{"id": "backend", "label": "Backend", "color": "green"}],
"nodes": [
{"id": "web", "label": "Web app", "color": "blue"},
{"id": "api", "label": "Orders API", "group": "backend"},
{"id": "ok", "label": "Paid?", "shape": "diamond", "color": "yellow"},
{"id": "db", "label": "Postgres", "shape": "ellipse", "color": "cyan", "group": "backend"}
],
"edges": [
{"from": "web", "to": "api", "label": "REST"},
{"from": "api", "to": "ok"},
{"from": "ok", "to": "db", "label": "yes", "style": "dashed"}
]
}
| Field | Values |
|---|---|
direction | TB (top to bottom, default) or LR (left to right) |
theme | sketch (hand-drawn, default) or clean (straight lines) |
font | excalifont (default), virgil, helvetica, cascadia, nunito, lilita, comic |
node shape | rectangle (default), ellipse, diamond |
node and group color | blue, green, red, orange, purple, yellow, cyan, pink, gray, white |
node rank | optional integer that pins the node to a layer (0 is the first) |
node link | optional URL or [[Obsidian link]] attached to the shape |
edge style | solid (default), dashed, dotted; "bidirectional": true adds a second arrowhead |
Nodes in the same group are laid out together inside a shaded, labelled frame. Cycles are allowed; edges that would cross other nodes are routed around the drawing.
The script draws layered diagrams: flowcharts, pipelines, architecture and data-flow diagrams, hierarchies and org charts (TB), timelines and request flows (LR), and mind maps as a tree from the central topic. For grids, matrices or side-by-side comparisons it is the wrong tool: write the elements directly following references/excalidraw-format.md, then run validate.py on the result. If the user already has a Mermaid flowchart, the Obsidian Excalidraw plugin can convert Mermaid into editable Excalidraw elements, which may be quicker.
Color conventions that read well: blue for clients and entry points, purple for processing, green for success and outputs, cyan for storage, orange for external dependencies, red for errors, yellow for decisions and notes.
--force only after the user agreed to overwrite that specific file.Made by Ricardo Pacheco Almeida, who writes about applied AI at ricbits. Other OpenClaw skills: whetstone, LadybugDB openCypher, Book Capture for Obsidian, Microsoft Learn MCP.