⏳ This skill is pending AI review.

Scores will appear once the review pipeline completes.

version unknown

sketchy

@ddkbs⭐ 226 stars

Draws hand-sketched, interactive diagrams (architecture, flows with step-by-step walkthroughs, comparisons, metaphors, Arduino circuits) right in the chat. Use whenever a concept, system, process or comparison is easier to understand as a drawing, or when the user asks for a sketch, diagram or visual explanation. In the regular Claude chat, use this skill even if Sketchy MCP tools are connected, because the chat does not display their drawings.

Choose how to use this skill

You do not need every option. Choose the path your AI client supports. The stable page stays the same; versioned files are immutable.

1. Native installer

This listing has no registered native installer command. Use the complete package or source fallback below, depending on what your client supports.

Do not guess an installer command or replace an existing version without reviewing the diff.

2. Complete package recommended

Download the ZIP when available. It includes SKILL.md plus the references, security notes and version metadata.

No complete ProSkills package is published for this listing yet.

3. Prompt-only

Copy the prompt above when the agent can read the stable page or when you want to adopt the workflow without installing a skill.

Need only the instruction file?

Download SKILL.md only if your client requires a single file. The complete ZIP is safer for a full installation because it preserves the references and release context.

No path installs or executes anything by itself. Your agent still needs access to the project files. Before updating, compare the installed version and review the diff.

—/10

// RATINGS

⭐GitHub Stars
⭐⭐⭐ 226 on GitHubGitHub ↗

Popular

🟢ProSkills Score
—
📍

Not yet listed on ClawHub or SkillsMP

// README

Sketchy

Sketchy lets your AI assistant draw while it explains: clean, hand-drawn, interactive diagrams rendered right next to the answer. It works in the Claude chat as a skill, including the Claude app on your phone, and as an MCP server in Claude Code, Codex, Cursor, VS Code and other MCP clients.

The AI decides what to draw and label. Sketchy decides where: a part library with named anchor points and automatic layout. The AI never computes coordinates, so drawings come out precise and consistent every time.

Sketchy in a chat: the answer to "What happens when I open a web page?" comes with an interactive drawing and its toolbar (Draw, SVG, PNG, Excalidraw)

What it can draw

Systems, step by step

Ask "What happens when I open a web page?" and the AI draws the whole path, then walks you through it. Each step circles what matters in red pen and fades the rest. Use the buttons or the arrow keys.

The life of a web request, from the browser through CDN, load balancer and services to cache, database and queue

Step 5 of the walkthrough: the orders service, cache and database are circled

Concepts from computer science and machine learning

Sketchy is not limited to hardware. Structure, flow, comparison and metaphor patterns cover any topic, from transformers to TCP.

How an LLM picks the next word: tokenizer, embeddings, a transformer block with self-attention and MLP, and sampling

Your own code

Ask "Explain my repo". The AI reads the code and draws modules, folders and data flow. Click a box to open the file in VS Code, Cursor, Windsurf or Zed; hover to see what it does.

Architecture of a repository with nested folders

Circuits from Arduino and ESP32 sketches

Ask "How is my sketch wired?". The AI reads pinMode, digitalWrite and friends, places real parts (50 boards, sensors, displays and modules from wokwi-elements) and connects pins by name. Sketchy routes the wires and places the callouts.

Labeled photos

The AI finds a freely licensed photo (Wikimedia Commons, Openverse), and a vision model running on your computer (Florence-2) locates the parts and printed text to label. Attribution is always shown.

Photo of an Arduino Uno with labeled parts

Comparisons and metaphors

Interactive, exportable

  • Hover any box, pin or wire for details.
  • Draw on the sketch with a red pen, a highlighter and notes, then Send to AI with a question: the AI gets the marked-up drawing and which parts you marked.
  • Click a code node to open the file, or a photo credit to open its source.
  • Export as SVG or PNG, fonts included, or as an Excalidraw file to keep editing on excalidraw.com: your system's save dialog asks where to put the file.
  • Fullscreen where the host supports it.

Drawing mode: the CDN is circled in red pen with a note, and a question is ready to send to the AI

Install

Where do you work? Sketchy comes two ways, and both can be installed side by side:

  • In the chat (Claude on web, desktop and the iPhone and Android apps): the skill. Nothing to install locally.
  • While coding (Claude Code in the desktop app or terminal, Codex, Cursor, VS Code): the extension, which adds photo labeling, SVG, PNG and Excalidraw export and click-to-open files.

Claude chat (web, desktop and mobile)

The skill draws right in the chat, with no server:

  1. Download sketchy-skill-<version>.zip from the latest release.
  2. In Claude, open Settings → Capabilities → Skills and upload the zip.
  3. Ask for a drawing in any chat.

On your phone: skills belong to your Claude account, so once uploaded the skill also works in the Claude app on iPhone and Android. Ask a question on the go and the drawing appears in the chat, with steps you can tap through. Nothing to install on the phone.

Claude writes the scene, and the chat's inline visualization loads Sketchy's browser bundle from jsDelivr, which serves it from this repository's cdn branch. The skill follows the current minor version, so it picks up fixes without being uploaded again. To run exactly the code you reviewed, use sketchy-skill-<version>-pinned.zip instead: it loads the bundle from a fixed commit of the cdn branch and checks it with a Subresource Integrity hash, so the browser refuses any other file. It does not pick up fixes; upload the next pinned zip to update. Photo labeling and opening files from a drawing need your computer, so they stay in the desktop extension.

Claude desktop app (Code tab)

  1. Download the .mcpb file for your platform from the latest release (macOS on Apple Silicon, Windows or Linux).
  2. Double-click it (or drag it into Settings → Extensions) and confirm.
  3. Optional: in the extension settings choose your editor and where Sketchy stores its data.
  4. Open the Code tab and start a session. Drawings appear inline next to Claude's answer.

The Chat tab does not display views from locally installed extensions; use the skill above there.

The photo-labeling model is not part of the download. The first time the AI labels a photo, Sketchy asks you to pick a model size:

ModelDownloadMemoryNotes
Small~280 MB~1 GBRecommended. Printed text, distinct parts
Medium~830 MB~2.5 GBBetter grounding of small parts
Large~3.1 GB~4.5 GBMost precise

Claude Code in the terminal

Sketchy is on npm as @ddkbs/sketchy. With Node.js 20 or newer, register it once for all your projects:

claude mcp add sketchy --scope user -- npx -y @ddkbs/sketchy

Run claude mcp list to check that it is connected. npx downloads the server on first start and picks up new versions on its own.

Codex

With Node.js 20 or newer, register Sketchy once for the Codex CLI and IDE extension:

codex mcp add sketchy -- npx -y @ddkbs/sketchy

Run codex mcp list to check that it is enabled, then start a new session. To add it by hand, put this into ~/.codex/config.toml:

[mcp_servers.sketchy]
command = "npx"
args = ["-y", "@ddkbs/sketchy"]

Where Codex cannot show MCP Apps inline, Sketchy saves each drawing as an interactive HTML file, as described under Other MCP clients.

Cursor and VS Code

Both show Sketchy's drawings inline in the agent chat. With Node.js installed, click Add to Cursor or **[Add to VS Code](https://vscode.dev/redirect/mcp/install?name=ske

// HOW IT'S BUILT

// FILES

4 files shipped with this skill. Inline text is the catalog copy. The upstream link is the source repository.

  • skill/SKILL.md4.0 KB38b6e1166108upstream ↗
    ---
    name: sketchy
    description: Draws hand-sketched, interactive diagrams (architecture, flows with step-by-step walkthroughs, comparisons, metaphors, Arduino circuits) right in the chat. Use whenever a concept, system, process or comparison is easier to understand as a drawing, or when the user asks for a sketch, diagram or visual explanation. In the regular Claude chat, use this skill even if Sketchy MCP tools are connected, because the chat does not display their drawings.
    ---
    
    # Sketchy
    
    In the regular Claude chat, always use this skill instead of the Sketchy MCP tools: the chat runs those tools but does not show their drawings.
    
    You describe **what** to draw in a few short lines; Sketchy computes every position and renders it in a hand-drawn style with hover details and step navigation. Never pass coordinates.
    
    ## Workflow
    
    Draw inline with your visualization tool (the one that renders HTML widgets in the conversation). Pass this HTML as the widget code, with the scene between the backticks:
    
    ```html
    <h2 class="sr-only">One-sentence summary of the drawing</h2>
    <div id="sketchy" style="min-height: 320px"></div>
    <script src="{{CDN}}/sketchy.js" {{SRI}}></script>
    <script>
      Sketchy.draw(
        "#sketchy",
        `
    title How a web request works
    dir right
    group net The internet
    browser Browser @globe ~ Shown on hover
    server Server @server in net !accent
    db Database (cylinder) in net
    browser -> server HTTPS
    server --> db query
    step Request: The browser asks the server | browser server browser->server
    `,
      );
    </script>
    ```
    
    Keep the widget code exactly like this: no other markup, styles or text. Then explain the drawing in 2–4 sentences in your reply instead of describing it again. If the widget shows "Sketchy could not draw this", fix the line the message names and draw again.
    
    To change an earlier drawing, draw the whole scene again with the same ids.
    
    Without a visualization tool, write the scene to a file and render a standalone page with the script in this skill's folder (Node.js, no network needed), then share the file:
    
    ```bash
    node <skill-folder>/scripts/render.mjs /tmp/scene.txt /mnt/user-data/outputs/<short-name>.html
    ```
    
    ## Scene syntax
    
    One element per line:
    
    ```
    title <text>            subtitle <text>            dir right|down
    group <id> <label> [in <parent group>]
    <id> <label> [@icon] [(shape)] [in <group>] [!accent|!muted] [~ hover text]
    <a> -> <b> [label] [!accent|!muted]      (--> dashed, <-> arrowheads on both ends)
    label <id>[.<pin>] <text>
    step <title>: <text> | <ids to highlight; edges as a->b>
    part <id> <type> [key=value] [caption]
    wire <part.pin> -> <part.pin> [red|black|blue|green|yellow|orange|purple|gray|white]
    ```
    
    - Labels are 1–4 words; put details after `~`.
    - Icons: `@globe`, `@server`, `@database` (Lucide) or `@simple-icons:react`.
    - Shapes: `(cylinder)` storage, `(person)` actor, `(note)`, `(circle)`, `(rounded)`, `(text)`.
    - Ids are letters, digits, `_` or `-`, unique across the scene; arrows, labels and steps may only use ids defined in it.
    
    ## Explanation patterns
    
    Pick one per drawing:
    
    - **structure** ("what is it made of?"): components as nodes, groups for areas, labels for the important bits; `dir down` for hierarchies.
    - **flow** ("how does it work?"): a left-to-right chain of nodes and arrows plus one step per stage.
    - **comparison** ("X vs Y"): one group per option with parallel nodes in the same order; `!muted` for what is equal, `!accent` for the key difference.
    - **metaphor** ("explain it simply"): one group for the real thing, one for an everyday counterpart, dashed arrows between matching elements.
    
    Quality rules: 3–12 nodes; `!accent` on at most one or two elements; icons sparingly; 3–7 steps of one or two sentences each.
    
    ## Circuits
    
    Find part types and pin names first (needs code execution):
    
    ```bash
    node <skill-folder>/scripts/render.mjs --parts "distance sensor"
    node <skill-folder>/scripts/render.mjs --parts arduino-uno
    ```
    
    Then add `part uno arduino-uno`, `part r1 resistor value=220` and `wire uno.13 -> r1.1 green`. Red wires for power, black for GND, other colors for signals; a resistor in series with every LED.
    
  • skill/render.ts2.5 KBc6a3e8118e4bupstream ↗
    import { readFileSync, writeFileSync } from "node:fs";
    import { z } from "zod";
    import { layoutScene } from "../src/layout/index.js";
    import { PartIndex } from "../src/parts/index.js";
    import { SceneBuilder } from "../src/scene/builder.js";
    import { parseCompact } from "../src/scene/compact.js";
    import { embedScene } from "../src/standalone.js";
    import { sketchShape } from "../src/tools/schemas.js";
    
    // Skill entry: the same scene description as the `sketch` tool in, one
    // self-contained HTML page out. Runs in Claude's code sandbox, no network.
    const [scenePath, outPath] = process.argv.slice(2);
    const parts = await PartIndex.load(new URL("./parts.json", import.meta.url));
    
    // `--parts <query>` searches the part library; an exact type lists its pins.
    if (scenePath === "--parts") {
      const query = process.argv.slice(3).join(" ");
      const detail = parts.detail(query.trim());
      if (detail) console.log(`${detail.type}: ${detail.pinList.map((p) => p.name).join(", ")}`);
      else for (const p of parts.search(query)) console.log(`${p.type} — ${p.title} (${p.category})`);
      process.exit(0);
    }
    if (!scenePath || !outPath) {
      console.error("usage: node render.mjs <scene.json> <out.html> | --parts <query>");
      process.exit(2);
    }
    
    try {
      // A .json file holds the JSON form; anything else is the compact line syntax.
      const source = readFileSync(scenePath, "utf8");
      const input = z
        .object(sketchShape)
        .parse(scenePath.endsWith(".json") ? JSON.parse(source) : parseCompact(source));
      const builder = new SceneBuilder(parts);
      builder.reset({ title: input.title, subtitle: input.subtitle, direction: input.direction });
      for (const g of input.groups ?? []) builder.addGroup(g);
      for (const n of input.nodes ?? []) builder.addNode(n);
      for (const p of input.parts ?? []) builder.addPart(p);
      if (input.images?.length) throw new Error("Photos are not available in the skill.");
      for (const e of input.edges ?? []) builder.addEdge(e);
      for (const w of input.wires ?? []) builder.connect(w);
      for (const l of input.labels ?? []) builder.addLabel(l);
      for (const s of input.steps ?? []) builder.addStep(s);
    
      const laidOut = await layoutScene(builder.scene, parts);
      const template = readFileSync(new URL("./viewer.html", import.meta.url), "utf8");
      writeFileSync(outPath, embedScene(template, laidOut));
      console.log(`Wrote ${outPath}`);
    } catch (error) {
      // Validation errors name the field so Claude can fix the scene and retry.
      console.error(error instanceof Error ? error.message : String(error));
      process.exit(1);
    }
    
  • skill/tsconfig.json122 Bd0eb300c7657upstream ↗
    {
      "extends": "../tsconfig.json",
      "compilerOptions": { "rootDir": "..", "noEmit": true },
      "include": ["render.ts"]
    }
    
  • README.mdupstream ↗

    Contents are not inlined in the catalog. Open the upstream file.

Plain-text copy, no login: /skill-bundles/ddkbs-sketchy-skill.md

// REPO STATS

226 stars