Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate Excalidraw diagrams from natural language descriptions. Outputs .excalidraw JSON files openable in Excalidraw. Use when asked to "create a diagram", "make a flowchart", "visualize a process", "draw a system architecture", "create a mind map", "generate an Excalidraw file", "draw an ER diagram", "create a sequence diagram", or "make a class diagram". Supports flowcharts, relationship diagrams, mind maps, architecture, DFD, swimlane, class, sequence, and ER diagrams. Can use icon librarie
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-09 | ✗→✓ | ▲ Improved | 58% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 58% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 58% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 94% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 33% | 0% |
Generate Excalidraw-format diagrams from natural language descriptions. Outputs .excalidraw JSON files that can be opened directly in Excalidraw (web, VS Code extension, or Obsidian plugin).
UNDERSTAND → CHOOSE TYPE → EXTRACT → GENERATE → SAVEAnalyze the user's description to determine:
Diagram type:
| User Intent | Diagram Type | Keywords | | -------------------------- | -------------------- | --------------------------------------------- | | Process flow, steps | Flowchart | "workflow", "process", "steps" | | Connections, dependencies | Relationship | "relationship", "connections", "dependencies" | | Concept hierarchy | Mind Map | "mind map", "concepts", "breakdown" | | System design | Architecture | "architecture", "system", "components" | | Data movement | Data Flow (DFD) | "data flow", "data processing" | | Cross-functional processes | Swimlane | "business process", "swimlane", "actors" | | Object-oriented design | Class Diagram | "class", "inheritance", "OOP" | | Interaction sequences | Sequence Diagram | "sequence", "interaction", "messages" | | Database design | ER Diagram | "database", "entity", "data model" |
Visual mode — decide upfront and apply consistently to all elements:
| Mode | roughness | fontFamily | When to use | | ---------- | ----------- | ------------ | ---------------------------------------------------- | | Sketch | 1 | 5 | Default — informal, approachable, Excalidraw-native | | Clean | 0 | 2 | Executive presentations, formal specs | | Mixed | zones: 0, shapes: 1 | 5 | Architecture diagrams (structural zones + sketchy shapes) |
Extract the key components based on diagram type. For each type, identify:
For detailed extraction guidelines per diagram type, read references/element-types.md.
CRITICAL: Read references/excalidraw-schema.md before generating your first diagram. It contains the correct element format, text container model, and binding system.
Key rules for generation:
boundElements on the shape and a separate text element with containerId. Never use a label shorthand:json [ { "id": "step-1", "type": "rectangle", "x": 100, "y": 100, "width": 200, "height": 80, "boundElements": [{ "type": "text", "id": "text-step-1" }] }, { "id": "text-step-1", "type": "text", "x": 130, "y": 128, "width": 140, "height": 24, "text": "My Step", "originalText": "My Step", "fontSize": 20, "fontFamily": 5, "textAlign": "center", "verticalAlign": "middle", "containerId": "step-1", "lineHeight": 1.25, "roundness": null } ]
boundElements + separate text element with containerId. Never use a label shorthand on arrows:json [ { "id": "arrow-1", "type": "arrow", "x": 100, "y": 150, "points": [[0, 0], [200, 0]], "boundElements": [{ "type": "text", "id": "text-arrow-1" }] }, { "id": "text-arrow-1", "type": "text", "x": 160, "y": 132, "width": 80, "height": 18, "text": "sends data", "originalText": "sends data", "fontSize": 14, "fontFamily": 5, "textAlign": "center", "verticalAlign": "middle", "containerId": "arrow-1", "lineHeight": 1.25, "roundness": null } ]
startBinding/endBinding (not start/end). Connected shapes must list the arrow in their boundElements:json { "id": "shape-1", "boundElements": [ { "type": "text", "id": "text-shape-1" }, { "type": "arrow", "id": "arrow-1" } ] } json { "id": "arrow-1", "type": "arrow", "startBinding": { "elementId": "shape-1", "focus": 0, "gap": 1 }, "endBinding": { "elementId": "shape-2", "focus": 0, "gap": 1 } }
gridSize: 20). Leave 200-300px horizontal gap, 100-150px vertical gap between elements.id. Use descriptive IDs like "step-1", "decision-valid", "arrow-1-to-2", "text-step-1".| Role | Color | Hex | |------|-------|-----| | Primary entities | Light blue | #a5d8ff | | Process steps | Light green | #b2f2bb | | Important/Central | Yellow | #ffd43b | | Warnings/Errors | Light red | #ffc9c9 | | Secondary | Cyan | #96f2d7 | | Default stroke | Dark | #1e1e1e |
<descriptive-name>.excalidraw Created: user-workflow.excalidraw Type: Flowchart Elements: 7 shapes, 6 arrows, 1 title Total: 14 elements
To view:
Pre-built templates are available in assets/ for quick starting points. Use these when the diagram type matches — they provide correct structure and styling:
| Template | File | | ---------------- | ------------------------------------------------------ | | Flowchart | assets/flowchart-template.json | | Relationship | assets/relationship-template.json | | Mind Map | assets/mindmap-template.json | | Data Flow (DFD) | assets/data-flow-diagram-template.json | | Swimlane | assets/business-flow-swimlane-template.json | | Class Diagram | assets/class-diagram-template.json | | Sequence Diagram | assets/sequence-diagram-template.json | | ER Diagram | assets/er-diagram-template.json |
Read a template when creating that diagram type for the first time. Use its structure as a base, then modify elements to match the user's request.
For professional architecture diagrams with service icons (AWS, GCP, Azure, etc.), icon libraries can be set up. Read references/icon-libraries.md when:
| Diagram Type | Recommended | Maximum | | --------------------- | ----------- | ------- | | Flowchart steps | 3-10 | 15 | | Relationship entities | 3-8 | 12 | | Mind map branches | 4-6 | 8 | | Sub-topics per branch | 2-4 | 6 |
If the user's request exceeds maximum, suggest breaking into multiple diagrams:
> "Your request includes 15 components. For clarity, I recommend: (1) High-level architecture diagram with 6 main components, (2) Detailed sub-diagrams for each subsystem. Want me to start with the high-level view?"
fontFamily: 5 (Excalifont) for hand-drawn consistency. Fallback to 1 (Virgil) if 5 is not supported.opacity: 35, strokeStyle: "dashed", roughness: 0) as the first elements in the array to create visual grouping regions. See references/excalidraw-schema.md → Background Zones.label: { text: "..." } shorthand on shapes or arrows — not supported by the Excalidraw parsertext directly on shape elements without containerIdstart/end for arrow bindings — use startBinding/endBinding with elementId/focus/gapboundElements arraysoriginalText, lineHeight, autoResize, or backgroundColor: "transparent" from text elements inside containersangle, strokeStyle, opacity, groupIds, frameId, index, isDeleted, seed, version, versionNonce, updated, link, locked) — elements will not render"files": {} at the top level of the JSONroundness: { "type": 3 } on ellipses — ellipses must use roundness: nulllastCommittedPoint, startArrowhead, endArrowhead on arrowsBefore delivering the diagram, verify:
angle, strokeStyle, opacity, groupIds, frameId, index, isDeleted, link, locked, seed, version, versionNonce, updatedindex values are assigned in order ("a0", "a1", …) with text elements getting higher values than shapes/arrows"files": {}boundElements + separate text element with containerIdcontainerId, originalText, lineHeight: 1.25, autoResize: true, roundness: null, backgroundColor: "transparent"startBinding/endBinding (with elementId, focus, gap) when connecting shapes, plus lastCommittedPoint: null, startArrowhead: null, endArrowhead: "arrow"boundElements arraysroundness: null (not { "type": 3 })| Issue | Solution | | ----------------------------- | --------------------------------------------------------------------------------------------- | | Text not showing in shapes | Use boundElements + separate text element with containerId, originalText, lineHeight | | Text hidden behind arrows | Move text elements to end of elements array (after all arrows) | | Arrows don't move with shapes | Use startBinding/endBinding with elementId, focus: 0, gap: 1 | | Shape not moving with arrows | Add the arrow to the shape's boundElements array | | Elements overlap | Increase spacing between coordinates | | Text doesn't fit | Increase shape width or reduce font size | | Too many elements | Break into multiple diagrams | | Colors look inconsistent | Define color palette upfront, apply consistently |
Other measured skills in the registry, with their headline benchmark lift.