本文へ移動
cccskills
無料GitHub で公開

excalidraw-use

Places existing images onto an Excalidraw whiteboard, turns a slide deck into clean per-slide images, and inspects a .excalidraw file. Use whenever someone mentions Excalidraw, a whiteboard/canvas, .excalidraw, 白板 or 画板 — e.g. "put these screenshots on my board" — or a workshop delivered by hand-drawing over screenshots on a shared canvas. Not for generating a diagram from a text description.

インストール方法を見る

含まれるファイル(8)

  • SKILL.md8.2 KB
  • references/deck_screenshot_pitfalls.md4.8 KB
  • references/paste_workflow.md3.5 KB
  • references/scene_file_format.md4.2 KB
  • scripts/build_scene.py10.1 KB
  • scripts/inspect_scene.py5.9 KB
  • scripts/shoot_deck.mjs7.3 KB
  • scripts/split_scene.py5.1 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Excalidraw: images onto a board

Excalidraw is a whiteboard people draw on live. This skill covers the part that is fiddly to do by hand: getting a lot of existing images onto a board, laid out so nobody has to drag them apart afterwards.

It does not generate diagrams from prose. If the request is "draw the architecture" or "make a flowchart", that is a diagram-generation job — several tools and skills do it, including a diagram skill in the gstack suite if the user has it installed.

Which job is this?

The user saysGo to
"put these images on my board", "add the old screenshots to the canvas"Job 1 — build a pick tray
"turn the deck into images", "screenshot every slide"Job 2 — deck to images, then Job 1
"what's in this file", "how big is this board", "is anything broken"Job 3 — inspect
"draw me a flowchart from this description"not this skill

Job 1 — build a pick tray of images

python3 scripts/build_scene.py \
  --out tray.excalidraw \
  --cols 6 \
  --template-from ~/path/to/their-board.excalidraw \
  --exclude already-placed.png \
  images/*.png

Expected output — if you do not see the verified: line, the file is not usable:

verified: 30 image element(s), hashes match, no overlap
placed 30 image(s), 6 x 5 grid, min gap 600
wrote tray.excalidraw (3.5 MB)

Hand the user the file plus how to get it onto their board. That second half is where this goes wrong: at excalidraw.com, both Open and drag-and-drop replace the entire current scene. Telling someone to "open this file" when they have a live board is telling them to lose it. The additive route is the clipboard — full instructions and the reasoning in references/paste_workflow.md. Read it before you write the hand-off message.

Three decisions worth making deliberately:

  • --template-from whenever they have an existing board. Excalidraw's published JSON schema documents the top-level shape and the files map, but not the image element's own fields (fileId, status, scale, crop), so copying a live element from their board is the only way to be sure the field set matches the build they actually run. Without it a reasonable default is used, which has worked but is one observed field set, not a spec. references/scene_file_format.md has the field-by-field breakdown, keeping what the official docs state separate from what was read off a real file — open it when you need to hand-build or repair a scene rather than let the script write one.
  • --exclude anything already on their board. The check is by image content, not filename, so a renamed copy is still caught. Skipping this is how someone ends up with the same picture twice and has to delete one by hand.
  • Spacing. --cell is the longest side each image is scaled to; --pitch is the distance between cell centres. The gap is pitch - cell, and the defaults (800 / 1400 → 600) are deliberately generous. If a user has ever said "don't make me fix the spacing again", raise --pitch, don't lower it.

If the scene is more than ~15 MB, split it — the clipboard is where a large scene stalls:

python3 scripts/split_scene.py --scene tray.excalidraw --out-dir parts/ --chunks 4

Job 2 — turn a slide deck into clean images

For Vite/React decks whose slides are registered in a src/slides/index.ts with entries shaped { id: 'intro', component: S01, fragmentCount: 3 }.

# 1. Build the deck FROM SOURCE and serve that build (not a dev server).
cd <deck>; npx vite build --outDir /tmp/deck-dist --emptyOutDir
cd /tmp/deck-dist && python3 -m http.server 8080 &

# 2. Shoot it.
node scripts/shoot_deck.mjs \
  --index <deck>/src/slides/index.ts \
  --url http://127.0.0.1:8080/index.html \
  --out shots/ \
  --advance pdf     # or: keys

Expected output:

30 slides (7 with fragments), advance=pdf
30/30 captured, 32 inline chrome element(s) hidden -> shots/
all .fragment elements rendered visible (opacity check)

That last line is the one that matters. If instead you see WARNING: N slide(s) have fragments that never revealed, those screenshots are missing content — do not feed them into Job 1. Read references/deck_screenshot_pitfalls.md; the usual cause is that the build being served is older than the source.

puppeteer must be resolvable from wherever you run the script. Decks that generate their own PDFs usually already have it — run the script from that project, or symlink its node_modules next to the script. npx puppeteer does not install a resolvable module for an ESM import.

Picking --advance: grep the deck's Deck component for pdf. If it reads a ?pdf=1 query, use pdf; otherwise keys. Never both — under ?pdf=1 the fragment index is already at maximum, so extra key presses move to the next slide and you silently capture the wrong content.

Add --strict to make unrevealed fragments a non-zero exit when this runs inside a pipeline. It stays a warning by default so a deck that legitimately keeps a .fragment hidden does not fail the whole run.

Job 3 — inspect a scene

python3 scripts/inspect_scene.py board.excalidraw --images

Reports element counts by type, embedded payload size, whether every image element resolves to a file whose content still matches its key, and the occupied extent. Read-only.

The extent is the practically useful number: pasted content lands wherever the viewport is, so knowing where existing work sits is how you tell the user where to scroll before pasting.

Never write into their live board file

Build a separate scene file and let the user paste from it. Two independent reasons, both observed:

  • A board that is open in a browser tab does not reload when the file on disk changes, and the next in-app save overwrites whatever you wrote.
  • The file on disk is usually older than the browser's state — someone exported it days ago and has been working in the tab since. Merging into that export silently drops everything they have done since.

If a merged file is genuinely wanted, write it to a new path and let the user choose which to open. Never overwrite the original.

Troubleshooting

SymptomCauseFix
Scene opens but a picture is blankfiles entry missing or its key does not match the payloadinspect_scene.py reports both; rebuild
Images touch or overlap on the board--pitch not greater than --cellthe script refuses this combination; raise --pitch
Paste does nothing / takes foreverscene too large for the clipboardsplit_scene.py, then paste each part
Pasting replaced the whole boardOpen / drag-and-drop was used instead of copy-pastesee references/paste_workflow.md; recover with in-app undo
Slides captured missing their later contentfragments never revealedrebuild the deck from source, re-serve, re-shoot
Key-press badges appear in slide screenshotsthe wait for them to fade was cut shortthe script already waits ~2.9 s after the last press; if a deck lingers longer, raise it
Cannot find package 'puppeteer'not resolvable from the script's locationrun from a project that has it
Image drawn at the wrong shapeelement aspect ratio does not match the sourcebuild_scene.py fails on this rather than writing it

Next step

After a tray is built, the natural follow-up is the paste itself, which only the user can do. Give them the file path, the scroll-to-empty-space warning, and the three-key sequence — then stop. Do not open excalidraw.com to "verify" the file: loading a scene there replaces whatever is in that browser's current session, which may be the board you were trying to protect.

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

Fixes web search on an agent whose model backend can't run it: a relay/reseller proxying Claude or Codex returns empty instead of failing. Use when web search returns nothing, a model insists a shipped product doesn't exist, someone wants to give an agent internet access, or the user is on a third-party base URL, relay, or 中转站. Diagnoses which built-in tools are dead, removes them, and installs a working replacement.

日本語の概要は準備中です。原文の説明を表示しています。

daymade/claude-code-skills1,4522026年10月11日 更新

抓取 A 股消息面情报:从财联社、华尔街见闻、金十、新浪 7x24、东财快讯、 证监会/央行/上交所/财政部政策公告、东方财富股吧等公开来源抓取与股票相关的 新闻、政策、情绪,输出结构化 JSON 或 Markdown。 当用户提到“A 股消息面”、“抓新闻”、“个股消息”、“政策监管”、“股吧情绪”、 “财联社”、“东财快讯”、“市场情绪”或需要把某只股票相关的公开情报聚合出来时 触发。也适用于“帮我看看 000001 最近有什么消息”这类口语化请求。

日本語の概要は準備中です。原文の説明を表示しています。

daymade/claude-code-skills1,4522026年10月11日 更新

Transcribes audio or video to speaker-labeled, timestamped text, locally with MLX on Apple Silicon or remotely. Use for 转录 / 录音转文字 / 说话人分离 / 字幕, and also for preparing audio for ASR without transcribing: 转格式, 降采样到 16kHz, merging recorder segments, or compressing and speeding up audio before 飞书妙记 — even when it looks like a one-line ffmpeg job.

日本語の概要は準備中です。原文の説明を表示しています。

daymade/claude-code-skills1,4522026年10月11日 更新

Routes audio: StepFun ASR/语音识别, StepFun TTS/配音, transcript/妙记→会议纪要, merge/review minutes. Reads one bundled specialist; generic ASR and correction stay direct.

日本語の概要は準備中です。原文の説明を表示しています。

daymade/claude-code-skills1,4522026年10月11日 更新

Diagnoses and repairs repository setup and guarded Git workflows for Claude Code or Codex — environment repair, startup sync, hook auditing, collaborator handoff. Use when a repo won't run, a teammate onboards, hook output duplicates, or commit/push/conflict needs guarding. Not for lost-commit recovery (use git-safety-net), GitHub ops (use github-ops), or history scrubbing (use github-sensitive-data-cleanup).

日本語の概要は準備中です。原文の説明を表示しています。

daymade/claude-code-skills1,4522026年10月11日 更新

Runs adversarial due-diligence on a benchmark the user envies — a founder, KOL, company, or product whose success looks inflated — splitting marketing bubble from real signal, then mapping the validated playbook onto the user's own resources. Use for 尽调/对标/拆解 a competitor, 抄/偷师 their playbook, or suspecting 水分/泡沫 in claims. Prefer over deep-research when debunking inflated claims, not a neutral briefing.

日本語の概要は準備中です。原文の説明を表示しています。

daymade/claude-code-skills1,4522026年10月11日 更新

daymade のスキルをすべて見る

このスキルの問題を報告する