
Excalidraw Studio
- 180 installs
- 5k repo stars
- Updated August 4, 2026
- tech-leads-club/agent-skills
Use excalidraw-studio for development tasks
About
excalidraw-studio: A skill for development. This provides functionality for development workflows.
- excalidraw-studio
Excalidraw Studio by the numbers
- 180 all-time installs (skills.sh)
- +8 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #2,211 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/tech-leads-club/agent-skills --skill excalidraw-studioAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 180 |
|---|---|
| repo stars | ★ 5k |
| Last updated | August 4, 2026 |
| Repository | tech-leads-club/agent-skills ↗ |
What it does
Use excalidraw-studio for development tasks
Files
Excalidraw Studio
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).
Workflow
UNDERSTAND → CHOOSE TYPE → EXTRACT → GENERATE → SAVEStep 1: Understand the Request
Analyze the user's description to determine:
1. Diagram type — Use the decision matrix below 2. Key elements — Entities, steps, concepts, actors 3. Relationships — Flow direction, connections, hierarchy 4. Complexity — Number of elements (target: under 20 for clarity)
Step 2: Choose the Diagram Type and Visual Mode
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) |
Step 3: Extract Structured Information
Extract the key components based on diagram type. For each type, identify:
- Nodes/entities — What are the boxes/shapes?
- Connections — What connects to what, and with what label?
- Hierarchy — What contains what, what comes before what?
- Decision points — Where does the flow branch?
For detailed extraction guidelines per diagram type, read references/element-types.md.
Step 4: Generate the Excalidraw JSON
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:
1. Text inside shapes — Use boundElements on the shape and a separate text element with containerId. Never use a label shorthand:
[
{
"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
}
]2. Arrow labels — Also use boundElements + separate text element with containerId. Never use a label shorthand on arrows:
[
{
"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
}
]3. Arrow bindings — Use startBinding/endBinding (not start/end). Connected shapes must list the arrow in their boundElements:
{
"id": "shape-1",
"boundElements": [
{ "type": "text", "id": "text-shape-1" },
{ "type": "arrow", "id": "arrow-1" }
]
} {
"id": "arrow-1",
"type": "arrow",
"startBinding": { "elementId": "shape-1", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "shape-2", "focus": 0, "gap": 1 }
}4. Element order for z-index — Always declare shapes first, arrows second, text elements last. This guarantees text renders on top and is never obscured by arrows or other shapes.
5. Positioning — Use grid-aligned coordinates (multiples of 20px when gridSize: 20). Leave 200-300px horizontal gap, 100-150px vertical gap between elements.
6. Unique IDs — Every element must have a unique id. Use descriptive IDs like "step-1", "decision-valid", "arrow-1-to-2", "text-step-1".
7. Colors — Use a consistent palette:
| 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 |
Step 5: Save and Present
1. Save as <descriptive-name>.excalidraw 2. Provide a summary:
Created: user-workflow.excalidraw
Type: Flowchart
Elements: 7 shapes, 6 arrows, 1 title
Total: 14 elements
To view:
1. Visit https://excalidraw.com → Open → drag and drop the file
2. Or use the Excalidraw VS Code extension
3. Or open in Obsidian with the Excalidraw pluginTemplates
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.
Icon Libraries
For professional architecture diagrams with service icons (AWS, GCP, Azure, etc.), icon libraries can be set up. Read references/icon-libraries.md when:
- User requests an AWS/cloud architecture diagram
- User mentions wanting specific service icons
- You need to check if icon libraries are available
Best Practices
Element Count
| 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?"
Layout
- Flow direction: Left-to-right for processes, top-to-bottom for hierarchies
- Spacing: 200-300px horizontal, 100-150px vertical between elements
- Grid alignment: Position on multiples of 20px for clean alignment
- Margins: Minimum 50px from canvas edge
- Text sizing: 28-36px titles, 18-22px labels, 14-16px annotations
- Font: Use
fontFamily: 5(Excalifont) for hand-drawn consistency. Fallback to1(Virgil) if 5 is not supported. - Background zones: For architecture diagrams, add semi-transparent dashed zone rectangles (
opacity: 35,strokeStyle: "dashed",roughness: 0) as the first elements in the array to create visual grouping regions. Seereferences/excalidraw-schema.md→ Background Zones. - Element order: zones first → shapes → arrows → text elements (ensures correct z-index and text always renders on top)
Common Mistakes to Avoid
- ❌ Using
label: { text: "..." }shorthand on shapes or arrows — not supported by the Excalidraw parser - ❌ Putting
textdirectly on shape elements withoutcontainerId - ❌ Using
start/endfor arrow bindings — usestartBinding/endBindingwithelementId/focus/gap - ❌ Forgetting to add arrows to their connected shapes'
boundElementsarrays - ❌ Omitting
originalText,lineHeight,autoResize, orbackgroundColor: "transparent"from text elements inside containers - ❌ Omitting required base properties (
angle,strokeStyle,opacity,groupIds,frameId,index,isDeleted,seed,version,versionNonce,updated,link,locked) — elements will not render - ❌ Missing
"files": {}at the top level of the JSON - ❌ Using
roundness: { "type": 3 }on ellipses — ellipses must useroundness: null - ❌ Missing
lastCommittedPoint,startArrowhead,endArrowheadon arrows - ❌ Declaring text elements before arrows — text renders underneath and gets obscured
- ❌ Floating arrows without bindings (won't move with shapes)
- ❌ Overlapping elements (increase spacing)
- ❌ Inconsistent color usage (define palette upfront)
- ❌ Too many elements on one diagram (break into sub-diagrams)
Validation Checklist
Before delivering the diagram, verify:
- [ ] All elements have unique IDs
- [ ] Every element has ALL required base properties:
angle,strokeStyle,opacity,groupIds,frameId,index,isDeleted,link,locked,seed,version,versionNonce,updated - [ ]
indexvalues are assigned in order ("a0","a1", …) with text elements getting higher values than shapes/arrows - [ ] Top-level JSON includes
"files": {} - [ ] Shapes with text use
boundElements+ separate text element withcontainerId - [ ] Text elements inside containers have
containerId,originalText,lineHeight: 1.25,autoResize: true,roundness: null,backgroundColor: "transparent" - [ ] Arrows use
startBinding/endBinding(withelementId,focus,gap) when connecting shapes, pluslastCommittedPoint: null,startArrowhead: null,endArrowhead: "arrow" - [ ] Connected shapes list the arrow in their
boundElementsarrays - [ ] Element order: shapes → arrows → text elements (text always on top)
- [ ] Ellipses use
roundness: null(not{ "type": 3 }) - [ ] Coordinates prevent overlapping (check spacing)
- [ ] Text is readable (font size 16+)
- [ ] Colors follow consistent scheme
- [ ] File is valid JSON
- [ ] Element count is reasonable (<20 for clarity)
Troubleshooting
| 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 |
Limitations
- Complex curves are simplified to straight/basic curved lines
- Hand-drawn roughness is set to default (1)
- No embedded images in auto-generation (use icon libraries for service icons)
- Maximum recommended: 20 elements per diagram for clarity
- No automatic collision detection — use spacing guidelines
{
"type": "excalidraw",
"version": 2,
"source": "https://excalidraw.com",
"elements": [
{
"id": "zone-lane1",
"type": "rectangle",
"x": 60, "y": 100, "width": 800, "height": 160,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "#dbe4ff",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 0,
"opacity": 35,
"groupIds": [],
"frameId": null,
"index": "a0",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 5001,
"version": 1,
"versionNonce": 5002,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": []
},
{
"id": "zone-lane2",
"type": "rectangle",
"x": 60, "y": 280, "width": 800, "height": 160,
"angle": 0,
"strokeColor": "#2f9e44",
"backgroundColor": "#d3f9d8",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "dashed",
"roughness": 0,
"opacity": 35,
"groupIds": [],
"frameId": null,
"index": "a1",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 5003,
"version": 1,
"versionNonce": 5004,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": []
},
{
"id": "step1",
"type": "rectangle",
"x": 120, "y": 140, "width": 180, "height": 80,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "#a5d8ff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a2",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 5005,
"version": 1,
"versionNonce": 5006,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "text", "id": "text-step1" },
{ "type": "arrow", "id": "arrow1" }
]
},
{
"id": "step2",
"type": "rectangle",
"x": 380, "y": 320, "width": 180, "height": 80,
"angle": 0,
"strokeColor": "#2f9e44",
"backgroundColor": "#b2f2bb",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a3",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 5007,
"version": 1,
"versionNonce": 5008,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "text", "id": "text-step2" },
{ "type": "arrow", "id": "arrow1" },
{ "type": "arrow", "id": "arrow2" }
]
},
{
"id": "step3",
"type": "rectangle",
"x": 640, "y": 140, "width": 180, "height": 80,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "#a5d8ff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a4",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 5009,
"version": 1,
"versionNonce": 5010,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "text", "id": "text-step3" },
{ "type": "arrow", "id": "arrow2" }
]
},
{
"id": "arrow1",
"type": "arrow",
"x": 300, "y": 180, "width": 80, "height": 180,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a5",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 5011,
"version": 1,
"versionNonce": 5012,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [],
"points": [[0, 0], [80, 0], [80, 180]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "step1", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "step2", "focus": 0, "gap": 1 }
},
{
"id": "arrow2",
"type": "arrow",
"x": 560, "y": 360, "width": 80, "height": -180,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a6",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 5013,
"version": 1,
"versionNonce": 5014,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [],
"points": [[0, 0], [80, 0], [80, -180]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "step2", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "step3", "focus": 0, "gap": 1 }
},
{
"id": "title",
"type": "text",
"x": 200, "y": 50,
"width": 480, "height": 35,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a7",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 5015,
"version": 1,
"versionNonce": 5016,
"updated": 1706659200000,
"text": "Business Process Flow",
"originalText": "Business Process Flow",
"fontSize": 28,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "label-lane1",
"type": "text",
"x": 72, "y": 110,
"width": 120, "height": 20,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a8",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 5017,
"version": 1,
"versionNonce": 5018,
"updated": 1706659200000,
"text": "Customer",
"originalText": "Customer",
"fontSize": 14,
"fontFamily": 5,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "label-lane2",
"type": "text",
"x": 72, "y": 290,
"width": 120, "height": 20,
"angle": 0,
"strokeColor": "#2f9e44",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a9",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 5019,
"version": 1,
"versionNonce": 5020,
"updated": 1706659200000,
"text": "Sales Team",
"originalText": "Sales Team",
"fontSize": 14,
"fontFamily": 5,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-step1",
"type": "text",
"x": 140, "y": 170,
"width": 140, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b0",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 5021,
"version": 1,
"versionNonce": 5022,
"updated": 1706659200000,
"text": "Submit Request",
"originalText": "Submit Request",
"fontSize": 16,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "step1",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-step2",
"type": "text",
"x": 400, "y": 350,
"width": 140, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b1",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 5023,
"version": 1,
"versionNonce": 5024,
"updated": 1706659200000,
"text": "Review Request",
"originalText": "Review Request",
"fontSize": 16,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "step2",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-step3",
"type": "text",
"x": 660, "y": 170,
"width": 140, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b2",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 5025,
"version": 1,
"versionNonce": 5026,
"updated": 1706659200000,
"text": "Approve",
"originalText": "Approve",
"fontSize": 16,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "step3",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
}
],
"appState": {
"viewBackgroundColor": "#ffffff",
"gridSize": 20
},
"files": {}
}
{
"type": "excalidraw",
"version": 2,
"source": "https://excalidraw.com",
"elements": [
{
"id": "class-base",
"type": "rectangle",
"x": 100, "y": 120, "width": 280, "height": 200,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "#a5d8ff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a0",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 4001,
"version": 1,
"versionNonce": 4002,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "arrow", "id": "arrow-inherit" }
]
},
{
"id": "class-child",
"type": "rectangle",
"x": 500, "y": 120, "width": 280, "height": 200,
"angle": 0,
"strokeColor": "#7048e8",
"backgroundColor": "#d0bfff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a1",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 4003,
"version": 1,
"versionNonce": 4004,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "arrow", "id": "arrow-inherit" }
]
},
{
"id": "sep-base-1",
"type": "line",
"x": 100, "y": 168, "width": 280, "height": 0,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a2",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 4005,
"version": 1,
"versionNonce": 4006,
"updated": 1706659200000,
"roundness": null,
"boundElements": [],
"points": [[0, 0], [280, 0]]
},
{
"id": "sep-base-2",
"type": "line",
"x": 100, "y": 258, "width": 280, "height": 0,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a3",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 4007,
"version": 1,
"versionNonce": 4008,
"updated": 1706659200000,
"roundness": null,
"boundElements": [],
"points": [[0, 0], [280, 0]]
},
{
"id": "sep-child-1",
"type": "line",
"x": 500, "y": 168, "width": 280, "height": 0,
"angle": 0,
"strokeColor": "#7048e8",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a4",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 4009,
"version": 1,
"versionNonce": 4010,
"updated": 1706659200000,
"roundness": null,
"boundElements": [],
"points": [[0, 0], [280, 0]]
},
{
"id": "sep-child-2",
"type": "line",
"x": 500, "y": 258, "width": 280, "height": 0,
"angle": 0,
"strokeColor": "#7048e8",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a5",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 4011,
"version": 1,
"versionNonce": 4012,
"updated": 1706659200000,
"roundness": null,
"boundElements": [],
"points": [[0, 0], [280, 0]]
},
{
"id": "arrow-inherit",
"type": "arrow",
"x": 380, "y": 220, "width": 120, "height": 0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a6",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 4013,
"version": 1,
"versionNonce": 4014,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [{ "type": "text", "id": "text-inherit-label" }],
"points": [[0, 0], [120, 0]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "triangle",
"startBinding": { "elementId": "class-base", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "class-child", "focus": 0, "gap": 1 }
},
{
"id": "title",
"type": "text",
"x": 200, "y": 60,
"width": 480, "height": 35,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a7",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 4015,
"version": 1,
"versionNonce": 4016,
"updated": 1706659200000,
"text": "Class Diagram",
"originalText": "Class Diagram",
"fontSize": 28,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-base-name",
"type": "text",
"x": 120, "y": 126,
"width": 240, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a8",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 4017,
"version": 1,
"versionNonce": 4018,
"updated": 1706659200000,
"text": "BaseClass",
"originalText": "BaseClass",
"fontSize": 18,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-base-fields",
"type": "text",
"x": 112, "y": 176,
"width": 260, "height": 72,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a9",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 4019,
"version": 1,
"versionNonce": 4020,
"updated": 1706659200000,
"text": "+ id: string\n- name: string\n# createdAt: Date",
"originalText": "+ id: string\n- name: string\n# createdAt: Date",
"fontSize": 14,
"fontFamily": 5,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-base-methods",
"type": "text",
"x": 112, "y": 266,
"width": 260, "height": 45,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b0",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 4021,
"version": 1,
"versionNonce": 4022,
"updated": 1706659200000,
"text": "+ save(): void\n+ delete(): boolean",
"originalText": "+ save(): void\n+ delete(): boolean",
"fontSize": 14,
"fontFamily": 5,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-child-name",
"type": "text",
"x": 520, "y": 126,
"width": 240, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b1",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 4023,
"version": 1,
"versionNonce": 4024,
"updated": 1706659200000,
"text": "ChildClass",
"originalText": "ChildClass",
"fontSize": 18,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-child-fields",
"type": "text",
"x": 512, "y": 176,
"width": 260, "height": 72,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b2",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 4025,
"version": 1,
"versionNonce": 4026,
"updated": 1706659200000,
"text": "- role: string\n+ permissions: string[]",
"originalText": "- role: string\n+ permissions: string[]",
"fontSize": 14,
"fontFamily": 5,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-child-methods",
"type": "text",
"x": 512, "y": 266,
"width": 260, "height": 45,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b3",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 4027,
"version": 1,
"versionNonce": 4028,
"updated": 1706659200000,
"text": "+ hasPermission(p): boolean\n+ elevate(): void",
"originalText": "+ hasPermission(p): boolean\n+ elevate(): void",
"fontSize": 14,
"fontFamily": 5,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-inherit-label",
"type": "text",
"x": 400, "y": 202,
"width": 80, "height": 18,
"angle": 0,
"strokeColor": "#868e96",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b4",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 4029,
"version": 1,
"versionNonce": 4030,
"updated": 1706659200000,
"text": "extends",
"originalText": "extends",
"fontSize": 14,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "arrow-inherit",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
}
],
"appState": {
"viewBackgroundColor": "#ffffff",
"gridSize": 20
},
"files": {}
}
{
"type": "excalidraw",
"version": 2,
"source": "https://excalidraw.com",
"elements": [
{
"id": "external-user",
"type": "rectangle",
"x": 60, "y": 240, "width": 160, "height": 80,
"angle": 0,
"strokeColor": "#e67700",
"backgroundColor": "#ffec99",
"fillStyle": "solid",
"strokeWidth": 3,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a0",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 6001,
"version": 1,
"versionNonce": 6002,
"updated": 1706659200000,
"roundness": null,
"boundElements": [
{ "type": "text", "id": "text-external-user" },
{ "type": "arrow", "id": "arrow-user-process" }
]
},
{
"id": "process",
"type": "ellipse",
"x": 320, "y": 220, "width": 200, "height": 120,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "#a5d8ff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a1",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 6003,
"version": 1,
"versionNonce": 6004,
"updated": 1706659200000,
"roundness": null,
"boundElements": [
{ "type": "text", "id": "text-process" },
{ "type": "arrow", "id": "arrow-user-process" },
{ "type": "arrow", "id": "arrow-process-db" }
]
},
{
"id": "datastore",
"type": "rectangle",
"x": 620, "y": 240, "width": 200, "height": 80,
"angle": 0,
"strokeColor": "#0c8599",
"backgroundColor": "#96f2d7",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a2",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 6005,
"version": 1,
"versionNonce": 6006,
"updated": 1706659200000,
"roundness": null,
"boundElements": [
{ "type": "text", "id": "text-datastore" },
{ "type": "arrow", "id": "arrow-process-db" }
]
},
{
"id": "datastore-top-line",
"type": "line",
"x": 620, "y": 240, "width": 200, "height": 0,
"angle": 0,
"strokeColor": "#0c8599",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a3",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 6007,
"version": 1,
"versionNonce": 6008,
"updated": 1706659200000,
"roundness": null,
"boundElements": [],
"points": [[0, 0], [200, 0]]
},
{
"id": "arrow-user-process",
"type": "arrow",
"x": 220, "y": 280, "width": 100, "height": 0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a4",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 6009,
"version": 1,
"versionNonce": 6010,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [{ "type": "text", "id": "text-arrow-user-process" }],
"points": [[0, 0], [100, 0]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "external-user", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "process", "focus": 0, "gap": 1 }
},
{
"id": "arrow-process-db",
"type": "arrow",
"x": 520, "y": 280, "width": 100, "height": 0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a5",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 6011,
"version": 1,
"versionNonce": 6012,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [{ "type": "text", "id": "text-arrow-process-db" }],
"points": [[0, 0], [100, 0]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "process", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "datastore", "focus": 0, "gap": 1 }
},
{
"id": "title",
"type": "text",
"x": 200, "y": 160,
"width": 480, "height": 35,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a6",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 6013,
"version": 1,
"versionNonce": 6014,
"updated": 1706659200000,
"text": "Data Flow Diagram",
"originalText": "Data Flow Diagram",
"fontSize": 28,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-external-user",
"type": "text",
"x": 80, "y": 270,
"width": 120, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a7",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 6015,
"version": 1,
"versionNonce": 6016,
"updated": 1706659200000,
"text": "User",
"originalText": "User",
"fontSize": 18,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "external-user",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-process",
"type": "text",
"x": 340, "y": 263,
"width": 160, "height": 34,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a8",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 6017,
"version": 1,
"versionNonce": 6018,
"updated": 1706659200000,
"text": "1.0\nProcess Data",
"originalText": "1.0\nProcess Data",
"fontSize": 16,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "process",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-datastore",
"type": "text",
"x": 640, "y": 270,
"width": 160, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a9",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 6019,
"version": 1,
"versionNonce": 6020,
"updated": 1706659200000,
"text": "D1: Database",
"originalText": "D1: Database",
"fontSize": 16,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "datastore",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-arrow-user-process",
"type": "text",
"x": 242, "y": 262,
"width": 100, "height": 18,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b0",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 6021,
"version": 1,
"versionNonce": 6022,
"updated": 1706659200000,
"text": "input data",
"originalText": "input data",
"fontSize": 14,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "arrow-user-process",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-arrow-process-db",
"type": "text",
"x": 542, "y": 262,
"width": 100, "height": 18,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b1",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 6023,
"version": 1,
"versionNonce": 6024,
"updated": 1706659200000,
"text": "processed data",
"originalText": "processed data",
"fontSize": 14,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "arrow-process-db",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
}
],
"appState": {
"viewBackgroundColor": "#ffffff",
"gridSize": 20
},
"files": {}
}
{
"type": "excalidraw",
"version": 2,
"source": "https://excalidraw.com",
"elements": [
{
"id": "entity-user",
"type": "rectangle",
"x": 60, "y": 120, "width": 220, "height": 180,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "#a5d8ff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a0",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 8001,
"version": 1,
"versionNonce": 8002,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "arrow", "id": "arrow-user-order" }
]
},
{
"id": "entity-order",
"type": "rectangle",
"x": 400, "y": 120, "width": 220, "height": 180,
"angle": 0,
"strokeColor": "#e67700",
"backgroundColor": "#ffec99",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a1",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 8003,
"version": 1,
"versionNonce": 8004,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "arrow", "id": "arrow-user-order" },
{ "type": "arrow", "id": "arrow-order-product" }
]
},
{
"id": "entity-product",
"type": "rectangle",
"x": 740, "y": 120, "width": 220, "height": 180,
"angle": 0,
"strokeColor": "#2f9e44",
"backgroundColor": "#b2f2bb",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a2",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 8005,
"version": 1,
"versionNonce": 8006,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "arrow", "id": "arrow-order-product" }
]
},
{
"id": "sep-user",
"type": "line",
"x": 60, "y": 168, "width": 220, "height": 0,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a3",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 8007,
"version": 1,
"versionNonce": 8008,
"updated": 1706659200000,
"roundness": null,
"boundElements": [],
"points": [[0, 0], [220, 0]]
},
{
"id": "sep-order",
"type": "line",
"x": 400, "y": 168, "width": 220, "height": 0,
"angle": 0,
"strokeColor": "#e67700",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a4",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 8009,
"version": 1,
"versionNonce": 8010,
"updated": 1706659200000,
"roundness": null,
"boundElements": [],
"points": [[0, 0], [220, 0]]
},
{
"id": "sep-product",
"type": "line",
"x": 740, "y": 168, "width": 220, "height": 0,
"angle": 0,
"strokeColor": "#2f9e44",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a5",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 8011,
"version": 1,
"versionNonce": 8012,
"updated": 1706659200000,
"roundness": null,
"boundElements": [],
"points": [[0, 0], [220, 0]]
},
{
"id": "arrow-user-order",
"type": "arrow",
"x": 280, "y": 210, "width": 120, "height": 0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a6",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 8013,
"version": 1,
"versionNonce": 8014,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [{ "type": "text", "id": "text-rel-user-order" }],
"points": [[0, 0], [120, 0]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "entity-user", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "entity-order", "focus": 0, "gap": 1 }
},
{
"id": "arrow-order-product",
"type": "arrow",
"x": 620, "y": 210, "width": 120, "height": 0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a7",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 8015,
"version": 1,
"versionNonce": 8016,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [{ "type": "text", "id": "text-rel-order-product" }],
"points": [[0, 0], [120, 0]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "entity-order", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "entity-product", "focus": 0, "gap": 1 }
},
{
"id": "title",
"type": "text",
"x": 300, "y": 60,
"width": 440, "height": 35,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a8",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 8017,
"version": 1,
"versionNonce": 8018,
"updated": 1706659200000,
"text": "ER Diagram",
"originalText": "ER Diagram",
"fontSize": 28,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-user-name",
"type": "text",
"x": 80, "y": 128,
"width": 180, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a9",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 8019,
"version": 1,
"versionNonce": 8020,
"updated": 1706659200000,
"text": "User",
"originalText": "User",
"fontSize": 18,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-user-attrs",
"type": "text",
"x": 72, "y": 176,
"width": 200, "height": 80,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b0",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 8021,
"version": 1,
"versionNonce": 8022,
"updated": 1706659200000,
"text": "PK user_id: int\n name: varchar\n email: varchar\n created_at: date",
"originalText": "PK user_id: int\n name: varchar\n email: varchar\n created_at: date",
"fontSize": 13,
"fontFamily": 5,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-order-name",
"type": "text",
"x": 420, "y": 128,
"width": 180, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b1",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 8023,
"version": 1,
"versionNonce": 8024,
"updated": 1706659200000,
"text": "Order",
"originalText": "Order",
"fontSize": 18,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-order-attrs",
"type": "text",
"x": 412, "y": 176,
"width": 200, "height": 80,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b2",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 8025,
"version": 1,
"versionNonce": 8026,
"updated": 1706659200000,
"text": "PK order_id: int\nFK user_id: int\n total: decimal\n order_date: date",
"originalText": "PK order_id: int\nFK user_id: int\n total: decimal\n order_date: date",
"fontSize": 13,
"fontFamily": 5,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-product-name",
"type": "text",
"x": 760, "y": 128,
"width": 180, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b3",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 8027,
"version": 1,
"versionNonce": 8028,
"updated": 1706659200000,
"text": "Product",
"originalText": "Product",
"fontSize": 18,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-product-attrs",
"type": "text",
"x": 752, "y": 176,
"width": 200, "height": 64,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b4",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 8029,
"version": 1,
"versionNonce": 8030,
"updated": 1706659200000,
"text": "PK product_id: int\n name: varchar\n price: decimal",
"originalText": "PK product_id: int\n name: varchar\n price: decimal",
"fontSize": 13,
"fontFamily": 5,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-rel-user-order",
"type": "text",
"x": 298, "y": 192,
"width": 100, "height": 18,
"angle": 0,
"strokeColor": "#868e96",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b5",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 8031,
"version": 1,
"versionNonce": 8032,
"updated": 1706659200000,
"text": "places (1:N)",
"originalText": "places (1:N)",
"fontSize": 13,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "arrow-user-order",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-rel-order-product",
"type": "text",
"x": 638, "y": 192,
"width": 100, "height": 18,
"angle": 0,
"strokeColor": "#868e96",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b6",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 8033,
"version": 1,
"versionNonce": 8034,
"updated": 1706659200000,
"text": "contains (N:M)",
"originalText": "contains (N:M)",
"fontSize": 13,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "arrow-order-product",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
}
],
"appState": {
"viewBackgroundColor": "#ffffff",
"gridSize": 20
},
"files": {}
}
{
"type": "excalidraw",
"version": 2,
"source": "https://excalidraw.com",
"elements": [
{
"id": "start",
"type": "ellipse",
"x": 280, "y": 80, "width": 200, "height": 60,
"angle": 0,
"strokeColor": "#2f9e44",
"backgroundColor": "#b2f2bb",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a0",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 1001,
"version": 1,
"versionNonce": 1002,
"updated": 1706659200000,
"roundness": null,
"boundElements": [
{ "type": "text", "id": "text-start" },
{ "type": "arrow", "id": "arrow-start-step1" }
]
},
{
"id": "step1",
"type": "rectangle",
"x": 260, "y": 200, "width": 240, "height": 80,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "#a5d8ff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a1",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 1003,
"version": 1,
"versionNonce": 1004,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "text", "id": "text-step1" },
{ "type": "arrow", "id": "arrow-start-step1" },
{ "type": "arrow", "id": "arrow-step1-decision" }
]
},
{
"id": "decision",
"type": "diamond",
"x": 260, "y": 340, "width": 240, "height": 100,
"angle": 0,
"strokeColor": "#e67700",
"backgroundColor": "#ffec99",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a2",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 1005,
"version": 1,
"versionNonce": 1006,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [
{ "type": "text", "id": "text-decision" },
{ "type": "arrow", "id": "arrow-step1-decision" },
{ "type": "arrow", "id": "arrow-yes" },
{ "type": "arrow", "id": "arrow-no" }
]
},
{
"id": "step2",
"type": "rectangle",
"x": 600, "y": 350, "width": 200, "height": 80,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "#a5d8ff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a3",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 1007,
"version": 1,
"versionNonce": 1008,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "text", "id": "text-step2" },
{ "type": "arrow", "id": "arrow-yes" }
]
},
{
"id": "step3",
"type": "rectangle",
"x": 260, "y": 500, "width": 240, "height": 80,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "#a5d8ff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a4",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 1009,
"version": 1,
"versionNonce": 1010,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "text", "id": "text-step3" },
{ "type": "arrow", "id": "arrow-no" },
{ "type": "arrow", "id": "arrow-step3-end" }
]
},
{
"id": "end",
"type": "ellipse",
"x": 280, "y": 640, "width": 200, "height": 60,
"angle": 0,
"strokeColor": "#e03131",
"backgroundColor": "#ffc9c9",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a5",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 1011,
"version": 1,
"versionNonce": 1012,
"updated": 1706659200000,
"roundness": null,
"boundElements": [
{ "type": "text", "id": "text-end" },
{ "type": "arrow", "id": "arrow-step3-end" }
]
},
{
"id": "arrow-start-step1",
"type": "arrow",
"x": 380, "y": 140, "width": 0, "height": 60,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a6",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 1013,
"version": 1,
"versionNonce": 1014,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [],
"points": [[0, 0], [0, 60]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "start", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "step1", "focus": 0, "gap": 1 }
},
{
"id": "arrow-step1-decision",
"type": "arrow",
"x": 380, "y": 280, "width": 0, "height": 60,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a7",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 1015,
"version": 1,
"versionNonce": 1016,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [],
"points": [[0, 0], [0, 60]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "step1", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "decision", "focus": 0, "gap": 1 }
},
{
"id": "arrow-yes",
"type": "arrow",
"x": 500, "y": 390, "width": 100, "height": 0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a8",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 1017,
"version": 1,
"versionNonce": 1018,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [],
"points": [[0, 0], [100, 0]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "decision", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "step2", "focus": 0, "gap": 1 }
},
{
"id": "arrow-no",
"type": "arrow",
"x": 380, "y": 440, "width": 0, "height": 60,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a9",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 1019,
"version": 1,
"versionNonce": 1020,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [],
"points": [[0, 0], [0, 60]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "decision", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "step3", "focus": 0, "gap": 1 }
},
{
"id": "arrow-step3-end",
"type": "arrow",
"x": 380, "y": 580, "width": 0, "height": 60,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b0",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 1021,
"version": 1,
"versionNonce": 1022,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [],
"points": [[0, 0], [0, 60]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "step3", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "end", "focus": 0, "gap": 1 }
},
{
"id": "title",
"type": "text",
"x": 220, "y": 30,
"width": 320, "height": 35,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b1",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 1023,
"version": 1,
"versionNonce": 1024,
"updated": 1706659200000,
"text": "Flowchart Title",
"originalText": "Flowchart Title",
"fontSize": 28,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "label-yes",
"type": "text",
"x": 512, "y": 370,
"width": 40, "height": 18,
"angle": 0,
"strokeColor": "#2f9e44",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b2",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 1025,
"version": 1,
"versionNonce": 1026,
"updated": 1706659200000,
"text": "Yes",
"originalText": "Yes",
"fontSize": 14,
"fontFamily": 5,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "label-no",
"type": "text",
"x": 390, "y": 450,
"width": 30, "height": 18,
"angle": 0,
"strokeColor": "#e03131",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b3",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 1027,
"version": 1,
"versionNonce": 1028,
"updated": 1706659200000,
"text": "No",
"originalText": "No",
"fontSize": 14,
"fontFamily": 5,
"textAlign": "left",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-start",
"type": "text",
"x": 300, "y": 100,
"width": 160, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b4",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 1029,
"version": 1,
"versionNonce": 1030,
"updated": 1706659200000,
"text": "Start",
"originalText": "Start",
"fontSize": 20,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "start",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-step1",
"type": "text",
"x": 280, "y": 230,
"width": 200, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b5",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 1031,
"version": 1,
"versionNonce": 1032,
"updated": 1706659200000,
"text": "Step 1",
"originalText": "Step 1",
"fontSize": 20,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "step1",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-decision",
"type": "text",
"x": 280, "y": 378,
"width": 200, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b6",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 1033,
"version": 1,
"versionNonce": 1034,
"updated": 1706659200000,
"text": "Condition?",
"originalText": "Condition?",
"fontSize": 20,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "decision",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-step2",
"type": "text",
"x": 620, "y": 380,
"width": 160, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b7",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 1035,
"version": 1,
"versionNonce": 1036,
"updated": 1706659200000,
"text": "Step 2 (Yes)",
"originalText": "Step 2 (Yes)",
"fontSize": 20,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "step2",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-step3",
"type": "text",
"x": 280, "y": 530,
"width": 200, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b8",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 1037,
"version": 1,
"versionNonce": 1038,
"updated": 1706659200000,
"text": "Step 3 (No)",
"originalText": "Step 3 (No)",
"fontSize": 20,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "step3",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-end",
"type": "text",
"x": 300, "y": 660,
"width": 160, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b9",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 1039,
"version": 1,
"versionNonce": 1040,
"updated": 1706659200000,
"text": "End",
"originalText": "End",
"fontSize": 20,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "end",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
}
],
"appState": {
"viewBackgroundColor": "#ffffff",
"gridSize": 20
},
"files": {}
}
{
"type": "excalidraw",
"version": 2,
"source": "https://excalidraw.com",
"elements": [
{
"id": "center",
"type": "ellipse",
"x": 380, "y": 280, "width": 200, "height": 80,
"angle": 0,
"strokeColor": "#e67700",
"backgroundColor": "#ffec99",
"fillStyle": "solid",
"strokeWidth": 3,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a0",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2001,
"version": 1,
"versionNonce": 2002,
"updated": 1706659200000,
"roundness": null,
"boundElements": [
{ "type": "text", "id": "text-center" },
{ "type": "arrow", "id": "arrow-center-b1" },
{ "type": "arrow", "id": "arrow-center-b2" },
{ "type": "arrow", "id": "arrow-center-b3" },
{ "type": "arrow", "id": "arrow-center-b4" }
]
},
{
"id": "branch1",
"type": "rectangle",
"x": 80, "y": 180, "width": 200, "height": 60,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "#a5d8ff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a1",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2003,
"version": 1,
"versionNonce": 2004,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "text", "id": "text-branch1" },
{ "type": "arrow", "id": "arrow-center-b1" },
{ "type": "arrow", "id": "arrow-b1-s1" },
{ "type": "arrow", "id": "arrow-b1-s2" }
]
},
{
"id": "branch2",
"type": "rectangle",
"x": 80, "y": 400, "width": 200, "height": 60,
"angle": 0,
"strokeColor": "#2f9e44",
"backgroundColor": "#b2f2bb",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a2",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2005,
"version": 1,
"versionNonce": 2006,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "text", "id": "text-branch2" },
{ "type": "arrow", "id": "arrow-center-b2" },
{ "type": "arrow", "id": "arrow-b2-s1" },
{ "type": "arrow", "id": "arrow-b2-s2" }
]
},
{
"id": "branch3",
"type": "rectangle",
"x": 680, "y": 180, "width": 200, "height": 60,
"angle": 0,
"strokeColor": "#7048e8",
"backgroundColor": "#d0bfff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a3",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2007,
"version": 1,
"versionNonce": 2008,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "text", "id": "text-branch3" },
{ "type": "arrow", "id": "arrow-center-b3" },
{ "type": "arrow", "id": "arrow-b3-s1" },
{ "type": "arrow", "id": "arrow-b3-s2" }
]
},
{
"id": "branch4",
"type": "rectangle",
"x": 680, "y": 400, "width": 200, "height": 60,
"angle": 0,
"strokeColor": "#0c8599",
"backgroundColor": "#96f2d7",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a4",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2009,
"version": 1,
"versionNonce": 2010,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "text", "id": "text-branch4" },
{ "type": "arrow", "id": "arrow-center-b4" },
{ "type": "arrow", "id": "arrow-b4-s1" },
{ "type": "arrow", "id": "arrow-b4-s2" }
]
},
{
"id": "sub-b1-1",
"type": "rectangle",
"x": -160, "y": 140, "width": 180, "height": 50,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "#dbe4ff",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a5",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2011,
"version": 1,
"versionNonce": 2012,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "text", "id": "text-sub-b1-1" },
{ "type": "arrow", "id": "arrow-b1-s1" }
]
},
{
"id": "sub-b1-2",
"type": "rectangle",
"x": -160, "y": 220, "width": 180, "height": 50,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "#dbe4ff",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a6",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2013,
"version": 1,
"versionNonce": 2014,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "text", "id": "text-sub-b1-2" },
{ "type": "arrow", "id": "arrow-b1-s2" }
]
},
{
"id": "sub-b2-1",
"type": "rectangle",
"x": -160, "y": 360, "width": 180, "height": 50,
"angle": 0,
"strokeColor": "#2f9e44",
"backgroundColor": "#d3f9d8",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a7",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2015,
"version": 1,
"versionNonce": 2016,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "text", "id": "text-sub-b2-1" },
{ "type": "arrow", "id": "arrow-b2-s1" }
]
},
{
"id": "sub-b2-2",
"type": "rectangle",
"x": -160, "y": 440, "width": 180, "height": 50,
"angle": 0,
"strokeColor": "#2f9e44",
"backgroundColor": "#d3f9d8",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a8",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2017,
"version": 1,
"versionNonce": 2018,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "text", "id": "text-sub-b2-2" },
{ "type": "arrow", "id": "arrow-b2-s2" }
]
},
{
"id": "sub-b3-1",
"type": "rectangle",
"x": 940, "y": 140, "width": 180, "height": 50,
"angle": 0,
"strokeColor": "#7048e8",
"backgroundColor": "#e5dbff",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a9",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2019,
"version": 1,
"versionNonce": 2020,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "text", "id": "text-sub-b3-1" },
{ "type": "arrow", "id": "arrow-b3-s1" }
]
},
{
"id": "sub-b3-2",
"type": "rectangle",
"x": 940, "y": 220, "width": 180, "height": 50,
"angle": 0,
"strokeColor": "#7048e8",
"backgroundColor": "#e5dbff",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b0",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2021,
"version": 1,
"versionNonce": 2022,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "text", "id": "text-sub-b3-2" },
{ "type": "arrow", "id": "arrow-b3-s2" }
]
},
{
"id": "sub-b4-1",
"type": "rectangle",
"x": 940, "y": 360, "width": 180, "height": 50,
"angle": 0,
"strokeColor": "#0c8599",
"backgroundColor": "#c3fae8",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b1",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2023,
"version": 1,
"versionNonce": 2024,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "text", "id": "text-sub-b4-1" },
{ "type": "arrow", "id": "arrow-b4-s1" }
]
},
{
"id": "sub-b4-2",
"type": "rectangle",
"x": 940, "y": 440, "width": 180, "height": 50,
"angle": 0,
"strokeColor": "#0c8599",
"backgroundColor": "#c3fae8",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b2",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2025,
"version": 1,
"versionNonce": 2026,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "text", "id": "text-sub-b4-2" },
{ "type": "arrow", "id": "arrow-b4-s2" }
]
},
{
"id": "arrow-center-b1",
"type": "arrow",
"x": 380, "y": 310, "width": 100, "height": -100,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b3",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2027,
"version": 1,
"versionNonce": 2028,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [],
"points": [[0, 0], [-100, -100]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "center", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "branch1", "focus": 0, "gap": 1 }
},
{
"id": "arrow-center-b2",
"type": "arrow",
"x": 380, "y": 340, "width": 100, "height": 90,
"angle": 0,
"strokeColor": "#2f9e44",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b4",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2029,
"version": 1,
"versionNonce": 2030,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [],
"points": [[0, 0], [-100, 90]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "center", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "branch2", "focus": 0, "gap": 1 }
},
{
"id": "arrow-center-b3",
"type": "arrow",
"x": 580, "y": 310, "width": 100, "height": -100,
"angle": 0,
"strokeColor": "#7048e8",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b5",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2031,
"version": 1,
"versionNonce": 2032,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [],
"points": [[0, 0], [100, -100]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "center", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "branch3", "focus": 0, "gap": 1 }
},
{
"id": "arrow-center-b4",
"type": "arrow",
"x": 580, "y": 340, "width": 100, "height": 90,
"angle": 0,
"strokeColor": "#0c8599",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b6",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2033,
"version": 1,
"versionNonce": 2034,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [],
"points": [[0, 0], [100, 90]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "center", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "branch4", "focus": 0, "gap": 1 }
},
{
"id": "arrow-b1-s1",
"type": "arrow",
"x": 80, "y": 200, "width": 60, "height": -35,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b7",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2035,
"version": 1,
"versionNonce": 2036,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [],
"points": [[0, 0], [-60, -35]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "branch1", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "sub-b1-1", "focus": 0, "gap": 1 }
},
{
"id": "arrow-b1-s2",
"type": "arrow",
"x": 80, "y": 220, "width": 60, "height": 25,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b8",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2037,
"version": 1,
"versionNonce": 2038,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [],
"points": [[0, 0], [-60, 25]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "branch1", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "sub-b1-2", "focus": 0, "gap": 1 }
},
{
"id": "arrow-b2-s1",
"type": "arrow",
"x": 80, "y": 415, "width": 60, "height": -30,
"angle": 0,
"strokeColor": "#2f9e44",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b9",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2039,
"version": 1,
"versionNonce": 2040,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [],
"points": [[0, 0], [-60, -30]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "branch2", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "sub-b2-1", "focus": 0, "gap": 1 }
},
{
"id": "arrow-b2-s2",
"type": "arrow",
"x": 80, "y": 440, "width": 60, "height": 45,
"angle": 0,
"strokeColor": "#2f9e44",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "c0",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2041,
"version": 1,
"versionNonce": 2042,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [],
"points": [[0, 0], [-60, 45]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "branch2", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "sub-b2-2", "focus": 0, "gap": 1 }
},
{
"id": "arrow-b3-s1",
"type": "arrow",
"x": 880, "y": 200, "width": 60, "height": -35,
"angle": 0,
"strokeColor": "#7048e8",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "c1",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2043,
"version": 1,
"versionNonce": 2044,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [],
"points": [[0, 0], [60, -35]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "branch3", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "sub-b3-1", "focus": 0, "gap": 1 }
},
{
"id": "arrow-b3-s2",
"type": "arrow",
"x": 880, "y": 220, "width": 60, "height": 25,
"angle": 0,
"strokeColor": "#7048e8",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "c2",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2045,
"version": 1,
"versionNonce": 2046,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [],
"points": [[0, 0], [60, 25]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "branch3", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "sub-b3-2", "focus": 0, "gap": 1 }
},
{
"id": "arrow-b4-s1",
"type": "arrow",
"x": 880, "y": 415, "width": 60, "height": -30,
"angle": 0,
"strokeColor": "#0c8599",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "c3",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2047,
"version": 1,
"versionNonce": 2048,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [],
"points": [[0, 0], [60, -30]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "branch4", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "sub-b4-1", "focus": 0, "gap": 1 }
},
{
"id": "arrow-b4-s2",
"type": "arrow",
"x": 880, "y": 440, "width": 60, "height": 45,
"angle": 0,
"strokeColor": "#0c8599",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "c4",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2049,
"version": 1,
"versionNonce": 2050,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [],
"points": [[0, 0], [60, 45]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "branch4", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "sub-b4-2", "focus": 0, "gap": 1 }
},
{
"id": "title",
"type": "text",
"x": 300, "y": 220,
"width": 360, "height": 35,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "c5",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2051,
"version": 1,
"versionNonce": 2052,
"updated": 1706659200000,
"text": "Mind Map Title",
"originalText": "Mind Map Title",
"fontSize": 28,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-center",
"type": "text",
"x": 400, "y": 307,
"width": 160, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "c6",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2053,
"version": 1,
"versionNonce": 2054,
"updated": 1706659200000,
"text": "Central Topic",
"originalText": "Central Topic",
"fontSize": 20,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "center",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-branch1",
"type": "text",
"x": 100, "y": 197,
"width": 160, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "c7",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2055,
"version": 1,
"versionNonce": 2056,
"updated": 1706659200000,
"text": "Branch 1",
"originalText": "Branch 1",
"fontSize": 18,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "branch1",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-branch2",
"type": "text",
"x": 100, "y": 417,
"width": 160, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "c8",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2057,
"version": 1,
"versionNonce": 2058,
"updated": 1706659200000,
"text": "Branch 2",
"originalText": "Branch 2",
"fontSize": 18,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "branch2",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-branch3",
"type": "text",
"x": 700, "y": 197,
"width": 160, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "c9",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2059,
"version": 1,
"versionNonce": 2060,
"updated": 1706659200000,
"text": "Branch 3",
"originalText": "Branch 3",
"fontSize": 18,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "branch3",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-branch4",
"type": "text",
"x": 700, "y": 417,
"width": 160, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "d0",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2061,
"version": 1,
"versionNonce": 2062,
"updated": 1706659200000,
"text": "Branch 4",
"originalText": "Branch 4",
"fontSize": 18,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "branch4",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-sub-b1-1",
"type": "text",
"x": -140, "y": 152,
"width": 140, "height": 20,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "d1",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2063,
"version": 1,
"versionNonce": 2064,
"updated": 1706659200000,
"text": "Sub-topic 1.1",
"originalText": "Sub-topic 1.1",
"fontSize": 14,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "sub-b1-1",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-sub-b1-2",
"type": "text",
"x": -140, "y": 232,
"width": 140, "height": 20,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "d2",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2065,
"version": 1,
"versionNonce": 2066,
"updated": 1706659200000,
"text": "Sub-topic 1.2",
"originalText": "Sub-topic 1.2",
"fontSize": 14,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "sub-b1-2",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-sub-b2-1",
"type": "text",
"x": -140, "y": 372,
"width": 140, "height": 20,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "d3",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2067,
"version": 1,
"versionNonce": 2068,
"updated": 1706659200000,
"text": "Sub-topic 2.1",
"originalText": "Sub-topic 2.1",
"fontSize": 14,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "sub-b2-1",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-sub-b2-2",
"type": "text",
"x": -140, "y": 452,
"width": 140, "height": 20,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "d4",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2069,
"version": 1,
"versionNonce": 2070,
"updated": 1706659200000,
"text": "Sub-topic 2.2",
"originalText": "Sub-topic 2.2",
"fontSize": 14,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "sub-b2-2",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-sub-b3-1",
"type": "text",
"x": 960, "y": 152,
"width": 140, "height": 20,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "d5",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2071,
"version": 1,
"versionNonce": 2072,
"updated": 1706659200000,
"text": "Sub-topic 3.1",
"originalText": "Sub-topic 3.1",
"fontSize": 14,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "sub-b3-1",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-sub-b3-2",
"type": "text",
"x": 960, "y": 232,
"width": 140, "height": 20,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "d6",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2073,
"version": 1,
"versionNonce": 2074,
"updated": 1706659200000,
"text": "Sub-topic 3.2",
"originalText": "Sub-topic 3.2",
"fontSize": 14,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "sub-b3-2",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-sub-b4-1",
"type": "text",
"x": 960, "y": 372,
"width": 140, "height": 20,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "d7",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2075,
"version": 1,
"versionNonce": 2076,
"updated": 1706659200000,
"text": "Sub-topic 4.1",
"originalText": "Sub-topic 4.1",
"fontSize": 14,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "sub-b4-1",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-sub-b4-2",
"type": "text",
"x": 960, "y": 452,
"width": 140, "height": 20,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "d8",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 2077,
"version": 1,
"versionNonce": 2078,
"updated": 1706659200000,
"text": "Sub-topic 4.2",
"originalText": "Sub-topic 4.2",
"fontSize": 14,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "sub-b4-2",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
}
],
"appState": {
"viewBackgroundColor": "#ffffff",
"gridSize": 20
},
"files": {}
}
{
"type": "excalidraw",
"version": 2,
"source": "https://excalidraw.com",
"elements": [
{
"id": "entity-a",
"type": "rectangle",
"x": 60, "y": 220, "width": 200, "height": 80,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "#a5d8ff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a0",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 7001,
"version": 1,
"versionNonce": 7002,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "text", "id": "text-entity-a" },
{ "type": "arrow", "id": "arrow-a-b" }
]
},
{
"id": "entity-b",
"type": "rectangle",
"x": 380, "y": 100, "width": 200, "height": 80,
"angle": 0,
"strokeColor": "#2f9e44",
"backgroundColor": "#b2f2bb",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a1",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 7003,
"version": 1,
"versionNonce": 7004,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "text", "id": "text-entity-b" },
{ "type": "arrow", "id": "arrow-a-b" },
{ "type": "arrow", "id": "arrow-b-c" }
]
},
{
"id": "entity-c",
"type": "rectangle",
"x": 380, "y": 340, "width": 200, "height": 80,
"angle": 0,
"strokeColor": "#7048e8",
"backgroundColor": "#d0bfff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a2",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 7005,
"version": 1,
"versionNonce": 7006,
"updated": 1706659200000,
"roundness": { "type": 3 },
"boundElements": [
{ "type": "text", "id": "text-entity-c" },
{ "type": "arrow", "id": "arrow-b-c" }
]
},
{
"id": "arrow-a-b",
"type": "arrow",
"x": 260, "y": 260, "width": 120, "height": -120,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a3",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 7007,
"version": 1,
"versionNonce": 7008,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [{ "type": "text", "id": "text-rel-a-b" }],
"points": [[0, 0], [120, -120]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "entity-a", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "entity-b", "focus": 0, "gap": 1 }
},
{
"id": "arrow-b-c",
"type": "arrow",
"x": 480, "y": 180, "width": 0, "height": 160,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a4",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 7009,
"version": 1,
"versionNonce": 7010,
"updated": 1706659200000,
"roundness": { "type": 2 },
"boundElements": [{ "type": "text", "id": "text-rel-b-c" }],
"points": [[0, 0], [0, 160]],
"lastCommittedPoint": null,
"startArrowhead": null,
"endArrowhead": "arrow",
"startBinding": { "elementId": "entity-b", "focus": 0, "gap": 1 },
"endBinding": { "elementId": "entity-c", "focus": 0, "gap": 1 }
},
{
"id": "title",
"type": "text",
"x": 180, "y": 40,
"width": 440, "height": 35,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a5",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 7011,
"version": 1,
"versionNonce": 7012,
"updated": 1706659200000,
"text": "Relationship Diagram",
"originalText": "Relationship Diagram",
"fontSize": 28,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "top",
"containerId": null,
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-entity-a",
"type": "text",
"x": 80, "y": 250,
"width": 160, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a6",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 7013,
"version": 1,
"versionNonce": 7014,
"updated": 1706659200000,
"text": "Entity A",
"originalText": "Entity A",
"fontSize": 18,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "entity-a",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-entity-b",
"type": "text",
"x": 400, "y": 130,
"width": 160, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a7",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 7015,
"version": 1,
"versionNonce": 7016,
"updated": 1706659200000,
"text": "Entity B",
"originalText": "Entity B",
"fontSize": 18,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "entity-b",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-entity-c",
"type": "text",
"x": 400, "y": 370,
"width": 160, "height": 25,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "a8",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 7017,
"version": 1,
"versionNonce": 7018,
"updated": 1706659200000,
"text": "Entity C",
"originalText": "Entity C",
"fontSize": 18,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "entity-c",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-rel-a-b",
"type": "text",
"x": 278, "y": 182,
"width": 100, "height": 18,
"angle": 0,
"strokeColor": "#868e96",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b0",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 7019,
"version": 1,
"versionNonce": 7020,
"updated": 1706659200000,
"text": "uses",
"originalText": "uses",
"fontSize": 14,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "arrow-a-b",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
},
{
"id": "text-rel-b-c",
"type": "text",
"x": 448, "y": 243,
"width": 80, "height": 18,
"angle": 0,
"strokeColor": "#868e96",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": "b1",
"isDeleted": false,
"link": null,
"locked": false,
"seed": 7021,
"version": 1,
"versionNonce": 7022,
"updated": 1706659200000,
"text": "contains",
"originalText": "contains",
"fontSize": 14,
"fontFamily": 5,
"textAlign": "center",
"verticalAlign": "middle",
"containerId": "arrow-b-c",
"lineHeight": 1.25,
"autoResize": true,
"roundness": null
}
],
"appState": {
"viewBackgroundColor": "#ffffff",
"gridSize": 20
},
"files": {}
}
Icon Libraries
Read this file when the user requests diagrams with service icons (AWS, GCP, Azure, Kubernetes, etc.) or asks for professional architecture diagrams.
How It Works
Excalidraw supports icon libraries (.excalidrawlib files) that provide professional, standardized icons. This skill can use pre-split icon libraries to create polished architecture diagrams.
Checking for Available Libraries
Look for: libraries/<library-name>/reference.mdIf reference.md exists, the library is ready. It contains a lookup table of all available icon names.
If no libraries are set up, offer two options:
1. Create the diagram using basic shapes (rectangles, ellipses) with labels — still functional, just less visually polished 2. Guide the user through library setup (see below)
Using Icons (Python Scripts — Recommended)
The repository includes Python scripts that handle icon integration without consuming AI context tokens:
Adding icons to a diagram
python scripts/add-icon-to-diagram.py \
<diagram-path> <icon-name> <x> <y> \
[--label "Text"] [--library-path PATH]The --label flag adds a text label below the icon. Edit via .excalidraw.edit is enabled by default; pass --no-use-edit-suffix to disable.
Examples:
# Add EC2 icon at position (400, 300) with label
python scripts/add-icon-to-diagram.py diagram.excalidraw EC2 400 300 --label "Web Server"
# Add icon from a different library
python scripts/add-icon-to-diagram.py diagram.excalidraw Compute-Engine 500 200 \
--library-path libraries/gcp-icons --label "API Server"Adding connecting arrows
python scripts/add-arrow.py \
<diagram-path> <from-x> <from-y> <to-x> <to-y> \
[--label "Text"] [--style solid|dashed|dotted] [--color HEX]Examples:
# Simple arrow
python scripts/add-arrow.py diagram.excalidraw 300 250 500 300
# Arrow with label and custom style
python scripts/add-arrow.py diagram.excalidraw 400 350 600 400 \
--label "HTTPS" --style dashed --color "#7950f2"Complete workflow
# 1. Create base diagram with title and structure
# (Create .excalidraw file with basic elements: title text, region rectangles)
# 2. Check icon availability
# Read: libraries/aws-architecture-icons/reference.md
# 3. Add icons with labels
python scripts/add-icon-to-diagram.py my-diagram.excalidraw "Internet-gateway" 200 150 --label "Internet Gateway"
python scripts/add-icon-to-diagram.py my-diagram.excalidraw VPC 250 250
python scripts/add-icon-to-diagram.py my-diagram.excalidraw ELB 350 300 --label "Load Balancer"
python scripts/add-icon-to-diagram.py my-diagram.excalidraw EC2 450 350 --label "Web Server"
python scripts/add-icon-to-diagram.py my-diagram.excalidraw RDS 550 400 --label "Database"
# 4. Add connecting arrows
python scripts/add-arrow.py my-diagram.excalidraw 250 200 300 250 --label "traffic"
python scripts/add-arrow.py my-diagram.excalidraw 300 300 400 300
python scripts/add-arrow.py my-diagram.excalidraw 500 380 600 400 --label "SQL" --style dashedWhy use scripts:
- ✅ No token consumption — icon JSON data (200-1000 lines each) never enters AI context
- ✅ Accurate coordinates — calculations handled deterministically
- ✅ Automatic ID management — no risk of collision
- ✅ Fast and reusable — works with any Excalidraw library
Setting Up a Library
Guide the user through these steps:
Step 1: Create library directory
mkdir -p skills/excalidraw-studio/libraries/<library-name>Step 2: Download library
- Visit: <https://libraries.excalidraw.com/>
- Search for the desired icon set (e.g., "AWS Architecture Icons")
- Click download to get the
.excalidrawlibfile - Place it in the directory from Step 1
Step 3: Run splitter script
python skills/excalidraw-studio/scripts/split-excalidraw-library.py \
skills/excalidraw-studio/libraries/<library-name>/Step 4: Verify
After running the script, this structure should exist:
libraries/<library-name>/
<library-name>.excalidrawlib (original)
reference.md (generated — icon lookup table)
icons/ (generated — individual icon files)
API-Gateway.json
EC2.json
Lambda.json
S3.json
...Manual Icon Integration (Fallback)
Only use this if Python scripts are unavailable. This approach is token-expensive and error-prone.
1. Read libraries/<library-name>/reference.md to find icon names 2. Read individual icon JSON files from icons/ (200-1000 lines each) 3. Extract elements array, calculate bounding box, apply coordinate offset 4. Generate new unique IDs, update groupIds references 5. Copy transformed elements into the diagram
Challenges:
- ⚠️ High token consumption (200-1000 lines per icon)
- ⚠️ Complex coordinate transformation
- ⚠️ Risk of ID collision
- ⚠️ Time-consuming for many icons
Supported Libraries
This workflow works with any valid .excalidrawlib file from <https://libraries.excalidraw.com/>. Common categories:
- Cloud service icons (AWS, GCP, Azure)
- Kubernetes / infrastructure icons
- UI / Material icons
- Network diagram icons
Availability and naming vary; verify on the site before recommending to users.
# Avoid accidentally committing local Python artifacts produced when running these scripts.
# Byte-compiled / cache files
__pycache__/
*.py[cod]
*$py.class
# Virtual environments (people often create these next to scripts)
.venv/
venv/
env/
ENV/
# Tool caches
.pytest_cache/
.mypy_cache/
.ruff_cache/
.tox/
.nox/
# Coverage outputs
.coverage
.coverage.*
htmlcov/
# Packaging/build outputs (rare here, but harmless)
build/
dist/
*.egg-info/
.eggs/
# OS cruft
.DS_Store
Thumbs.db