npx skills add ...
npx skills add davila7/claude-code-templates --skill draw-io
npx skills add davila7/claude-code-templates --skill draw-io
draw.io diagram creation, editing, and review. Use for .drawio XML editing, PNG conversion, layout adjustment, and AWS icon usage.
The same skill content is published under more than one repo. The install counts are split across them; any of these commands works.
.drawio files.drawio.png files.drawio.png by pre-commit hook in slidesFor diagrams used in Quarto slides,
specify defaultFontFamily in mxGraphModel tag:
Also explicitly specify fontFamily in each text element's style attribute:
See conversion script at scripts/convert-drawio-to-png.sh.
Internal command used:
| Option | Description |
|---|---|
-x | Export mode |
-f png | PNG format output |
-s 2 | 2x scale (high resolution) |
-t | Transparent background |
-o | Output file path |
.drawio file in text editor (plain XML format)mxCell for element to adjust (search by value attribute for text)mxGeometry tag
x: Position from lefty: Position from topwidth: Widthheight: Heighty + (height / 2)Separate complex systems into staged diagrams:
| Diagram Type | Purpose |
|---|---|
| Context Diagram | System overview from external perspective |
| System Diagram | Main components and relationships |
| Component Diagram | Technical details and integration points |
| Deployment Diagram | Infrastructure configuration |
| Data Flow Diagram | Data flow and transformation |
| Sequence Diagram | Time-series interactions |
Include title, description, last updated, author, and version in diagrams.
background="#ffffff"For text elements, exitX/exitY don't work, so use explicit coordinates:
Adjust offset attribute to distance arrow labels from arrows:
<br> tag for line breaksWhen placing elements inside background frames (grouping boxes), ensure sufficient margin.
rounded=1) and stroke widthCoordinate calculation verification:
Bad example (may overflow):
Good example (sufficient margin):
AWS icon search examples:
Add auto-stretch: false to YAML header:
This ensures correct image display on mobile devices.*
drawio -x -f png -s 2 -t -o output.drawio.png input.drawio<!-- For 10-character text, allow 300-400px -->
<mxGeometry x="140" y="60" width="400" height="40" /><!-- Title -->
<mxCell id="title" value="..." .../>
<!-- Arrows (back layer) -->
<mxCell id="arrow1" style="edgeStyle=..." .../>
<!-- Other elements (front layer) -->
<mxCell id="box1" .../><!-- Good: Explicit coordinates with sourcePoint/targetPoint -->
<mxCell id="arrow" style="..." edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="1279" y="500" as="sourcePoint"/>
<mxPoint x="119" y="500" as="targetPoint"/>
<Array as="points">
<mxPoint x="1279" y="560"/>
<mxPoint x="119" y="560"/>
</Array>
</mxGeometry>
</mxCell><!-- Place above arrow (negative value to distance) -->
<mxPoint x="0" y="-40" as="offset"/>
<!-- Place below arrow (positive value to distance) -->
<mxPoint x="0" y="40" as="offset"/>Background frame: y=20, height=400 -> range is y=20-420
Internal element top: frame y + 30 or more (e.g., y=50)
Internal element bottom: frame y + height - 30 or less (e.g., up to y=390)<!-- Background frame -->
<mxCell id="bg" style="rounded=1;strokeWidth=3;...">
<mxGeometry x="500" y="20" width="560" height="400" />
</mxCell>
<!-- Text: y=30 is too close to frame top (y=20) -->
<mxCell id="label" value="Title" style="text;...">
<mxGeometry x="510" y="30" width="540" height="35" />
</mxCell><!-- Background frame -->
<mxCell id="bg" style="rounded=1;strokeWidth=3;...">
<mxGeometry x="500" y="20" width="560" height="430" />
</mxCell>
<!-- Text: y=50 is 30px from frame top (y=20) -->
<mxCell id="label" value="Title" style="text;...">
<mxGeometry x="510" y="50" width="540" height="35" />
</mxCell>python ~/.claude/skills/draw-io/scripts/find_aws_icon.py ec2
python ~/.claude/skills/draw-io/scripts/find_aws_icon.py lambda---
title: "Your Presentation"
format:
revealjs:
auto-stretch: false
---