excalidraw-ai — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited excalidraw-ai (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Generate Excalidraw diagrams by writing JSON directly. No templates needed - you have full control over every element.
Use this skill when you need to:
An Excalidraw file is a JSON object with this structure:
{
"type": "excalidraw",
"version": 2,
"source": "https://excalidraw.com",
"elements": [ /* array of element objects */ ],
"appState": {
"viewBackgroundColor": "#ffffff",
"gridSize": null
},
"files": {}
}#### Rectangle
{
"id": "unique-id-1",
"type": "rectangle",
"x": 100,
"y": 100,
"width": 200,
"height": 100,
"strokeColor": "#1971c2",
"backgroundColor": "#a5d8ff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"angle": 0,
"seed": 12345,
"isDeleted": false
}#### Ellipse
{
"id": "unique-id-2",
"type": "ellipse",
"x": 100,
"y": 100,
"width": 150,
"height": 100,
"strokeColor": "#7c3aed",
"backgroundColor": "#ede9fe",
"fillStyle": "solid",
"strokeWidth": 2,
"roughness": 1
}#### Diamond
{
"id": "unique-id-3",
"type": "diamond",
"x": 100,
"y": 100,
"width": 120,
"height": 120,
"strokeColor": "#dc2626",
"backgroundColor": "#fee2e2",
"fillStyle": "solid"
}#### Text
{
"id": "unique-id-4",
"type": "text",
"x": 110,
"y": 140,
"width": 180,
"height": 25,
"text": "Your Label Here",
"fontSize": 20,
"fontFamily": 1,
"textAlign": "center",
"verticalAlign": "middle",
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent"
}#### Arrow
{
"id": "unique-id-5",
"type": "arrow",
"x": 300,
"y": 150,
"width": 100,
"height": 50,
"strokeColor": "#1971c2",
"strokeWidth": 2,
"points": [[0, 0], [100, 50]],
"startBinding": {
"elementId": "source-element-id",
"focus": 0.5,
"gap": 5
},
"endBinding": {
"elementId": "target-element-id",
"focus": 0.5,
"gap": 5
},
"startArrowhead": null,
"endArrowhead": "arrow"
}#### Line
{
"id": "unique-id-6",
"type": "line",
"x": 100,
"y": 100,
"width": 200,
"height": 0,
"strokeColor": "#868e96",
"strokeWidth": 1,
"points": [[0, 0], [200, 0]],
"startArrowhead": null,
"endArrowhead": null
}| Property | Type | Description |
|---|---|---|
id | string | Unique identifier (use UUID or similar) |
type | string | rectangle, ellipse, diamond, text, arrow, line |
x, y | number | Position coordinates |
width, height | number | Dimensions |
strokeColor | string | Border/stroke color (hex) |
backgroundColor | string | Fill color (hex) or "transparent" |
fillStyle | string | "solid", "hachure", "cross-hatch" |
strokeWidth | number | Line thickness (1, 2, 4) |
strokeStyle | string | "solid", "dashed", "dotted" |
roughness | number | 0 = sharp, 1 = normal, 2 = sketchy |
opacity | number | 0-100 |
angle | number | Rotation in radians |
groupIds | array | Group element IDs together |
seed | number | Random seed for hand-drawn effect |
| Property | Type | Description |
|---|---|---|
text | string | The text content |
fontSize | number | Font size in pixels |
fontFamily | number | 1 = Virgil (hand-drawn), 2 = Helvetica, 3 = Cascadia |
textAlign | string | "left", "center", "right" |
verticalAlign | string | "top", "middle" |
| Property | Type | Description |
|---|---|---|
points | array | Array of [x, y] coordinates relative to element origin |
startBinding | object | Connection to source element |
endBinding | object | Connection to target element |
startArrowhead | string | null, "arrow", "bar", "dot", "triangle" |
endArrowhead | string | null, "arrow", "bar", "dot", "triangle" |
| Component Type | Stroke | Background | Use For |
|---|---|---|---|
| Database | #7c3aed | #ede9fe | PostgreSQL, MySQL, MongoDB |
| Cache | #dc2626 | #fee2e2 | Redis, Memcached |
| Queue | #16a34a | #dcfce7 | Kafka, RabbitMQ, SQS |
| Load Balancer | #0891b2 | #cffafe | Nginx, HAProxy, ALB |
| Gateway | #475569 | #f1f5f9 | API Gateway, Kong |
| CDN | #06b6d4 | #e0f2fe | CloudFront, Fastly |
| Auth | #e11d48 | #ffe4e6 | OAuth, IAM, Cognito |
| Storage | #d97706 | #fef3c7 | S3, Blob Storage |
| Service | #2563eb | #dbeafe | Backend services, APIs |
| Container | #0284c7 | #bae6fd | Docker, Kubernetes |
| Function | #f59e0b | #fef3c7 | Lambda, Serverless |
| Monitoring | #84cc16 | #ecfccb | Prometheus, Grafana |
| Web App | #4f46e5 | #e0e7ff | React, Vue, Frontend |
| Mobile | #6366f1 | #eef2ff | iOS, Android |
Modern (Default)
#1971c2 / #e7f5ff#64748b / #f1f5f9Sketchy (Hand-drawn)
#495057 / #f8f9faroughness: 2 and fontFamily: 3Technical
#2f9e44 / #ebfbeestrokeStyle: "dashed" for connectionsProfessional icons are available in .excalidrawlib files in the assets/ directory:
| Library | Components | Content |
|---|---|---|
aws-architecture-icons.excalidrawlib | 248 | AWS service icons (Lambda, S3, EC2, RDS, DynamoDB, SQS, etc.) |
system-design.excalidrawlib | 24 | System design elements (server, database, storage, etc.) |
drwnio.excalidrawlib | 18 | Draw.io style icons |
system-design-template.excalidrawlib | 8 | Pre-built templates (steps, flow, db, etc.) |
software-architecture.excalidrawlib | 7 | Software architecture components |
Library files contain element arrays that can be embedded directly into your diagram. Each library item is an array of Excalidraw elements that form a component.
To use: Parse the library JSON, find the component you need, adjust positions, and include in your diagram's elements array.
Organize components in layers (top to bottom):
Layer 1: Client/External (y: 100)
Layer 2: Edge/CDN (y: 280)
Layer 3: Gateway/Load Balancer (y: 460)
Layer 4: Services (y: 640)
Layer 5: Data/Cache (y: 820)
Layer 6: Infrastructure (y: 1000)Spacing recommendations:
Arrange left-to-right or top-to-bottom:
Radial layout from center:
{
"type": "excalidraw",
"version": 2,
"source": "https://excalidraw.com",
"elements": [
{
"id": "api-gateway",
"type": "rectangle",
"x": 100,
"y": 100,
"width": 180,
"height": 80,
"strokeColor": "#475569",
"backgroundColor": "#f1f5f9",
"fillStyle": "solid",
"strokeWidth": 2,
"roughness": 0,
"opacity": 100,
"groupIds": ["group-1"],
"seed": 1234
},
{
"id": "api-gateway-label",
"type": "text",
"x": 140,
"y": 130,
"width": 100,
"height": 25,
"text": "API Gateway",
"fontSize": 16,
"fontFamily": 1,
"textAlign": "center",
"strokeColor": "#1e1e1e",
"groupIds": ["group-1"]
},
{
"id": "redis",
"type": "diamond",
"x": 100,
"y": 280,
"width": 180,
"height": 100,
"strokeColor": "#dc2626",
"backgroundColor": "#fee2e2",
"fillStyle": "solid",
"strokeWidth": 2,
"roughness": 0,
"seed": 5678
},
{
"id": "redis-label",
"type": "text",
"x": 155,
"y": 320,
"width": 70,
"height": 20,
"text": "Redis",
"fontSize": 16,
"fontFamily": 1,
"textAlign": "center",
"strokeColor": "#1e1e1e"
},
{
"id": "arrow-1",
"type": "arrow",
"x": 190,
"y": 180,
"width": 0,
"height": 100,
"strokeColor": "#64748b",
"strokeWidth": 2,
"points": [[0, 0], [0, 100]],
"startBinding": {"elementId": "api-gateway", "focus": 0.5, "gap": 5},
"endBinding": {"elementId": "redis", "focus": 0.5, "gap": 5},
"endArrowhead": "arrow"
}
],
"appState": {
"viewBackgroundColor": "#ffffff",
"gridSize": null
},
"files": {}
}Save your diagram as a .excalidraw or .json file. It can be:
groupIds to keep shapes and their labels togetherstartBinding and endBindingseed: hash(id) for consistent hand-drawn rendering~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.