Help us improve
Share bugs, ideas, or general feedback.
From open-python-skills
Create professional Excalidraw diagrams by generating JSON directly. This skill provides the Excalidraw JSON schema reference and professional icon libraries for AI agents to autonomously create diagrams without templates.
npx claudepluginhub jiatastic/open-python-skills --plugin open-python-skillsHow this skill is triggered — by the user, by Claude, or both
Slash command
/open-python-skills:excalidraw-aiThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Generate Excalidraw diagrams by writing JSON directly. No templates needed - you have full control over every element.
Generates architecture diagrams on a live Excalidraw canvas from text, components, or samples for data flows, call chains, and exports to PNG/SVG/Excalidraw.
Generates Excalidraw JSON diagram files (.excalidraw) for visualizing workflows, architectures, and concepts as visual arguments with evidence artifacts for technical diagrams.
Generates Excalidraw diagram JSON files that argue visually, not just display information. Use for workflows, architectures, or concepts.
Share bugs, ideas, or general feedback.
Generate Excalidraw diagrams by writing JSON directly. No templates needed - you have full control over every element.
Use this skill when you need to:
An Excalidraw file is a JSON object with this structure:
{
"type": "excalidraw",
"version": 2,
"source": "https://excalidraw.com",
"elements": [ /* array of element objects */ ],
"appState": {
"viewBackgroundColor": "#ffffff",
"gridSize": null
},
"files": {}
}
{
"id": "unique-id-1",
"type": "rectangle",
"x": 100,
"y": 100,
"width": 200,
"height": 100,
"strokeColor": "#1971c2",
"backgroundColor": "#a5d8ff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"angle": 0,
"seed": 12345,
"isDeleted": false
}
{
"id": "unique-id-2",
"type": "ellipse",
"x": 100,
"y": 100,
"width": 150,
"height": 100,
"strokeColor": "#7c3aed",
"backgroundColor": "#ede9fe",
"fillStyle": "solid",
"strokeWidth": 2,
"roughness": 1
}
{
"id": "unique-id-3",
"type": "diamond",
"x": 100,
"y": 100,
"width": 120,
"height": 120,
"strokeColor": "#dc2626",
"backgroundColor": "#fee2e2",
"fillStyle": "solid"
}
{
"id": "unique-id-4",
"type": "text",
"x": 110,
"y": 140,
"width": 180,
"height": 25,
"text": "Your Label Here",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "center",
"verticalAlign": "middle",
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent"
}
{
"id": "unique-id-5",
"type": "arrow",
"x": 300,
"y": 150,
"width": 100,
"height": 50,
"strokeColor": "#1971c2",
"strokeWidth": 2,
"points": [[0, 0], [100, 50]],
"startBinding": {
"elementId": "source-element-id",
"focus": 0.5,
"gap": 5
},
"endBinding": {
"elementId": "target-element-id",
"focus": 0.5,
"gap": 5
},
"startArrowhead": null,
"endArrowhead": "arrow"
}
{
"id": "unique-id-6",
"type": "line",
"x": 100,
"y": 100,
"width": 200,
"height": 0,
"strokeColor": "#868e96",
"strokeWidth": 1,
"points": [[0, 0], [200, 0]],
"startArrowhead": null,
"endArrowhead": null
}
| Property | Type | Description |
|---|---|---|
id | string | Unique identifier (use UUID or similar) |
type | string | rectangle, ellipse, diamond, text, arrow, line |
x, y | number | Position coordinates |
width, height | number | Dimensions |
strokeColor | string | Border/stroke color (hex) |
backgroundColor | string | Fill color (hex) or "transparent" |
fillStyle | string | "solid", "hachure", "cross-hatch" |
strokeWidth | number | Line thickness (1, 2, 4) |
strokeStyle | string | "solid", "dashed", "dotted" |
roughness | number | 0 = sharp, 1 = normal, 2 = sketchy |
opacity | number | 0-100 |
angle | number | Rotation in radians |
groupIds | array | Group element IDs together |
seed | number | Random seed for hand-drawn effect |
| Property | Type | Description |
|---|---|---|
text | string | The text content |
fontSize | number | Font size in pixels |
fontFamily | number | 1 = Virgil (hand-drawn), 2 = Helvetica, 3 = Cascadia |
textAlign | string | "left", "center", "right" |
verticalAlign | string | "top", "middle" |
| Property | Type | Description |
|---|---|---|
points | array | Array of [x, y] coordinates relative to element origin |
startBinding | object | Connection to source element |
endBinding | object | Connection to target element |
startArrowhead | string | null, "arrow", "bar", "dot", "triangle" |
endArrowhead | string | null, "arrow", "bar", "dot", "triangle" |
| Component Type | Stroke | Background | Use For |
|---|---|---|---|
| Database | #7c3aed | #ede9fe | PostgreSQL, MySQL, MongoDB |
| Cache | #dc2626 | #fee2e2 | Redis, Memcached |
| Queue | #16a34a | #dcfce7 | Kafka, RabbitMQ, SQS |
| Load Balancer | #0891b2 | #cffafe | Nginx, HAProxy, ALB |
| Gateway | #475569 | #f1f5f9 | API Gateway, Kong |
| CDN | #06b6d4 | #e0f2fe | CloudFront, Fastly |
| Auth | #e11d48 | #ffe4e6 | OAuth, IAM, Cognito |
| Storage | #d97706 | #fef3c7 | S3, Blob Storage |
| Service | #2563eb | #dbeafe | Backend services, APIs |
| Container | #0284c7 | #bae6fd | Docker, Kubernetes |
| Function | #f59e0b | #fef3c7 | Lambda, Serverless |
| Monitoring | #84cc16 | #ecfccb | Prometheus, Grafana |
| Web App | #4f46e5 | #e0e7ff | React, Vue, Frontend |
| Mobile | #6366f1 | #eef2ff | iOS, Android |
Modern (Default)
#1971c2 / #e7f5ff#64748b / #f1f5f9Sketchy (Hand-drawn)
#495057 / #f8f9faroughness: 2 and fontFamily: 3Technical
#2f9e44 / #ebfbeestrokeStyle: "dashed" for connectionsProfessional icons are available in .excalidrawlib files in the assets/ directory:
| Library | Components | Content |
|---|---|---|
aws-architecture-icons.excalidrawlib | 248 | AWS service icons (Lambda, S3, EC2, RDS, DynamoDB, SQS, etc.) |
system-design.excalidrawlib | 24 | System design elements (server, database, storage, etc.) |
drwnio.excalidrawlib | 18 | Draw.io style icons |
system-design-template.excalidrawlib | 8 | Pre-built templates (steps, flow, db, etc.) |
software-architecture.excalidrawlib | 7 | Software architecture components |
Library files contain element arrays that can be embedded directly into your diagram. Each library item is an array of Excalidraw elements that form a component.
To use: Parse the library JSON, find the component you need, adjust positions, and include in your diagram's elements array.
Organize components in layers (top to bottom):
Layer 1: Client/External (y: 100)
Layer 2: Edge/CDN (y: 280)
Layer 3: Gateway/Load Balancer (y: 460)
Layer 4: Services (y: 640)
Layer 5: Data/Cache (y: 820)
Layer 6: Infrastructure (y: 1000)
Spacing recommendations:
Arrange left-to-right or top-to-bottom:
Radial layout from center:
{
"type": "excalidraw",
"version": 2,
"source": "https://excalidraw.com",
"elements": [
{
"id": "api-gateway",
"type": "rectangle",
"x": 100,
"y": 100,
"width": 180,
"height": 80,
"strokeColor": "#475569",
"backgroundColor": "#f1f5f9",
"fillStyle": "solid",
"strokeWidth": 2,
"roughness": 0,
"opacity": 100,
"groupIds": ["group-1"],
"seed": 1234
},
{
"id": "api-gateway-label",
"type": "text",
"x": 140,
"y": 130,
"width": 100,
"height": 25,
"text": "API Gateway",
"fontSize": 16,
"fontFamily": 1,
"textAlign": "center",
"strokeColor": "#1e1e1e",
"groupIds": ["group-1"]
},
{
"id": "redis",
"type": "diamond",
"x": 100,
"y": 280,
"width": 180,
"height": 100,
"strokeColor": "#dc2626",
"backgroundColor": "#fee2e2",
"fillStyle": "solid",
"strokeWidth": 2,
"roughness": 0,
"seed": 5678
},
{
"id": "redis-label",
"type": "text",
"x": 155,
"y": 320,
"width": 70,
"height": 20,
"text": "Redis",
"fontSize": 16,
"fontFamily": 1,
"textAlign": "center",
"strokeColor": "#1e1e1e"
},
{
"id": "arrow-1",
"type": "arrow",
"x": 190,
"y": 180,
"width": 0,
"height": 100,
"strokeColor": "#64748b",
"strokeWidth": 2,
"points": [[0, 0], [0, 100]],
"startBinding": {"elementId": "api-gateway", "focus": 0.5, "gap": 5},
"endBinding": {"elementId": "redis", "focus": 0.5, "gap": 5},
"endArrowhead": "arrow"
}
],
"appState": {
"viewBackgroundColor": "#ffffff",
"gridSize": null
},
"files": {}
}
Save your diagram as a .excalidraw or .json file. It can be:
groupIds to keep shapes and their labels togetherstartBinding and endBindingseed: hash(id) for consistent hand-drawn rendering