Receber por email
← Voltar para o catálogo

excalidraw

Use when user requests diagrams, flowcharts, architecture charts, or visualizations. Also use proactively when explaining systems with 3+ components, complex data flows, or relationships that benefit from visual representation. Generates .excalidraw files and exports to PNG/SVG via Kroki API or locally using excalidraw-brute-export-cli.

115estrelas
Atualizado há 4 meses

Ver no GitHub ↗ Licença: MIT

Como adicionar

/plugin marketplace add Agents365-ai/excalidraw-skill

O comando exato pode variar conforme o repositório. Confira o README no GitHub.

Para o autor da skill

Cole no README do seu repo

Mostra que sua skill está catalogada na Skillteca, gera backlink e tráfego rastreável.

[![Skillteca](https://www.skillteca.com.br/api/badge/excalidraw/svg)](https://www.skillteca.com.br/skills/excalidraw)

Skills relacionadas

Ver todas de Dados e Análise →

Alerta por categoria

Receba novas skills de Dados e Análise toda segunda

1 email curto, só com as skills novas de Dados e Análise. 4 minutos de leitura, sem spam, cancela com 1 clique.

Você confirma o email no primeiro envio. Sem spam. Cancela com 1 clique.

Ler descrição completa

Excalidraw Diagrams

Overview

Generate .excalidraw JSON files and export to PNG/SVG.

Two export options:

  • Kroki API (curl) — zero install, SVG output only
  • excalidraw-brute-export-cli — local Firefox-based, PNG + SVG

Supported formats: PNG (local CLI only), SVG (both options). PDF is NOT supported.

When to Use

Explicit triggers: user says "画图", "diagram", "visualize", "flowchart", "draw", "架构图", "流程图"

Proactive triggers:

  • Explaining a system with 3+ interacting components
  • Describing a multi-step process or decision tree
  • Comparing architectures or approaches side by side

Skip when: a simple list or table suffices, or user is in a quick Q&A flow

Prerequisites

Option A: Kroki API (recommended — zero install, SVG only)

# Just needs curl (pre-installed on macOS/Linux/Windows Git Bash)
curl --version

No additional setup. SVG rendered via https://kroki.io.

Option B: Local CLI (required for PNG)

The CLI uses Firefox (not Chromium). Check and install:

npm install -g excalidraw-brute-export-cli
npx playwright install firefox

macOS patch (one-time, required):

CLI_MAIN=$(npm root -g)/excalidraw-brute-export-cli/src/main.js
sed -i '' 's/keyboard.press("Control+O")/keyboard.press("Meta+O")/' "$CLI_MAIN"
sed -i '' 's/keyboard.press("Control+Shift+E")/keyboard.press("Meta+Shift+E")/' "$CLI_MAIN"

Windows/Linux: No patch needed.

Workflow

  1. Check deps — use Kroki (curl) for SVG; use local CLI for PNG
  2. Plan — identify diagram type, pick a visual pattern, choose color palette
  3. Generate — write .excalidraw JSON file (section-by-section for large diagrams)
  4. Export — run Kroki or CLI command
  5. Report — tell user the output file path

Design Principles

Default style

  • roughness: 0 — clean, modern look for all technical diagrams (use 1 only when user requests hand-drawn/casual style)
  • fontFamily: 2 (Helvetica) — professional look; use 1 (Virgil) only for casual/sketch style, 3 (Cascadia) for code snippets
  • fillStyle: "solid" — default fill

Font size hierarchy

| Level | Size | Use for | |-------|------|---------| | Title | 28px | Diagram title | | Header | 24px | Section/group headers | | Label | 20px | Primary element labels | | Description | 16px | Secondary text, descriptions | | Note | 14px | Annotations, fine print |

Color palette

Follow the 60-30-10 rule: 60% whitespace/neutral, 30% primary accent, 10% highlight.

Semantic fill colors (use with strokeColor one shade darker):

| Category | Fill | Stroke | Use for | |----------|------|--------|---------| | Primary / Input | #dbeafe | #1e40af | Entry points, APIs, user-facing | | Success / Data | #dcfce7 | #166534 | Data stores, success states | | Warning / Decision | #fef9c3 | #854d0e | Decision points, conditions | | Error / Critical | #fee2e2 | #991b1b | Errors, alerts, critical paths | | External / Storage | #f3e8ff | #6b21a8 | External services, databases, AI/ML | | Process / Default | #e0f2fe | #0369a1 | Standard process steps | | Trigger / Start | #fed7aa | #c2410c | Start nodes, triggers, events | | Neutral / Container | #f1f5f9 | #475569 | Groups, swimlanes, backgrounds |

Text colors:

| Level | Color | |-------|-------| | Title | #1e293b | | Label | #334155 | | Description | #64748b |

Rule: Do not invent new colors. Pick from this palette.

Arrow semantics

| Style | Meaning | |-------|---------| | Solid (strokeStyle: null) | Primary flow, main path | | Dashed ("dashed") | Response, async, callback | | Dotted ("dotted") | Optional, reference, weak dependency |

Excalidraw JSON Structure

File skeleton

{
  "type": "excalidraw",
  "version": 2,
  "source": "claude-code",
  "elements": [],
  "appState": { "viewBackgroundColor": "#ffffff" }
}

Element types

| type | use for | |-----------|----------------------------------| | rectangle | boxes, components, modules | | ellipse | start/end nodes, databases | | diamond | decision points | | arrow | directed connections | | line | undirected connections | | text | standalone labels |

Element sizing

Calculate element width from label text to prevent truncation:

Latin text:  width = max(160, charCount * 9)
CJK text:   width = max(160, charCount * 18)
Mixed text:  estimate each character individually, sum up

Height: use 60 for single-line labels, add 24 per additional line.

Required properties (all elements)

{
  "id": "auth_service",
  "type": "rectangle",
  "x": 100, "y": 100,
  "width": 160, "height": 60,
  "angle": 0,
  "strokeColor": "#1e40af",
  "backgroundColor": "#dbeafe",
  "fillStyle": "solid",
  "strokeWidth": 2,
  "roughness": 0,
  "opacity": 100,
  "seed": 100001,
  "boundElements": [
    { "id": "arrow_to_db", "type": "arrow" },
    { "id": "label_auth", "type": "text" }
  ]
}

Use descriptive string IDs (e.g., "api_gateway", "arrow_gw_to_auth") instead of random strings.

Give each element a unique seed (integer). Namespace by section: 100xxx, 200xxx, 300xxx.

JSON field rules

  • boundElements: use null when empty, never []
  • updated: always use 1, never timestamps
  • Do NOT include: frameId, index, versionNonce, rawText
  • points in arrows: always start at [0, 0]
  • seed: must be a positive integer, unique per element

Text inside shapes (contained text)

When text belongs inside a shape, bind them bidirectionally:

{
  "id": "label_auth",
  "type": "text",
  "text": "Auth Service",
  "fontSize": 20,
  "fontFamily": 2,
  "textAlign": "center",
  "verticalAlign": "middle",
  "strokeColor": "#1e293b",
  "containerId": "auth_service"
}

CRITICAL: Text strokeColor is the text color. Always set it explicitly to a dark color from the text color palette. Never omit it — omitting strokeColor on text can cause invisible text that blends with the shape background.

The parent shape must list the text in its boundElements:

"boundElements": [{ "id": "label_auth", "type": "text" }]

Arrow binding (bidirectional)

Arrows must bind to shapes, and shapes must reference bound arrows:

{
  "id": "arrow_gw_to_auth",
  "type": "arrow",
  "points": [[0, 0], [200, 0]],
  "startBinding": { "elementId": "api_gateway", "gap": 5, "focus": 0 },
  "endBinding": { "elementId": "auth_service", "gap": 5, "focus": 0 }
}

Both api_gateway and auth_service must include in their boundElements:

"boundElements": [{ "id": "arrow_gw_to_auth", "type": "arrow" }]

Arrow routing

L-shaped (elbow) arrows — orthogonal routing with 3+ points:

"points": [[0, 0], [100, 0], [100, 150]]

Elbowed arrows — automatic right-angle routing:

{
  "type": "arrow",
  "points": [[0, 0], [0, -50], [200, -50], [200, 0]],
  "elbowed": true
}

Curved arrows — smooth routing with waypoints:

{
  "type": "arrow",
  "points": [[0, 0], [50, -40], [200, 0]],
  "roundness": { "type": 2 }
}

Grouping

Related elements share groupIds. Nested groups list IDs innermost-first:

"groupIds": ["inner_group", "outer_group"]

Diagram Patterns

Choose the right visual pattern for each diagram type.

Spacing Reference

| Scenario | Spacing | |----------|---------| | Labeled arrow gap (between shapes) | 150–200px | | Unlabeled arrow gap | 100–120px | | Column spacing (labeled arrows) | 400px (220px box + 180px gap) | | Column spacing (unlabeled arrows) | 340px (220px box + 120px gap) | | Row spacing | 280–350px (150px box + 130–200px gap) | | Zone/container padding | 50–60px around children | | Zone/container opacity | 25–40 | | Minimum gap between any elements | 40px |

Flowchart (LR or TB)

  • Ellipse for start/end, diamo
Compartilhar X LinkedIn