[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CNBZCVBVRTWY5X3GEAN1RM":3,"skill-same:01M6CNBZCVBVRTWY5X3GEAN1RM":134},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":55,"repositoryHtmlUrl":56,"repositoryHomepageUrl":57,"ownerHtmlUrl":58,"ownerBlogUrl":59,"ownerDescription":60,"updatedAt":61,"install":62,"resources":75},"01M6CNBZCVBVRTWY5X3GEAN1RM","excalidraw-mcp",null,"Build Excalidraw diagrams through the official Excalidraw MCP and turn the same source into a real .excalidraw file on disk or an Obsidian .excalidraw.md drawing. Use whenever the user says \"use Excalidraw MCP\", asks to create\u002Fdraw\u002Fvisualize a diagram, flowchart, architecture, sequence, swimlane, mind map or ER diagram, wants a diagram saved to a repo or vault, or wants an existing Excalidraw scene checked or re-rendered. Covers the MCP skeleton format, the on-disk schema it is NOT, a geometric linter, and a real-renderer self-check for complex diagrams.","anton-abyzov\u002Fvskill","anton-abyzov","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F979819?v=4","01M6CN5XDNZDM4A59WYJ1MF0DF","Anton Abyzov","01M6CN5XHVS7FXP067EJQVVZHK",47,"MIT","https:\u002F\u002Fgithub.com\u002Fanton-abyzov\u002Fvskill\u002Fblob\u002Fmain\u002Fskills\u002Fexcalidraw-mcp\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"excalidraw mcp","excalidraw","MCP","save","diagrams","export","view","edit","write","read","linter","Bash","disk","create","flowchart","diagram","official","architecture","visualize","obsidian","2026-11-10 10:12:30",false,"---\nname: excalidraw-mcp\ndescription: Build Excalidraw diagrams through the official Excalidraw MCP and turn the same source into a real .excalidraw file on disk or an Obsidian .excalidraw.md drawing. Use whenever the user says \"use Excalidraw MCP\", asks to create\u002Fdraw\u002Fvisualize a diagram, flowchart, architecture, sequence, swimlane, mind map or ER diagram, wants a diagram saved to a repo or vault, or wants an existing Excalidraw scene checked or re-rendered. Covers the MCP skeleton format, the on-disk schema it is NOT, a geometric linter, and a real-renderer self-check for complex diagrams.\nversion: 1.2.0\nlicense: MIT\nrepository: anton-abyzov\u002Fvskill\nmcp-deps: [excalidraw]\nallowed-tools: Bash, Read, Write, Edit, mcp__excalidraw__read_me, mcp__excalidraw__create_view, mcp__excalidraw__export_to_excalidraw, mcp__excalidraw__save_checkpoint, mcp__excalidraw__read_checkpoint\n---\n\n# Excalidraw via MCP\n\nSaying \"use Excalidraw MCP\" should be enough to get a complicated diagram, drawn live\nand saved where it belongs. This skill is what makes that true.\n\n## The one thing that breaks everything\n\n`create_view`'s element format is a **skeleton**, not the on-disk schema. A shape's\n`label` is skeleton-only sugar. Excalidraw's canvas renderer has **no text branch for\nrectangle \u002F ellipse \u002F diamond** — container text is drawn only via\n`boundElements → containerId`. So pasting `create_view` JSON into a `.excalidraw` file\nproduces **empty boxes**, silently. That single fact is why `scripts\u002Fexcalidraw_build.py`\nexists: author once in the skeleton, get both the live render and a correct file.\n\nSecond fact: hand-authored diagrams do not degrade gradually with size — they fail on\n**irregularity**. Measured on a real generated scene, elements produced by a repeating\nlayout formula had a 0.00 defect rate; bespoke one-off elements had 0.71. So compute\npositions with a formula, and let the linter check the result.\n\n## Preflight on a new machine\n\nInstalling this skill does **not** install the MCP server — `mcp-deps` is a declaration\nthat `vskill check` verifies, not an installer. **If the `mcp__excalidraw__*` tools are\nnot available, run this first** — it detects and registers the server, on any OS:\n\n```bash\npython3 scripts\u002Fensure_mcp.py --install\n```\n\nIt reports where the server was found, or runs\n`claude mcp add --transport http --scope user excalidraw https:\u002F\u002Fmcp.excalidraw.com`\nand re-verifies. Exit 0 configured, 1 missing, 2 could not register (no Claude CLI on\nPATH — it prints the command to run by hand). Claude Code needs a restart afterwards to\npick up a newly added server.\n\nScopes: `--scope user` (default) covers every project on the machine via `~\u002F.claude.json`;\n`--scope project` writes `.\u002F.mcp.json` so teammates get it on clone; `--scope local` is\nthis project only. A server registered under a *different* project counts as missing —\nClaude Code will not load it here, and the script says so.\n\n**Without the MCP everything except the live inline render still works.**\n`excalidraw_build.py` and `excalidraw_lint.py` are stdlib-only Python 3 — no packages, no\nnetwork. Build files, lint them, ship them. `excalidraw_render.py` additionally needs\n`pip install playwright && playwright install chromium`.\n\n### Windows\n\nUse `py -3` and backslashes; **`python3` on Windows is a Microsoft Store stub** that opens\nthe Store instead of running anything.\n\n```powershell\npy -3 scripts\\ensure_mcp.py --install\npy -3 scripts\\excalidraw_build.py scene.json -o out.excalidraw\n```\n\nEverything else is portable: paths go through `pathlib`, output is written with explicit\nUTF-8 and `\\n` newlines so a Windows run does not bake CRLF into the scene JSON, and the\npreflight resolves `claude.cmd` \u002F `claude.exe` as well as `claude`. If `vskill i` warns\nthat symlinks are unavailable, it falls back to copying — enable Developer Mode to get\nsymlinks back.\n\n## Workflow\n\n0. **Preflight** (new machine only): if the `mcp__excalidraw__*` tools are missing,\n   `python3 scripts\u002Fensure_mcp.py --install` (`py -3` on Windows).\n1. **Author the skeleton.** One JSON array, the same one `create_view` takes. Positions\n   come from a layout formula (see `references\u002Flayout-recipes.md`), never from eyeballing.\n2. **Lint it** — offline, no dependencies, catches overflow\u002Fcollision\u002Fgeometry:\n   ```bash\n   python3 scripts\u002Fexcalidraw_lint.py scene.json --camera\n   ```\n   `--camera` prints a correctly framed 4:3 `cameraUpdate` to paste at the top.\n3. **Render it live** with `mcp__excalidraw__create_view`, elements streamed in\n   z-order with camera moves (see `references\u002Fmcp-workflow.md`). Keep the returned\n   `checkpointId`.\n4. **Save the file** when the user wants one on disk:\n   ```bash\n   python3 scripts\u002Fexcalidraw_build.py scene.json -o out.excalidraw\n   python3 scripts\u002Fexcalidraw_build.py scene.json -o out --obsidian   # → out.excalidraw.md\n   python3 scripts\u002Fexcalidraw_build.py scene.json -o out.excalidraw --dark\n   ```\n5. **Look at it** before declaring success on anything non-trivial. This renders through\n   Excalidraw's own `exportToSvg`, so text is measured with real font metrics:\n   ```bash\n   python3 scripts\u002Fexcalidraw_render.py out.excalidraw -o \u002Ftmp\u002Fpreview.png\n   ```\n   Then Read the PNG. Fix what you see; re-lint; re-render.\n\nSteps 2 and 5 are the quality gate. Skipping them is how labels end up outside their\nboxes and arrows end up pointing at nothing.\n\n## Skeleton cheat sheet\n\n```jsonc\n{\"type\":\"rectangle\",\"id\":\"api\",\"x\":100,\"y\":80,\"width\":180,\"height\":80,\n \"roundness\":{\"type\":3},\"backgroundColor\":\"#a5d8ff\",\"fillStyle\":\"solid\",\n \"strokeColor\":\"#4a9eed\",\"label\":{\"text\":\"API Gateway\",\"fontSize\":18}}\n\n{\"type\":\"arrow\",\"id\":\"e1\",\"from\":\"api\",\"to\":\"db\",\"label\":{\"text\":\"SQL\"}}   \u002F\u002F auto-bound\n{\"type\":\"arrow\",\"id\":\"e2\",\"from\":\"api\",\"to\":\"db\",\"route\":\"ortho\"}          \u002F\u002F L-shaped\n{\"type\":\"arrow\",\"id\":\"e3\",\"x\":300,\"y\":150,\"points\":[[0,0],[120,0]]}        \u002F\u002F manual\n\n{\"type\":\"text\",\"id\":\"ttl\",\"center\":400,\"y\":20,\"text\":\"Title\",\"fontSize\":24} \u002F\u002F auto-centred\n{\"type\":\"rectangle\",\"id\":\"zone\",\"x\":40,\"y\":40,\"width\":700,\"height\":420,\n \"opacity\":30,\"zoneLabel\":\"Data layer\"}                                     \u002F\u002F caption, not bound label\n```\n\nBuilder-only extensions: `from`\u002F`to` (perimeter anchors + two-way binding),\n`route:\"ortho\"`, `zoneLabel`, `center` on text, `fixedWidth` on a shape (wrap instead\nof grow). Everything else is passed through unchanged, so the same array still works\nverbatim with `create_view`.\n\n**Never** put a bound `label` on a background zone rectangle — it centres in the middle\nof the zone and cannot be grabbed. Use `zoneLabel`.\n\n## Choosing the output\n\n| Destination | Command | Notes |\n|---|---|---|\n| Show the user now | `create_view` | animated, camera-guided; returns `checkpointId` |\n| File in a repo | `excalidraw_build.py -o x.excalidraw` | opens at excalidraw.com or in the VS Code extension |\n| Obsidian vault | `... -o x --obsidian` | `.excalidraw.md`, plugin-parsed, git-diffable |\n| Shareable link | `mcp__excalidraw__export_to_excalidraw` | **uploads to excalidraw.com — ask first** |\n\nThe MCP has no local-file tool. `export_to_excalidraw` is a public upload, so treat it\nas publishing: confirm with the user before calling it.\n\n## Iterating\n\n`create_view` returns a `checkpointId`. To continue from it — including user edits made\nin fullscreen — start the next array with\n`{\"type\":\"restoreCheckpoint\",\"id\":\"\u003CcheckpointId>\"}` and append only what is new. Use\n`{\"type\":\"delete\",\"ids\":\"a,b\"}` to remove elements; never reuse a deleted id. Keep the\nskeleton file on disk in sync, since that file is what builds and lints.\n\n## References\n\n- `references\u002Ffile-format.md` — the on-disk schema, verified against upstream: font\n  codes, bound text, arrow geometry, bindings, what Excalidraw does and does not\n  recompute on open. Read before hand-editing any `.excalidraw` file.\n- `references\u002Fmcp-workflow.md` — camera choreography, streaming order, checkpoints,\n  dark mode, and the MCP's own limits.\n- `references\u002Flayout-recipes.md` — formulas for flow, layered, swimlane, sequence, grid,\n  radial and matrix layouts, plus how to keep a 60-element diagram legible.\n- `references\u002Fobsidian.md` — the `.excalidraw.md` wrapper, block-ref rules, and the\n  compressed-scene gotcha.\n- `scripts\u002Fensure_mcp.py` — detect and register the Excalidraw MCP server on any OS.\n- `scripts\u002Fsplit_excalidraw_library.py` — split an `.excalidrawlib` (AWS\u002FGCP\u002FK8s icon\n  packs from libraries.excalidraw.com) into per-icon JSON plus a lookup table, so icon\n  data never enters context.\n\n## Limits worth stating out loud\n\n- Width estimates are calibrated per-character, not measured from the font binary; the\n  linter warns inside 10% of overflow. When it warns on something important, render it.\n- `excalidraw_render.py` needs `playwright` plus network access to esm.sh. Without them,\n  lint is still fully offline.\n- The linter cannot judge whether a diagram is *good*, only whether it is *correct*.\n  Composition is still your job.\n\n## Changelog\n\n- **1.2.0** — `scripts\u002Fensure_mcp.py`: cross-platform preflight that detects the MCP\n  server (including `~\u002F.claude.json`'s per-project map) and registers it when missing.\n  Windows support: documented `py -3`, `claude.cmd` resolution, explicit UTF-8 and `\\n`\n  newlines on every write.\n- **1.1.1** — linter no longer applies the box-fit rules (R1\u002FR2) to arrow\n  containers; arrow labels are laid along the path and are covered by R10.\n- **1.1.0** — moved into the vskill monorepo at `skills\u002Fexcalidraw-mcp\u002F`, matching\n  `remotion-best-practices` and the other in-repo skills. The standalone\n  `anton-abyzov\u002Fexcalidraw-mcp-skill` repo is deprecated.\n- **1.0.1** — document MCP setup: installing the skill does not install the server;\n  added the `claude mcp add` one-liner and what still works without it.\n- **1.0.0** — first release. Replaces the file-only `excalidraw-diagram-generator`\n  skill, whose templates emitted inline `text` on shapes and therefore opened as empty\n  boxes.\n","# Excalidraw via MCP\n\nSaying \"use Excalidraw MCP\" should be enough to get a complicated diagram, drawn live\nand saved where it belongs. This skill is what makes that true.\n\n## The one thing that breaks everything\n\n`create_view`'s element format is a **skeleton**, not the on-disk schema. A shape's\n`label` is skeleton-only sugar. Excalidraw's canvas renderer has **no text branch for\nrectangle \u002F ellipse \u002F diamond** — container text is drawn only via\n`boundElements → containerId`. So pasting `create_view` JSON into a `.excalidraw` file\nproduces **empty boxes**, silently. That single fact is why `scripts\u002Fexcalidraw_build.py`\nexists: author once in the skeleton, get both the live render and a correct file.\n\nSecond fact: hand-authored diagrams do not degrade gradually with size — they fail on\n**irregularity**. Measured on a real generated scene, elements produced by a repeating\nlayout formula had a 0.00 defect rate; bespoke one-off elements had 0.71. So compute\npositions with a formula, and let the linter check the result.\n\n## Preflight on a new machine\n\nInstalling this skill does **not** install the MCP server — `mcp-deps` is a declaration\nthat `vskill check` verifies, not an installer. **If the `mcp__excalidraw__*` tools are\nnot available, run this first** — it detects and registers the server, on any OS:\n\n```bash\npython3 scripts\u002Fensure_mcp.py --install\n```\n\nIt reports where the server was found, or runs\n`claude mcp add --transport http --scope user excalidraw https:\u002F\u002Fmcp.excalidraw.com`\nand re-verifies. Exit 0 configured, 1 missing, 2 could not register (no Claude CLI on\nPATH — it prints the command to run by hand). Claude Code needs a restart afterwards to\npick up a newly added server.\n\nScopes: `--scope user` (default) covers every project on the machine via `~\u002F.claude.json`;\n`--scope project` writes `.\u002F.mcp.json` so teammates get it on clone; `--scope local` is\nthis project only. A server registered under a *different* project counts as missing —\nClaude Code will not load it here, and the script says so.\n\n**Without the MCP everything except the live inline render still works.**\n`excalidraw_build.py` and `excalidraw_lint.py` are stdlib-only Python 3 — no packages, no\nnetwork. Build files, lint them, ship them. `excalidraw_render.py` additionally needs\n`pip install playwright && playwright install chromium`.\n\n### Windows\n\nUse `py -3` and backslashes; **`python3` on Windows is a Microsoft Store stub** that opens\nthe Store instead of running anything.\n\n```powershell\npy -3 scripts\\ensure_mcp.py --install\npy -3 scripts\\excalidraw_build.py scene.json -o out.excalidraw\n```\n\nEverything else is portable: paths go through `pathlib`, output is written with explicit\nUTF-8 and `\\n` newlines so a Windows run does not bake CRLF into the scene JSON, and the\npreflight resolves `claude.cmd` \u002F `claude.exe` as well as `claude`. If `vskill i` warns\nthat symlinks are unavailable, it falls back to copying — enable Developer Mode to get\nsymlinks back.\n\n## Workflow\n\n0. **Preflight** (new machine only): if the `mcp__excalidraw__*` tools are missing,\n   `python3 scripts\u002Fensure_mcp.py --install` (`py -3` on Windows).\n1. **Author the skeleton.** One JSON array, the same one `create_view` takes. Positions\n   come from a layout formula (see `references\u002Flayout-recipes.md`), never from eyeballing.\n2. **Lint it** — offline, no dependencies, catches overflow\u002Fcollision\u002Fgeometry:\n   ```bash\n   python3 scripts\u002Fexcalidraw_lint.py scene.json --camera\n   ```\n   `--camera` prints a correctly framed 4:3 `cameraUpdate` to paste at the top.\n3. **Render it live** with `mcp__excalidraw__create_view`, elements streamed in\n   z-order with camera moves (see `references\u002Fmcp-workflow.md`). Keep the returned\n   `checkpointId`.\n4. **Save the file** when the user wants one on disk:\n   ```bash\n   python3 scripts\u002Fexcalidraw_build.py scene.json -o out.excalidraw\n   python3 scripts\u002Fexcalidraw_build.py scene.json -o out --obsidian   # → out.excalidraw.md\n   python3 scripts\u002Fexcalidraw_build.py scene.json -o out.excalidraw --dark\n   ```\n5. **Look at it** before declaring success on anything non-trivial. This renders through\n   Excalidraw's own `exportToSvg`, so text is measured with real font metrics:\n   ```bash\n   python3 scripts\u002Fexcalidraw_render.py out.excalidraw -o \u002Ftmp\u002Fpreview.png\n   ```\n   Then Read the PNG. Fix what you see; re-lint; re-render.\n\nSteps 2 and 5 are the quality gate. Skipping them is how labels end up outside their\nboxes and arrows end up pointing at nothing.\n\n## Skeleton cheat sheet\n\n```jsonc\n{\"type\":\"rectangle\",\"id\":\"api\",\"x\":100,\"y\":80,\"width\":180,\"height\":80,\n \"roundness\":{\"type\":3},\"backgroundColor\":\"#a5d8ff\",\"fillStyle\":\"solid\",\n \"strokeColor\":\"#4a9eed\",\"label\":{\"text\":\"API Gateway\",\"fontSize\":18}}\n\n{\"type\":\"arrow\",\"id\":\"e1\",\"from\":\"api\",\"to\":\"db\",\"label\":{\"text\":\"SQL\"}}   \u002F\u002F auto-bound\n{\"type\":\"arrow\",\"id\":\"e2\",\"from\":\"api\",\"to\":\"db\",\"route\":\"ortho\"}          \u002F\u002F L-shaped\n{\"type\":\"arrow\",\"id\":\"e3\",\"x\":300,\"y\":150,\"points\":[[0,0],[120,0]]}        \u002F\u002F manual\n\n{\"type\":\"text\",\"id\":\"ttl\",\"center\":400,\"y\":20,\"text\":\"Title\",\"fontSize\":24} \u002F\u002F auto-centred\n{\"type\":\"rectangle\",\"id\":\"zone\",\"x\":40,\"y\":40,\"width\":700,\"height\":420,\n \"opacity\":30,\"zoneLabel\":\"Data layer\"}                                     \u002F\u002F caption, not bound label\n```\n\nBuilder-only extensions: `from`\u002F`to` (perimeter anchors + two-way binding),\n`route:\"ortho\"`, `zoneLabel`, `center` on text, `fixedWidth` on a shape (wrap instead\nof grow). Everything else is passed through unchanged, so the same array still works\nverbatim with `create_view`.\n\n**Never** put a bound `label` on a background zone rectangle — it centres in the middle\nof the zone and cannot be grabbed. Use `zoneLabel`.\n\n## Choosing the output\n\n| Destination | Command | Notes |\n|---|---|---|\n| Show the user now | `create_view` | animated, camera-guided; returns `checkpointId` |\n| File in a repo | `excalidraw_build.py -o x.excalidraw` | opens at excalidraw.com or in the VS Code extension |\n| Obsidian vault | `... -o x --obsidian` | `.excalidraw.md`, plugin-parsed, git-diffable |\n| Shareable link | `mcp__excalidraw__export_to_excalidraw` | **uploads to excalidraw.com — ask first** |\n\nThe MCP has no local-file tool. `export_to_excalidraw` is a public upload, so treat it\nas publishing: confirm with the user before calling it.\n\n## Iterating\n\n`create_view` returns a `checkpointId`. To continue from it — including user edits made\nin fullscreen — start the next array with\n`{\"type\":\"restoreCheckpoint\",\"id\":\"\u003CcheckpointId>\"}` and append only what is new. Use\n`{\"type\":\"delete\",\"ids\":\"a,b\"}` to remove elements; never reuse a deleted id. Keep the\nskeleton file on disk in sync, since that file is what builds and lints.\n\n## References\n\n- `references\u002Ffile-format.md` — the on-disk schema, verified against upstream: font\n  codes, bound text, arrow geometry, bindings, what Excalidraw does and does not\n  recompute on open. Read before hand-editing any `.excalidraw` file.\n- `references\u002Fmcp-workflow.md` — camera choreography, streaming order, checkpoints,\n  dark mode, and the MCP's own limits.\n- `references\u002Flayout-recipes.md` — formulas for flow, layered, swimlane, sequence, grid,\n  radial and matrix layouts, plus how to keep a 60-element diagram legible.\n- `references\u002Fobsidian.md` — the `.excalidraw.md` wrapper, block-ref rules, and the\n  compressed-scene gotcha.\n- `scripts\u002Fensure_mcp.py` — detect and register the Excalidraw MCP server on any OS.\n- `scripts\u002Fsplit_excalidraw_library.py` — split an `.excalidrawlib` (AWS\u002FGCP\u002FK8s icon\n  packs from libraries.excalidraw.com) into per-icon JSON plus a lookup table, so icon\n  data never enters context.\n\n## Limits worth stating out loud\n\n- Width estimates are calibrated per-character, not measured from the font binary; the\n  linter warns inside 10% of overflow. When it warns on something important, render it.\n- `excalidraw_render.py` needs `playwright` plus network access to esm.sh. Without them,\n  lint is still fully offline.\n- The linter cannot judge whether a diagram is *good*, only whether it is *correct*.\n  Composition is still your job.\n\n## Changelog\n\n- **1.2.0** — `scripts\u002Fensure_mcp.py`: cross-platform preflight that detects the MCP\n  server (including `~\u002F.claude.json`'s per-project map) and registers it when missing.\n  Windows support: documented `py -3`, `claude.cmd` resolution, explicit UTF-8 and `\\n`\n  newlines on every write.\n- **1.1.1** — linter no longer applies the box-fit rules (R1\u002FR2) to arrow\n  containers; arrow labels are laid along the path and are covered by R10.\n- **1.1.0** — moved into the vskill monorepo at `skills\u002Fexcalidraw-mcp\u002F`, matching\n  `remotion-best-practices` and the other in-repo skills. The standalone\n  `anton-abyzov\u002Fexcalidraw-mcp-skill` repo is deprecated.\n- **1.0.1** — document MCP setup: installing the skill does not install the server;\n  added the `claude mcp add` one-liner and what still works without it.\n- **1.0.0** — first release. Replaces the file-only `excalidraw-diagram-generator`\n  skill, whose templates emitted inline `text` on shapes and therefore opened as empty\n  boxes.\n",{"name":5,"license":15,"version":49,"mcp-deps":50,"repository":8,"description":7,"allowed-tools":51},"1.2.0",[25],"Bash, Read, Write, Edit, mcp__excalidraw__read_me, mcp__excalidraw__create_view, mcp__excalidraw__export_to_excalidraw, mcp__excalidraw__save_checkpoint, mcp__excalidraw__read_checkpoint","main","b198d63224f1ecec8bca1300fb21dfa996c853db","skills\u002Fexcalidraw-mcp",5,"https:\u002F\u002Fgithub.com\u002Fanton-abyzov\u002Fvskill","https:\u002F\u002Fverified-skill.com","https:\u002F\u002Fgithub.com\u002Fanton-abyzov","https:\u002F\u002Fspecwithcode.com","Founder of SpecWithCode · Creator of SpecWeave · AI coding agents, Cloud, DevOps · 20 yrs SWE · YouTube: @AntonAbyzov","2026-11-13 00:22:51",{"source":8,"skillName":5,"commands":63,"prompt":73,"zipAvailable":74},[64,67,70],{"tool":65,"command":66},"npx","npx skills add anton-abyzov\u002Fvskill --skill excalidraw-mcp",{"tool":68,"command":69},"bunx","bunx skills add anton-abyzov\u002Fvskill --skill excalidraw-mcp",{"tool":71,"command":72},"pnpm","pnpm dlx skills add anton-abyzov\u002Fvskill --skill excalidraw-mcp","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fanton-abyzov\u002Fvskill\u002Fblob\u002Fmain\u002Fskills\u002Fexcalidraw-mcp\u002FSKILL.md",true,[76,82,86,92,96,100,104,108,112,118,122,126,130],{"path":77,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":80,"sourceHtmlUrl":81},".gitignore","OTHER","其他",29,"https:\u002F\u002Fgithub.com\u002Fanton-abyzov\u002Fvskill\u002Fblob\u002Fmain\u002Fskills\u002Fexcalidraw-mcp\u002F.gitignore",{"path":83,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":84,"sourceHtmlUrl":85},"examples\u002Fspecweave-lifecycle.excalidraw",28782,"https:\u002F\u002Fgithub.com\u002Fanton-abyzov\u002Fvskill\u002Fblob\u002Fmain\u002Fskills\u002Fexcalidraw-mcp\u002Fexamples\u002Fspecweave-lifecycle.excalidraw",{"path":87,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":90,"sourceHtmlUrl":91},"examples\u002Fspecweave-lifecycle.excalidraw.md","REFERENCE","参考文档",20838,"https:\u002F\u002Fgithub.com\u002Fanton-abyzov\u002Fvskill\u002Fblob\u002Fmain\u002Fskills\u002Fexcalidraw-mcp\u002Fexamples\u002Fspecweave-lifecycle.excalidraw.md",{"path":93,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":94,"sourceHtmlUrl":95},"examples\u002Fspecweave-lifecycle.skeleton.json",3317,"https:\u002F\u002Fgithub.com\u002Fanton-abyzov\u002Fvskill\u002Fblob\u002Fmain\u002Fskills\u002Fexcalidraw-mcp\u002Fexamples\u002Fspecweave-lifecycle.skeleton.json",{"path":97,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":98,"sourceHtmlUrl":99},"references\u002Ffile-format.md",4760,"https:\u002F\u002Fgithub.com\u002Fanton-abyzov\u002Fvskill\u002Fblob\u002Fmain\u002Fskills\u002Fexcalidraw-mcp\u002Freferences\u002Ffile-format.md",{"path":101,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":102,"sourceHtmlUrl":103},"references\u002Flayout-recipes.md",4319,"https:\u002F\u002Fgithub.com\u002Fanton-abyzov\u002Fvskill\u002Fblob\u002Fmain\u002Fskills\u002Fexcalidraw-mcp\u002Freferences\u002Flayout-recipes.md",{"path":105,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":106,"sourceHtmlUrl":107},"references\u002Fmcp-workflow.md",4017,"https:\u002F\u002Fgithub.com\u002Fanton-abyzov\u002Fvskill\u002Fblob\u002Fmain\u002Fskills\u002Fexcalidraw-mcp\u002Freferences\u002Fmcp-workflow.md",{"path":109,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":110,"sourceHtmlUrl":111},"references\u002Fobsidian.md",2217,"https:\u002F\u002Fgithub.com\u002Fanton-abyzov\u002Fvskill\u002Fblob\u002Fmain\u002Fskills\u002Fexcalidraw-mcp\u002Freferences\u002Fobsidian.md",{"path":113,"resourceType":114,"resourceTypeDesc":115,"sizeBytes":116,"sourceHtmlUrl":117},"scripts\u002Fensure_mcp.py","SCRIPT","脚本",6582,"https:\u002F\u002Fgithub.com\u002Fanton-abyzov\u002Fvskill\u002Fblob\u002Fmain\u002Fskills\u002Fexcalidraw-mcp\u002Fscripts\u002Fensure_mcp.py",{"path":119,"resourceType":114,"resourceTypeDesc":115,"sizeBytes":120,"sourceHtmlUrl":121},"scripts\u002Fexcalidraw_build.py",21476,"https:\u002F\u002Fgithub.com\u002Fanton-abyzov\u002Fvskill\u002Fblob\u002Fmain\u002Fskills\u002Fexcalidraw-mcp\u002Fscripts\u002Fexcalidraw_build.py",{"path":123,"resourceType":114,"resourceTypeDesc":115,"sizeBytes":124,"sourceHtmlUrl":125},"scripts\u002Fexcalidraw_lint.py",14671,"https:\u002F\u002Fgithub.com\u002Fanton-abyzov\u002Fvskill\u002Fblob\u002Fmain\u002Fskills\u002Fexcalidraw-mcp\u002Fscripts\u002Fexcalidraw_lint.py",{"path":127,"resourceType":114,"resourceTypeDesc":115,"sizeBytes":128,"sourceHtmlUrl":129},"scripts\u002Fexcalidraw_render.py",4321,"https:\u002F\u002Fgithub.com\u002Fanton-abyzov\u002Fvskill\u002Fblob\u002Fmain\u002Fskills\u002Fexcalidraw-mcp\u002Fscripts\u002Fexcalidraw_render.py",{"path":131,"resourceType":114,"resourceTypeDesc":115,"sizeBytes":132,"sourceHtmlUrl":133},"scripts\u002Fsplit_excalidraw_library.py",5564,"https:\u002F\u002Fgithub.com\u002Fanton-abyzov\u002Fvskill\u002Fblob\u002Fmain\u002Fskills\u002Fexcalidraw-mcp\u002Fscripts\u002Fsplit_excalidraw_library.py",[135,162,179,204,240,265],{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":141,"publishedAt":44},"01M6HKP9JT8CH33W7DJB544DCS","x-reply-drafts","Find live X threads where a product genuinely fits, and draft truthful, humanized replies for the owner to review and post by hand. Human pace only: max 5 replies a day, never two within 20 minutes, no automated posting. Use when the user asks to 'find threads to reply to', 'draft X replies', 'reply-guy session', 'join trending conversations', 'engage on Twitter about \u003Cproduct>', or wants a daily batch of reply drafts. Not for scheduling original posts (social-media-posting) or bulk publishing (blotato).","https:\u002F\u002Fgithub.com\u002Fanton-abyzov\u002Fvskill\u002Fblob\u002Fmain\u002Fplugins\u002Fmarketing\u002Fskills\u002Fx-reply-drafts\u002FSKILL.md",[],[142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],"reply","drafts","x reply drafts","review","product","batch","Media","unslop","never","only","humanize","social","human","join","trending","bulk","posts","threads","conversations","hand",{"skillNo":163,"name":164,"nameZh":6,"description":165,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":166,"categories":167,"keywords":168,"publishedAt":44},"01M6CND903Q6E6R2XDWMFH8MAY","hello-world","A tiny test skill used by the 0853 verify-runtime harness. Says hello. No external calls. Use when the user asks for a sanity-check skill in a verify-harness fixture.","https:\u002F\u002Fgithub.com\u002Fanton-abyzov\u002Fvskill\u002Fblob\u002Fmain\u002Ftest\u002Fverify\u002Ffixtures\u002Ftiny-skill-source\u002Fplugins\u002Ftiny-test-plugin\u002Fskills\u002Fhello-world\u002FSKILL.md",[],[169,170,171,172,173,174,175,176,177,178],"hello world","hello","world","test","Test Skill","harness","verify","check","user","use",{"skillNo":180,"name":181,"nameZh":6,"description":182,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":183,"categories":184,"keywords":193,"publishedAt":44},"01M6CND60H0N1CYEB6ABEW18NS","existing-skill","Lint markdown files for style and grammar issues.","https:\u002F\u002Fgithub.com\u002Fanton-abyzov\u002Fvskill\u002Fblob\u002Fmain\u002Fsrc\u002Fcommands\u002F__tests__\u002Ffixtures\u002Fexisting-skill\u002FSKILL.md",[185,188],{"categoryNo":186,"categoryName":187,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000002","文档处理",{"categoryNo":189,"categoryName":190,"taxonomyType":191,"taxonomyTypeDesc":192},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[194,195,196,197,198,199,200,33,32,31,201,202,203],"existing skill","docs","lint","code","issues","markdown","grammar","cursor","files","lint markdown files",{"skillNo":205,"name":206,"nameZh":6,"description":207,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":208,"categories":209,"keywords":220,"publishedAt":44},"01M6CND1JAW97FY3W50MAPNKX7","remotion-best-practices","Best practices for Remotion video creation in React — scaffolding, compositions, animations, transitions — PLUS hard-won rules for high-fidelity product-demo videos: real logos\u002Ficons, precise YouTube-reference matching, full-screen camera zooms, click-targets that actually hit, content-tight rectangle highlights, voiceover regeneration discipline, audio-level normalization (no double-boost), per-scene voice-sync math, Studio detail-page mirror patterns, bold-not-subtle connection lines, and the YouTube publication kit (chapters, description, thumbnail, hashtags) that turns a render into a shipped video.","https:\u002F\u002Fgithub.com\u002Fanton-abyzov\u002Fvskill\u002Fblob\u002Fmain\u002Fskills\u002Fremotion-best-practices\u002FSKILL.md",[210,213,216,217],{"categoryNo":211,"categoryName":212,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":214,"categoryName":215,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":218,"categoryName":219,"taxonomyType":191,"taxonomyTypeDesc":192},"01JBSEEDCAT000000000000031","产品经理",[221,222,223,224,225,146,226,227,228,229,230,231,232,233,234,235,236,237,238,239],"best practices","remotion best practices","Remotion","react","sync","normalization","Video","Animation","Composition","Audio","page","math","discipline","publishing","camera","youtube","voiceover","patterns","remotion, video, react, animation, composition",{"skillNo":241,"name":242,"nameZh":6,"description":243,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":244,"categories":245,"keywords":247,"publishedAt":44},"01M6CNCXMSB1MKQ7646AR12VXY","rea","Find out exactly how a feature is implemented in a shipped tool or app you don't have the source for (desktop apps, Electron apps like Claude desktop, native CLIs like Codex, websites, APKs, .NET assemblies) using REA - Reverse Engineer Anything (github.com\u002Fmorluto\u002Frea). Sets REA up when it is missing (CLI, MCP registration, Hopper or Ghidra), routes the target to the right REA tool, keeps evidence out of the context window, and turns findings into a clean-room spec before any rebuild. Use when the user says 'use REA', 'reverse engineer', 'how does \u003Capp> do X', 'how is this feature implemented in \u003Ctool>', 'clone this feature', 'decompile', 'look inside the app', or asks how a closed-source competitor works. Skip it when the source is available - read the repo instead.","https:\u002F\u002Fgithub.com\u002Fanton-abyzov\u002Fvskill\u002Fblob\u002Fmain\u002Fskills\u002Frea\u002FSKILL.md",[246],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[242,26,248,249,250,251,252,253,254,255,33,256,257,258,259,260,261,262,263,264],"cli","reverse-engineering","ghidra","binary-analysis","analysis","how","reverse engineer anything","repo","context","evidence","up","engineer","rebuild","clean","registration","do","reverse engineer",{"skillNo":266,"name":267,"nameZh":6,"description":268,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":269,"categories":270,"keywords":279,"publishedAt":44},"01M6CNCSE0847Q1FP1GRQ75SR9","motion-graphics-promo","After Effects-style motion graphics for short product promos (15-45 s, vertical or landscape), built as code with HyperFrames + GSAP. Covers a story-first brief, motion grammar (energetic entry, one transition per task, spring settle, 2-3 s of stable proof), a 32-second promo timeline, device-frame and kinetic-type recipes, vertical-first composition, evidence rules (real UI only, no fake clicks), music licensing and encoded-frame verification. Use when the user asks for an After Effects-like animation, motion graphics, a kinetic-type promo, an app promo video, a product teaser, a Reels\u002FTikTok\u002FShorts ad, or 'animations like After Effects'. Also covers short explainers, tutorials and 15-second vertical ads: a design kit (footage beds, condensed caps in a marker box, white device frames, falling stickers, voice-over with music ducking) and HyperFrames render traps that silently break output. Pairs with hyperframes-best-practices (screencast pipeline) and remotion-best-practices.","https:\u002F\u002Fgithub.com\u002Fanton-abyzov\u002Fvskill\u002Fblob\u002Fmain\u002Fskills\u002Fmotion-graphics-promo\u002FSKILL.md",[271,274,275,276],{"categoryNo":272,"categoryName":273,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":214,"categoryName":215,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":189,"categoryName":190,"taxonomyType":191,"taxonomyTypeDesc":192},{"categoryNo":277,"categoryName":278,"taxonomyType":191,"taxonomyTypeDesc":192},"01JBSEEDCAT000000000000032","设计师",[280,281,282,283,284,197,285,146,286,287,288,227,228,223,229,289,200,290,151,291],"graphics","motion graphics","motion","motion graphics promo","design","verification","ui","brief","pipeline","ads","short","tiktok"]