From learning-loop
Generates Excalidraw diagrams for concepts, mechanisms, processes, or architectures with 3+ connected components, saving .excalidraw.md files to vault/Excalidraw/ folder. Use /learning-loop:diagram with optional topic or infer from context.
npx claudepluginhub robinslange/learning-loop --plugin learning-loopThis skill uses the workspace's default tool permissions.
Generate an Excalidraw diagram and save it to the vault. Handles the full pipeline: determine what to diagram, build the JSON, write the file, and optionally embed it in a note.
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Processes PDFs: extracts text/tables/images, merges/splits/rotates pages, adds watermarks, creates/fills forms, encrypts/decrypts, OCRs scans. Activates on PDF mentions or output requests.
Share bugs, ideas, or general feedback.
Generate an Excalidraw diagram and save it to the vault. Handles the full pipeline: determine what to diagram, build the JSON, write the file, and optionally embed it in a note.
/learning-loop:diagram "concept or mechanism" -- user specifies what to diagram/learning-loop:diagram -- infer from conversation contextIf args provided: Use as the concept description.
If no args: Read recent conversation. Identify the most diagram-worthy concept -- a mechanism, pathway, feedback loop, multi-step process, or system architecture where relationships between parts matter more than the parts themselves.
Diagram gate -- check BEFORE proceeding:
If the answer to all three is no, tell the user: "This works better as text/table -- no diagram needed." and stop.
Read the diagram-rules agent file to get the full Excalidraw construction spec:
PLUGIN/agents/_skills/diagram-rules.md
Follow every rule in that file. Key points:
.excalidraw.md format with empty ## Text Elements section#a5d8ff (blue), #b2f2bb (green), #ffec99 (yellow), #ffc9c9 (red), #d0bfff (purple)fontFamily: 5, roughness: 1frameId, index, versionNonce, or rawText fieldsBefore writing JSON, plan on paper:
Build the full Excalidraw JSON following diagram-rules exactly. Write to:
{{VAULT}}/Excalidraw/{slug}.excalidraw.md
Where {slug} is a descriptive kebab-case name (e.g., thalen-engagement-loop-tiers).
File format:
---
excalidraw-plugin: parsed
tags: [excalidraw]
---
==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving'
# Excalidraw Data
## Text Elements
%%
## Drawing
```json
{JSON here}
%%
### Step 5: Validate
Check the generated JSON:
1. No overlapping positions (30px minimum between edges)
2. Container text fits (text width < container width - 60px)
3. Arrow first point is `[0, 0]`, width/height match point bounding box
4. All IDs unique
5. No `frameId`, `index`, `versionNonce`, or `rawText` fields present
### Step 6: Report
Diagram: "{title}" -> Excalidraw/{slug}.excalidraw.md Embed with: ![[{slug}]]
If the conversation has an obvious note to embed it in, suggest which note. Otherwise just report the path.
## Key Principles
- **Connections carry meaning.** If you remove the arrows and it still works, it was a layout, not a diagram.
- **Focused scope.** One mechanism per diagram. Split complex systems.
- **Follow diagram-rules exactly.** Read the agent file every time. Don't rely on memory.
- **No extra elements.** Default to free-floating text. Only add containers when the shape itself carries meaning.
- **Calculate widths.** Never hardcode text widths. Compute from character count every time.