excalidraw-skill
Use for creating, refining, validating, or exporting Excalidraw technical diagrams
Skill by OrestesK
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/orestesk-excalidraw-skill-e32feb
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
- Runs as
- Python package
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/excalidraw-skill
What's inside
- Skill name
excalidraw-skill- Description
- Use for creating, refining, validating, or exporting Excalidraw technical diagrams
- License
- MIT
- Instructions
- 305 lines in SKILL.md · view on GitHub
Before installing
- Ships executable scripts
Files (16)
- SKILL.md
- evals.json · evals/
- bad-overview.excalidraw · evals/fixtures/
- decision-flow.json · evals/fixtures/
- narrow-review.md · evals/fixtures/
- semantic-inventory.json · evals/fixtures/
- style-a.excalidraw · evals/fixtures/
- style-b.excalidraw · evals/fixtures/
- style-c.excalidraw · evals/fixtures/
- cheatsheet.md · references/
- orestes-clean-style.md · references/
- quality-gates.md · references/
- audit_scene.py · scripts/
- validate_semantic_cut.py · scripts/
- test_audit_scene.py · tests/
- test_validate_semantic_cut.py · tests/
SKILL.md (first lines)
# Excalidraw Skill
## Design and validation for new diagrams
For every nontrivial new diagram, complete these design and validation steps before you call the result complete:
1. Read [`references/orestes-clean-style.md`](references/orestes-clean-style.md). It is the default style for this Pi installation
2. Read [`references/quality-gates.md`](references/quality-gates.md)
3. If the user supplies visual references or native `.excalidraw` files, inspect them before layout. Reference-established traits override every generic default
4. Decide who will read the diagram, its one-sentence takeaway, output size, overview or detail level, required claims, and non-goals
5. Make a semantic cut: choose the facts the diagram needs to show. Do not force every source fact onto one canvas. Ask for approval before omitting or materially abstracting facts
6. Use the overview budget by default: at most 9 primary nodes, 11 primary edges, 3 callouts, 5 accent families, one feedback loop, and one obvious endpoint. Split into panels or another diagram when exceeded
7. Construct and screenshot in stages: skeleton → primary arrows → optional clusters
8. Run the native scene audit and inspect the final export at native, 50%, 35%, and grayscale sizes
9. For nontrivial work, run a broad blind adversarial review
The diagram must have complete labels, the allowed arrow count, no clipping at full zoom, and pass the required reviews
## Step 0: Pick an Interface
Three interfaces drive the same live canvas. Pick the first one that applies:
1. **MCP tools** — if `excalidraw/*` tools (e.g. `batch_create_elements`) are in your tool list, prefer them: results land directly in your context, and screenshots come back as images without touching disk
2. **CLI** (default when no MCP tools are present):
```bash
npx -y mcp-excalidraw-server <command>
```
No setup needed — any canvas-touching command **auto-starts the canvas server** on `http://127.0.0.1:3000` (first `npx` run downloads the package). If the CLI is installed globally (`npm i -g mcp-excalidraw-server`), the shorter alias `excalidraw-canvas <command>` works too
3. **REST API** (last resort, e.g. from application code): HTTP endpoints on `http://127.0.0.1:3000` — see `references/cheatsheet.md` for payloads. The server must already be running
The canvas URL comes from `EXPRESS_SERVER_URL` (default `http://127.0.0.1:3000`). Remind the user to open that URL in a browser — screenshots, image export, mermaid conversion, and viewport control need an open tab (CLI exits with code 4 when it's missing)
### CLI Quick Reference
Results are JSON on stdout — except `describe` (plain text) and raw-content output when `--out` is omitted (`export` scene JSON, `screenshot --format svg`). Diagnostics on stderr. Exit codes: 0 ok, 1 error, 2 usage, 3 canvas unreachable, 4 browser tab required
| Task | Command |
|------|---------|
| Start / stop / inspect server | `start`, `stop`, `status` |
| Create elements (batch) | `add elements.json` or `echo '[...]' \| add` or `add --one '{...}'` |
| Multi-op patch in one call | `apply patch.json` — `{"create":[...],"update":[{"id":"a","set":{...}}],"delete":[...]}` |
| Read one / query many | `get <id>`, `query [--type t] [--bbox x0,y0,x1,y1] [--filter k=v] [--filter-json '{...}']` |
| Update / delete | `update <id> --set '{...}'`, `delete <id> [...]` |
| Understand the scene | `describe` (plain-text summary: ids, positions, labels, connections) |
| See the scene | `screenshot [--out f.png]` (PNG without `--out` → temp file path in JSON |
| | SVG without `--out` → raw SVG) |
| Layout operations | `arrange align\|distribute\|group\|ungroup\|lock\|unlock\|duplicate --ids a,b,c [--to left\|horizontal\|...]` |
| Scene files | `export [--out scene.excalidraw]`, `import [scene.excalidraw|-] [--replace]` |
| Mermaid → canvas | `mermaid [diagram.mmd|-]` (or stdin) |
| Snapshots | `snapshot save\|list\|restore <name>` |
| Share link | `share` (encrypted upload → excalidraw.com URL) |
| Wipe canvas | `clear --yes` |
| Install / upgrade this skill | `install-skill --dir <skills-root>` (agent chooses project/global root) |
### Element Format (CLI and MCP)
The CLI and MCP tools accept the same agent-friendly format and normalize it automatically:
- **Labels**: put `"text": "My Label"` on any shape — converted to Excalidraw's bound-label format for you
- **Arrow binding**: `"startElementId": "a"` / `"endElementId": "b"` — arrows auto-route to element edges
- **fontFamily**: pass a string name (`"helvetica"`, `"cascadia"`, `"excalifont"`, ...) or string number `"1"`–`"8"`
- **points**: both `[[x,y], ...]` tuples and `[{"x":..,"y":..}]` objects are accepted
- **Patch updates**: in `apply`, update entries can use either direct fields (`{"id":"a","x":120}`) or a `set` object (`{"id":"a","set":{"x":120}}`). Do not mix both forms in one update entry
**Raw REST is stricter**: labels must be `"label": {"text": "..."}`, bindings must be `"start": {"id": "..."}` / `"end": {"id": "..."}`. Only worry about this when POSTing to the API directly
---
## Coordinate System
The canvas uses a 2D coordinate grid: **(0, 0) is the origin**, **x increases rightward**, **y increases downward**. Plan your layout before writing any JSON
**General spacing guidelines:**
- Vertical spacing between tiers: 80–120px (enough that arrows don't crowd labels)
- Horizontal spacing between siblings: 40–60px minimum:
- give labeled arrows 120px+
- Shape width: `max(160, labelCharCount * 12)` to keep the label on one line
- Shape height: 60px single-line, 80px two-line labels
- Background/zone padding: 50px on all sides around contained elements
**Default local style:**
- White canvas
- roughness `1`
- black or near-black linework
- Transparent rounded rectangles by default. Use pale semantic fills sparingly and only when they improve role recognition
- Body labels are normally 20px
- titles 30–36px
- small boundary/arrow annotations never below 16px
- Semantic arrows are black, solid, 2px, short/direct, and bound to both endpoints
- Dashed light-gray rectangles represent real scope boundaries only. Do not start with decorative background zones
- The palette in the cheatsheet is a fallback library, not a requirement to create color categories
---
## Layout Anti-Patterns (Critical for Complex Diagrams)
These are the most common mistakes that produce unreadable diagrams. Avoid all of them
### 1. Do NOT use `label.text` (or `text`) on large background zone rectangles
When you put a label on a background rectangle, Excalidraw creates a bound text element centered in the middle of that shape — right where your service boxes will be placed. The text overlaps everything inside the zone and cannot be repositioned
**Wrong:**
```json
{"id": "vpc-zone", "type": "rectangle", "x": 50, "y": 50, "width": 800, "height": 400, "text": "VPC (10.0.0.0/16)"}
```
**Right — use a free-standing text element anchored at the top of the zone:**
```json
{"id": "vpc-zone", "type": "rectangle", "x": 50, "y": 50, "width": 800, "height": 400, "backgroundColor": "transparent", "strokeColor": "#adb5bd", "strokeStyle": "dashed"},
{"id": "vpc-label", "type": "text", "x": 70, "y": 60, "width": 300, "height": 30, "text": "VPC (10.0.0.0/16)", "fontSize": 18}
```
The free-standing text element sits at the top corner of the zone and doesn't interfere with elements placed inside
### 2. Avoid cross-zone arrows in complex diagrams
An arrow from an element in one layout zone to an element in a distant zone will draw a long diagonal line crossing through everything in between. In a multi-zone infra diagram this produces an unreadable tangle of spaghetti
**Design rule:** Keep arrows within the same zone or tier. To show cross-zone relationships, make zone edges adjacent, use one explicit cross-panel edge, or split the content into separate views
Do not use a canvas-spanning perimeter arrow as the usual workaround. A long return path, multi-bend route, or global loop usually means the diagram should move responsibilities, merge duplicate concepts, or split into viewsFrom OrestesK/pi, MIT.
More from OrestesK/pi
- 0.563score
skill-authoring
OrestesK
Create, review, or make substantial changes to local Pi skills.
SkillBFreshness: B★ 2Claude Code +9 - 0.559score
browser-use
OrestesK
Use for navigating websites, testing web interfaces, filling forms, taking screenshots, or extracting web data when no other available tool meets the need
SkillBFreshness: B★ 2Claude Code +9 - 0.557score
durable-memory
OrestesK
Curate durable Markdown memories.
SkillBFreshness: B★ 2Claude Code +9 - 0.557score
code-intelligence
OrestesK
Use when you need to find code ownership, structure, symbols, types, references, call relationships, structural patterns, or diagnostics
SkillBFreshness: B★ 2Claude Code +9 - 0.557score
notion-documents
OrestesK
Write, edit, and format Notion documents.
SkillBFreshness: B★ 2Claude Code +9 - 0.556score
session-reader
OrestesK
Use for reading or analyzing Pi session JSONL files and session history
SkillBFreshness: B★ 2Claude Code +9 - 0.556score
grill-me
OrestesK
Manually interview the user about a plan or design until shared understanding is reached
SkillBFreshness: B★ 2Claude Code +9 - 0.554score
writing-plans
OrestesK
Use for technical specifications, technical designs, architecture proposals, and implementation plans after the goal is clear
SkillBFreshness: B★ 2Claude Code +9 - 0.551score
review
OrestesK
Use for reviewing code, plans, and implementations against requirements and project standards
SkillBFreshness: B★ 2Claude Code +9 - 0.551score
systematic-debugging
OrestesK
Use for investigating bugs, test failures, crashes, flaky behavior, build failures, or unexpected output
SkillBFreshness: B★ 2Claude Code +9 - 0.551score
github-issues
OrestesK
Use for triaging, drafting, or improving GitHub issues from verified evidence
SkillBFreshness: B★ 2Claude Code +9 - 0.551score
context-mode
OrestesK
Process large command, test, log, API, document, data, browser, or MCP output
SkillBFreshness: B★ 2Claude Code +9
Signals
- Stars
- 2
- Forks
- 0
- Open issues
- 0
- Last commit (this folder)
- Sep 14, 2026 (1 month ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/OrestesK/pi
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from OrestesK
- 0.570score
authenticated-web-access
OrestesK
Reuse an existing browser login for bounded authenticated website requests when the user asks to read site data, download a file, inspect a network-backed…
SkillAFreshness: AClaude Code +9 - 0.567score
excalidraw-skill
OrestesK
Use for planning, creating, refining, validating, or exporting Excalidraw technical diagrams, including text-only layout proposals before drawing
SkillAFreshness: AClaude Code +9 - 0.565score
pr-slack-post
OrestesK
Draft a short Slack message that posts a pull request for review.
SkillAFreshness: AClaude Code +9 - 0.565score
pi-config
OrestesK
Write and maintain clear, consistent Oh My Pi configuration.
SkillAFreshness: AClaude Code +9 - 0.565score
skill-authoring
OrestesK
Write or revise reusable skill instructions.
SkillAFreshness: AClaude Code +9 - 0.564score
grill-me
OrestesK
Manually interview the user about a plan, design, or idea until shared understanding is reached
SkillAFreshness: AClaude Code +9
Cite this page
excalidraw-skill. Agent Mart. https://agentmart.dev/skills/orestesk-excalidraw-skill-e32feb (last updated 2026-10-24)