excalidraw-skill
Use for planning, creating, refining, validating, or exporting Excalidraw technical diagrams, including text-only layout proposals before drawing
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
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 planning, creating, refining, validating, or exporting Excalidraw technical diagrams, including text-only layout proposals before drawing
- License
- MIT
- Instructions
- 312 lines in SKILL.md · view on GitHub
Before installing
- Ships executable scripts
Files (17)
- 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/
- change-explanations.md · references/
- 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
## Plan the explanation
- For a before/after diagram or an explanation of what changes, read [`references/change-explanations.md`](references/change-explanations.md) before choosing the layout
- For a text-only layout request, apply the design guidance and return the proposed composition without opening or changing a canvas
- Rendered-image gates apply when drawing is requested. Do not claim visual validation from a text plan
## Design and validation for new diagrams
For every nontrivial new rendered 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
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 and view-specific checks in `references/quality-gates.md`. 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 diagramsFrom OrestesK/omp, MIT.
More from OrestesK/omp
- 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.565score
skill-authoring
OrestesK
Write or revise reusable skill instructions.
SkillAFreshness: AClaude Code +9 - 0.565score
pi-config
OrestesK
Write and maintain clear, consistent Oh My Pi configuration.
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.564score
grill-me
OrestesK
Manually interview the user about a plan, design, or idea until shared understanding is reached
SkillAFreshness: AClaude Code +9 - 0.561score
session-analysis
OrestesK
Use to analyze past sessions, reconstruct what happened, identify errors and unresolved work, or extract user preferences and workflow friction that could…
SkillAFreshness: AClaude Code +9 - 0.561score
review
OrestesK
Use for independent review of nontrivial implementation proposals before approval and nontrivial implementations before final evidence; also use for explicit…
SkillAFreshness: AClaude Code +9 - 0.558score
github-pr-comments
OrestesK
Draft, refine, place, or post actionable GitHub pull-request review comments from validated findings
SkillAFreshness: AClaude Code +9 - 0.558score
github-issue-authoring
OrestesK
Use for triaging, drafting, or improving GitHub issues from verified evidence
SkillAFreshness: AClaude Code +9 - 0.558score
github-pull-requests
OrestesK
Use to prepare, review, update, or respond to feedback on GitHub pull requests
SkillAFreshness: AClaude Code +9
Signals
- Stars
- 0
- Forks
- 0
- Open issues
- 0
- Last commit (this folder)
- Oct 7, 2026 (21 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/OrestesK/omp
- 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.565score
pr-slack-post
OrestesK
Draft a short Slack message that posts a pull request for review.
SkillAFreshness: AClaude Code +9 - 0.565score
skill-authoring
OrestesK
Write or revise reusable skill instructions.
SkillAFreshness: AClaude Code +9 - 0.565score
pi-config
OrestesK
Write and maintain clear, consistent Oh My Pi configuration.
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 - 0.563score
skill-authoring
OrestesK
Create, review, or make substantial changes to local Pi skills.
SkillBFreshness: B★ 2Claude Code +9
Cite this page
excalidraw-skill. Agent Mart. https://agentmart.dev/skills/orestesk-excalidraw-skill (last updated 2026-10-24)