---
name: excalidraw
description: Create and edit Excalidraw diagrams programmatically. Use when the user asks to create diagrams, flowcharts, architecture diagrams, wireframes, or any visual drawings in Excalidraw format (.excalidraw files).
---

# Excalidraw Diagram Creation

This skill enables you to create beautiful, hand-drawn style diagrams in the Excalidraw JSON format.

## File Format Overview

Excalidraw files (`.excalidraw`) are JSON with this structure:

```json
{
  "type": "excalidraw",
  "version": 2,
  "source": "https://excalidraw.com",
  "elements": [],
  "appState": {
    "viewBackgroundColor": "#ffffff",
    "gridSize": null
  },
  "files": {}
}
```

## Quick Start - Creating Elements

Every element needs at minimum: `type`, `id`, `x`, `y`, and styling properties.

### Minimal Rectangle
```json
{
  "type": "rectangle",
  "id": "rect-1",
  "x": 100,
  "y": 100,
  "width": 200,
  "height": 100,
  "angle": 0,
  "strokeColor": "#1e1e1e",
  "backgroundColor": "transparent",
  "fillStyle": "solid",
  "strokeWidth": 2,
  "strokeStyle": "solid",
  "roughness": 1,
  "opacity": 100,
  "seed": 1234,
  "version": 1,
  "versionNonce": 1234,
  "isDeleted": false,
  "groupIds": [],
  "boundElements": null,
  "link": null,
  "locked": false,
  "roundness": { "type": 3 }
}
```

### Text Element
```json
{
  "type": "text",
  "id": "text-1",
  "x": 120,
  "y": 130,
  "width": 160,
  "height": 25,
  "text": "Hello World",
  "fontSize": 20,
  "fontFamily": 1,
  "textAlign": "center",
  "verticalAlign": "middle",
  "angle": 0,
  "strokeColor": "#1e1e1e",
  "backgroundColor": "transparent",
  "fillStyle": "solid",
  "strokeWidth": 2,
  "strokeStyle": "solid",
  "roughness": 1,
  "opacity": 100,
  "seed": 5678,
  "version": 1,
  "versionNonce": 5678,
  "isDeleted": false,
  "groupIds": [],
  "boundElements": null,
  "link": null,
  "locked": false,
  "containerId": null,
  "originalText": "Hello World",
  "autoResize": true,
  "lineHeight": 1.25
}
```

### Arrow Element
```json
{
  "type": "arrow",
  "id": "arrow-1",
  "x": 300,
  "y": 150,
  "width": 100,
  "height": 0,
  "points": [[0, 0], [100, 0]],
  "startArrowhead": null,
  "endArrowhead": "arrow",
  "startBinding": null,
  "endBinding": null,
  "angle": 0,
  "strokeColor": "#1e1e1e",
  "backgroundColor": "transparent",
  "fillStyle": "solid",
  "strokeWidth": 2,
  "strokeStyle": "solid",
  "roughness": 1,
  "opacity": 100,
  "seed": 9012,
  "version": 1,
  "versionNonce": 9012,
  "isDeleted": false,
  "groupIds": [],
  "boundElements": null,
  "link": null,
  "locked": false
}
```

## Element Types

| Type | Use For |
|------|---------|
| `rectangle` | Boxes, containers, cards |
| `ellipse` | Circles, ovals, nodes |
| `diamond` | Decision points, conditions |
| `text` | Labels, descriptions |
| `arrow` | Connections, flow direction |
| `line` | Connectors without arrowheads |
| `freedraw` | Hand-drawn paths |
| `image` | Embedded images |
| `frame` | Grouping/framing elements |

## Color Palette (Recommended)

### Backgrounds
- `#a5d8ff` - Light blue
- `#b2f2bb` - Light green
- `#ffec99` - Light yellow
- `#ffc9c9` - Light red/pink
- `#e9ecef` - Light gray
- `#d0bfff` - Light purple
- `#99e9f2` - Light cyan

### Strokes
- `#1e1e1e` - Default black
- `#1971c2` - Blue
- `#2f9e44` - Green
- `#f08c00` - Orange
- `#e03131` - Red
- `#9c36b5` - Purple

## Styling Properties

| Property | Values | Description |
|----------|--------|-------------|
| `fillStyle` | `"solid"`, `"hachure"`, `"cross-hatch"` | Fill pattern |
| `strokeWidth` | `1`, `2`, `4` | Line thickness |
| `strokeStyle` | `"solid"`, `"dashed"`, `"dotted"` | Line style |
| `roughness` | `0`, `1`, `2` | Hand-drawn feel (0=smooth, 2=rough) |
| `opacity` | `0-100` | Transparency |
| `roundness` | `{ "type": 3 }` | Rounded corners |

## Connecting Elements with Arrows

To connect shapes with arrows, use bindings:

```json
{
  "type": "arrow",
  "id": "arrow-1",
  "startBinding": {
    "elementId": "rect-1",
    "focus": 0,
    "gap": 5
  },
  "endBinding": {
    "elementId": "rect-2",
    "focus": 0,
    "gap": 5
  },
  "points": [[0, 0], [200, 0]]
}
```

Also add `boundElements` to the connected shapes:
```json
{
  "type": "rectangle",
  "id": "rect-1",
  "boundElements": [{ "id": "arrow-1", "type": "arrow" }]
}
```

## Font Families

| Value | Font |
|-------|------|
| `1` | Hand-drawn (Virgil) |
| `2` | Normal (Helvetica) |
| `3` | Code (Cascadia) |

## Best Practices

1. **Generate unique IDs** - Use descriptive prefixes like `rect-1`, `arrow-2`, `text-header`
2. **Use random seeds** - Each element needs a unique `seed` for consistent rendering
3. **Space elements well** - Leave 50-100px between elements
4. **Align elements** - Use consistent x/y coordinates for visual alignment
5. **Group related items** - Use matching `groupIds` arrays
6. **Use the color palette** - Stick to Excalidraw's built-in colors for consistency

## Diagram Types You Can Create

| Type | Description |
|------|-------------|
| **Flowcharts** | Process flows, algorithms, decision trees |
| **Sequence Diagrams** | API calls, user interactions, message flows |
| **Architecture Diagrams** | System design, microservices, infrastructure |
| **Mind Maps** | Brainstorming, concept mapping, idea organization |
| **Data Flow Diagrams** | Data movement, system analysis |
| **ERD** | Database schemas, entity relationships |
| **Wireframes** | UI mockups, layout sketches |

## Reference Documentation

- **[diagram-patterns.md](diagram-patterns.md)** - Professional patterns for each diagram type (flowcharts, sequence diagrams, mind maps, architecture, etc.)
- **[examples.md](examples.md)** - Complete working JSON examples you can use as templates
- **[element-reference.md](element-reference.md)** - Full property reference for all element types
- **[best-practices.md](best-practices.md)** - Design tips, color theory, typography guidelines

## Quick Tips for Beautiful Diagrams

1. **Use `roughness: 0`** for formal/technical diagrams, `roughness: 1` for friendly sketches
2. **Use `fontFamily: 2`** (Helvetica) for professional look, `fontFamily: 1` (Virgil) only when casual look is requested
3. **Consistent spacing** - 100px between major elements, 50px for related items
4. **Color semantics** - Blue for info/input, Green for success/data, Yellow for decisions, Red for errors
5. **Arrow conventions** - Solid for actions, Dashed for responses/async
