* Add draw-io diagram generator skill for awesome github copilot * Add comprehensive shape libraries and style reference documentation for draw.io - Introduced a new markdown file for draw.io shape libraries detailing various built-in shapes, their style keys, and usage. - Added a complete style reference for `<mxCell>` elements, including universal style keys, shape-specific keys, edge styles, and color palettes. - Included examples for common styles and shapes to aid users in creating diagrams effectively. * Add draw-io diagram validation and shape addition scripts * Add new diagram templates for flowchart, sequence, and UML class diagrams - Created a flowchart template with a structured layout including start, steps, decision points, and end. - Added a sequence diagram template illustrating interactions between a client, API server, and database with activation boxes and message arrows. - Introduced a UML class diagram template featuring an interface, classes, attributes, methods, and relationships, including composition and realization. * Add draw-io diagram generator skill to README with detailed usage instructions and bundled assets * Add draw.io instructions with workflow, XML structure rules, style conventions, and validation checklist * Add draw.io diagram standards to README instructions for enhanced diagram creation and editing * Moving diagram templates to assets/ to follow agentskills structure - Moved flowchart template with start, steps, decision points, and end nodes. - Moved sequence diagram template illustrating interactions between a client, API server, and database. - Moved UML class diagram template featuring an interface, classes, attributes, methods, and relationships. * Clarify installation instructions for draw.io VS Code extension in SKILL.md
10 KiB
draw.io XML Schema Reference
Complete reference for the .drawio file format (mxGraph XML). Use this when generating, parsing, or validating diagram files.
Top-Level Structure
Every .drawio file is XML with this root structure:
<!-- Set modified to the current ISO 8601 timestamp when generating a new file -->
<mxfile host="Electron" modified=""
agent="draw.io" version="26.0.0" type="device">
<diagram id="<unique-id>" name="<Page Name>">
<mxGraphModel ...attributes...>
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<!-- All content cells here -->
</root>
</mxGraphModel>
</diagram>
</mxfile>
<mxfile> Attributes
| Attribute | Required | Default | Description |
|---|---|---|---|
host |
No | "app.diagrams.net" |
Origin editor ("Electron" for desktop/VS Code) |
modified |
No | — | ISO 8601 timestamp |
agent |
No | — | User agent string |
version |
No | — | draw.io version |
type |
No | "device" |
Storage type |
<diagram> Attributes
| Attribute | Required | Description |
|---|---|---|
id |
Yes | Unique page identifier (any string) |
name |
Yes | Tab label shown in editor |
<mxGraphModel> Attributes
| Attribute | Type | Default | Description |
|---|---|---|---|
dx |
int | 1422 |
Scroll X offset |
dy |
int | 762 |
Scroll Y offset |
grid |
0/1 |
1 |
Show grid |
gridSize |
int | 10 |
Grid snap size in px |
guides |
0/1 |
1 |
Show alignment guides |
tooltips |
0/1 |
1 |
Enable tooltips |
connect |
0/1 |
1 |
Enable connection arrows on hover |
arrows |
0/1 |
1 |
Show directional arrows |
fold |
0/1 |
1 |
Enable group fold/collapse |
page |
0/1 |
1 |
Show page boundary |
pageScale |
float | 1 |
Page zoom scale |
pageWidth |
int | 1169 |
Page width in px (A4 landscape) |
pageHeight |
int | 827 |
Page height in px (A4 landscape) |
math |
0/1 |
0 |
Enable LaTeX math rendering |
shadow |
0/1 |
0 |
Global shadow on shapes |
Common page sizes (px at 96dpi):
| Format | Width | Height |
|---|---|---|
| A4 landscape | 1169 |
827 |
| A4 portrait | 827 |
1169 |
| A3 landscape | 1654 |
1169 |
| Letter landscape | 1100 |
850 |
| Letter portrait | 850 |
1100 |
| Screen (16:9) | 1654 |
931 |
Reserved Cells (Always Required)
<mxCell id="0" /> <!-- Root cell — never omit, never add attributes -->
<mxCell id="1" parent="0" /> <!-- Default layer — all cells are children of this -->
These two cells MUST be the first entries inside <root>. IDs 0 and 1 are reserved and must not be used for any other cell.
Vertex (Shape) Element
<mxCell
id="2"
value="Label Text"
style="rounded=1;whiteSpace=wrap;html=1;"
vertex="1"
parent="1">
<mxGeometry x="200" y="160" width="120" height="60" as="geometry" />
</mxCell>
<mxCell> Vertex Attributes
| Attribute | Required | Type | Description |
|---|---|---|---|
id |
Yes | string | Unique identifier within this diagram |
value |
Yes | string | Label text (HTML allowed if style has html=1) |
style |
Yes | string | Semicolon-delimited key=value style string |
vertex |
Yes | "1" |
Must be "1" to declare this as a shape |
parent |
Yes | string | Parent cell ID ("1" for default layer) |
<mxGeometry> Vertex Attributes
| Attribute | Required | Type | Description |
|---|---|---|---|
x |
Yes | float | Left edge of shape (px from canvas origin) |
y |
Yes | float | Top edge of shape (px from canvas origin) |
width |
Yes | float | Shape width in px |
height |
Yes | float | Shape height in px |
as |
Yes | "geometry" |
Always "geometry" |
Edge (Connector) Element
<mxCell
id="5"
value="Label"
style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;"
edge="1"
source="2"
target="3"
parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell> Edge Attributes
| Attribute | Required | Type | Description |
|---|---|---|---|
id |
Yes | string | Unique identifier |
value |
Yes | string | Connector label (empty string for no label) |
style |
Yes | string | Style string (see Edge Styles) |
edge |
Yes | "1" |
Must be "1" to declare as connector |
source |
No | string | ID of source vertex |
target |
No | string | ID of target vertex |
parent |
Yes | string | Parent cell ID (usually "1") |
<mxGeometry> Edge Attributes
| Attribute | Required | Type | Description |
|---|---|---|---|
relative |
No | "1" |
Always "1" for edges |
as |
Yes | "geometry" |
Always "geometry" |
Edge with Label Offset
<mxGeometry x="-0.1" y="10" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
The x on relative geometry moves the label along the edge (-1 to 1). y is perpendicular offset in px.
Edge with Manual Waypoints (Control Points)
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="340" y="80" />
<mxPoint x="340" y="200" />
</Array>
</mxGeometry>
Multi-Page Diagrams
<mxfile>
<diagram id="page-1" name="Overview">
<mxGraphModel>...</mxGraphModel>
</diagram>
<diagram id="page-2" name="Detail">
<mxGraphModel>...</mxGraphModel>
</diagram>
</mxfile>
Each <diagram> is a separate page/tab. Cell IDs are scoped to their own <diagram> — the same ID value can appear in different pages without conflict.
Layer Cells
Layers replace the default id="1" layer. Cells are assigned to a layer via parent:
<mxCell id="0" />
<mxCell id="1" value="Background" parent="0" /> <!-- layer 1 -->
<mxCell id="layer2" value="Services" parent="0" /> <!-- layer 2 -->
<mxCell id="layer3" value="Connectors" parent="0" /> <!-- layer 3 -->
<!-- Assign layer via parent attribute -->
<mxCell id="10" value="API" ... parent="layer2">
<mxGeometry ... />
</mxCell>
Toggle layer visibility:
<mxCell id="layer2" value="Services" parent="0" visible="0" />
Swimlane Container
<!-- Swimlane container -->
<mxCell id="swim1" value="Process" style="shape=pool;startSize=30;horizontal=1;"
vertex="1" parent="1">
<mxGeometry x="40" y="40" width="800" height="340" as="geometry" />
</mxCell>
<!-- Lane 1 (child of swimlane container) -->
<mxCell id="lane1" value="Customer" style="swimlane;startSize=30;"
vertex="1" parent="swim1">
<mxGeometry x="0" y="30" width="800" height="150" as="geometry" />
</mxCell>
<!-- Shape inside lane (child of lane) -->
<mxCell id="step1" value="Place Order" style="rounded=1;whiteSpace=wrap;html=1;"
vertex="1" parent="lane1">
<mxGeometry x="80" y="50" width="120" height="60" as="geometry" />
</mxCell>
Key: Cells inside a swimlane have
parentset to the lane's ID, not"1".
Coordinates inside lanes are relative to the lane origin.
Group Cells
<!-- Invisible group container -->
<mxCell id="group1" value="" style="group;" vertex="1" parent="1">
<mxGeometry x="100" y="100" width="300" height="200" as="geometry" />
</mxCell>
<!-- Children relative to group origin -->
<mxCell id="child1" value="A" style="rounded=1;" vertex="1" parent="group1">
<mxGeometry x="20" y="20" width="100" height="60" as="geometry" />
</mxCell>
HTML Labels
When html=1 is in the style, value can contain HTML:
<mxCell value="<b>OrderService</b><br><i>:8080</i>"
style="rounded=1;html=1;" vertex="1" parent="1">
<mxGeometry x="100" y="100" width="160" height="60" as="geometry" />
</mxCell>
HTML must be XML-escaped:
<→<>→>&→&"→"
Common HTML tags supported: <b>, <i>, <u>, <br>, <font color="#hex">, <span style="...">, <hr/>
Tooltip / Metadata
<mxCell value="Service Name" tooltip="Handles order processing" style="..." vertex="1" parent="1">
<mxGeometry ... />
</mxCell>
ID Generation Rules
| Rule | Detail |
|---|---|
IDs 0 and 1 |
Reserved — always the root and default layer |
| All other IDs | Must be unique within their <diagram> |
| Safe pattern | Sequential integers starting at 2, or UUID strings |
| Cross-page | IDs do not need to be unique across different <diagram> pages |
Safe sequential ID example:
id="2", id="3", id="4", ...
UUID-style example:
id="a1b2c3d4-e5f6-7890-abcd-ef1234567890"
Coordinate System
- Origin
(0, 0)is top-left of the canvas xincreases rightwardyincreases downward- All units are pixels
Recommended Spacing
| Context | Value |
|---|---|
| Minimum gap between shapes | 40px |
| Comfortable gap | 80px |
| Swimlane inner padding | 20px |
| Page margin from edge | 40px |
| Connector routing clearance | 10px |
Minimal Valid .drawio File
<mxfile host="Electron" modified="2026-03-25T00:00:00.000Z" version="26.0.0">
<diagram id="main" name="Page-1">
<mxGraphModel dx="1422" dy="762" grid="1" gridSize="10" guides="1"
tooltips="1" connect="1" arrows="1" fold="1"
page="1" pageScale="1" pageWidth="1169" pageHeight="827"
math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
</root>
</mxGraphModel>
</diagram>
</mxfile>
Validation Rules
Must Pass
id="0"andid="1"cells always present as first two children of<root>- No other cell uses
id="0"orid="1" - All
idvalues are unique within each<diagram> - Every
<mxCell>has exactly one<mxGeometry>child <mxGeometry>hasas="geometry"attribute- Vertex cells have
vertex="1", edge cells haveedge="1" - Edge
source/targetIDs reference existing vertex IDs in the same diagram - Swimlane children have
parentset to the swimlane/lane ID, not"1" - HTML in
valueattributes is XML-escaped
Recommended
- Shapes do not overlap unless intentional (use ≥40px gap)
- Edge labels are short (≤4 words)
- Layer cells have descriptive
valuenames - All shapes fit within
pageWidth×pageHeightbounds