Skip to content
Back to skills

Excalidraw

ASecurity

Hand-drawn Excalidraw diagrams (.excalidraw). Use for architecture, flowcharts, decision trees. Prefer the excalidraw tool over bash.

  • 5 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added November 7, 2026
ai-agentsgoshellbashnodegit

Works with

  • cli

Security analysis

A100/100

Scanned November 7, 2026

npx -y skills add nuroctane/nur-cli --skill excalidraw --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Excalidraw?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Excalidraw
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/nuroctane-excalidraw/badge)](https://www.skillsdirectory.com/skills/nuroctane-excalidraw)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: excalidraw
description: "Hand-drawn Excalidraw diagrams (.excalidraw). Use for architecture, flowcharts, decision trees. Prefer the excalidraw tool over bash."
---

# Excalidraw — diagrams from element JSON

Nur auto-installs `excalidraw-cli` (npm) when Node is available.
Prefer the **`excalidraw`** tool — do not shell out to bash for diagrams.

## When to use

- Architecture diagrams, request/data flows, decision flowcharts
- Not for pixel-perfect UI mockups (use design skills / HTML instead)

## Fast path

1. Build element JSON (camera → dark bg optional → shapes → arrows with bindings)
2. **`excalidraw(action=create, elements=[…], output="docs/foo.excalidraw")`**
   - Writes the file, uploads to excalidraw.com, and **opens the share URL in the user's browser** (default)
   - Do **not** stop at "here's a link" — create already opens it. Tell the user the browser should have opened.
3. Format help: `excalidraw(action=reference)` if stuck on schema
4. `open=false` only when the user asked not to open anything

## Open policy (critical)

- **Excalidraw = web share only.** `open=true` opens the browser to `https://excalidraw.com/...`.
- **Never** OS-open a local `.excalidraw` file:
  - forbidden: `Start-Process path\to\file.excalidraw`
  - forbidden: `open_uri::open_path(.excalidraw)` / `xdg-open` / `open` on the file
  - that triggers Windows **"Open with"** when no association exists
- If export fails or no share URL is printed: leave the file on disk and report the path + error. Do **not** "console open" the local file as a fallback.
- Prefer the `excalidraw` tool. If you must shell to CLI: `excalidraw export <file>` then open **only** the printed `https://excalidraw.com/...` URL.
- For interactive offline boards the user can keep editing natively: use **`tldraw`** / `/draw` (desktop app) — not Excalidraw.

## CLI defaults (omit these in JSON)

roughness=2 · roundness rounded · fontFamily=1 (handwritten) · strokeWidth=2

## Minimal shapes

```json
{ "type": "rectangle", "id": "r1", "x": 100, "y": 100, "width": 200, "height": 80,
  "backgroundColor": "#1e3a5f", "fillStyle": "solid", "strokeColor": "#4a9eed",
  "label": { "text": "Label", "strokeColor": "#e5e5e5" } }
```

Types: `rectangle` · `ellipse` · `diamond` · `text` · `arrow`

## Labels

Use `label: { "text": "…", "fontSize": 20, "strokeColor": "#e5e5e5" }` on shapes and arrows.
CLI expands labels into bound text elements.

## Arrows + bindings

```json
{ "type": "arrow", "id": "a1", "x": 300, "y": 140, "width": 150, "height": 0,
  "points": [[0,0],[150,0]], "endArrowhead": "arrow", "strokeColor": "#4a9eed",
  "startBinding": { "elementId": "b1", "fixedPoint": [1, 0.5] },
  "endBinding": { "elementId": "b2", "fixedPoint": [0, 0.5] },
  "label": { "text": "edge", "strokeColor": "#a0a0a0" } }
```

fixedPoint: right `[1,0.5]` · left `[0,0.5]` · top `[0.5,0]` · bottom `[0.5,1]`

Also add the arrow id to each shape's `boundElements`.

## Camera (4:3 required)

```json
{ "type": "cameraUpdate", "width": 1200, "height": 900, "x": 0, "y": 0 }
```

Sizes: 400×300 S · 600×450 M · **800×600 L** · **1200×900 XL** · 1600×1200 XXL

## Dark mode background (first element after camera)

```json
{ "type": "rectangle", "id": "darkbg", "x": -4000, "y": -3000, "width": 10000, "height": 7500,
  "backgroundColor": "#1e1e2e", "fillStyle": "solid", "strokeColor": "transparent", "strokeWidth": 0 }
```

Dark fills: `#1e3a5f` blue · `#1a4d2e` green · `#2d1b69` purple · `#5c3d1a` amber · `#5c1a1a` red · `#1a4d4d` teal  
Text: `#e5e5e5` primary · `#a0a0a0` muted

## Drawing order

camera → background zones → shape → its text/label → its arrows → next shape…  
**Bad:** all rects then all arrows. **Good:** progressive per node.

## Sizing rules

- Min labeled shape ~120×60 · gaps 20–30px · fontSize 28 title · 20 labels · 14 min
- No emoji (Excalifont does not render them)

## 3-box flow template

```json
[
  { "type": "cameraUpdate", "width": 1200, "height": 900, "x": 0, "y": 100 },
  { "type": "rectangle", "id": "darkbg", "x": -4000, "y": -3000, "width": 10000, "height": 7500,
    "backgroundColor": "#1e1e2e", "fillStyle": "solid", "strokeColor": "transparent", "strokeWidth": 0 },
  { "type": "rectangle", "id": "b1", "x": 60, "y": 350, "width": 220, "height": 90,
    "backgroundColor": "#1e3a5f", "fillStyle": "solid", "strokeColor": "#4a9eed",
    "label": { "text": "Request", "strokeColor": "#e5e5e5" },
    "boundElements": [{ "id": "a1", "type": "arrow" }] },
  { "type": "arrow", "id": "a1", "x": 280, "y": 395, "width": 200, "height": 0,
    "points": [[0,0],[200,0]], "endArrowhead": "arrow", "strokeColor": "#4a9eed",
    "startBinding": { "elementId": "b1", "fixedPoint": [1, 0.5] },
    "endBinding": { "elementId": "b2", "fixedPoint": [0, 0.5] },
    "label": { "text": "process", "strokeColor": "#a0a0a0" } },
  { "type": "rectangle", "id": "b2", "x": 500, "y": 350, "width": 220, "height": 90,
    "backgroundColor": "#5c3d1a", "fillStyle": "solid", "strokeColor": "#f59e0b",
    "label": { "text": "Server", "strokeColor": "#e5e5e5" },
    "boundElements": [{ "id": "a1", "type": "arrow" }, { "id": "a2", "type": "arrow" }] },
  { "type": "arrow", "id": "a2", "x": 720, "y": 395, "width": 200, "height": 0,
    "points": [[0,0],[200,0]], "endArrowhead": "arrow", "strokeColor": "#22c55e",
    "startBinding": { "elementId": "b2", "fixedPoint": [1, 0.5] },
    "endBinding": { "elementId": "b3", "fixedPoint": [0, 0.5] },
    "label": { "text": "respond", "strokeColor": "#a0a0a0" } },
  { "type": "rectangle", "id": "b3", "x": 940, "y": 350, "width": 220, "height": 90,
    "backgroundColor": "#1a4d2e", "fillStyle": "solid", "strokeColor": "#22c55e",
    "label": { "text": "Response", "strokeColor": "#e5e5e5" },
    "boundElements": [{ "id": "a2", "type": "arrow" }] }
]
```

Upstream: https://github.com/ahmadawais/excalidraw-cli

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.