A skill for Claude Code (and any other Agent Skills-compatible CLI) that turns lecture slide PDFs into a linked concept graph of Obsidian notes, plus a positioned .canvas view.
Recommended — via the skills CLI
# Global install into ~/.claude/skills/
npx skills add p-2411/write-notes -g
# Or project-scoped (.claude/skills/ in the current project)
npx skills add p-2411/write-notesThis works across Claude Code, Cursor, Codex, Windsurf, and the other 40+ agent CLIs the skills ecosystem supports.
npx write-notesCopies the skill to ~/.claude/skills/write-notes/.
Restart Claude Code (or run /reload-plugins) after installing to pick up the skill.
Ask Claude Code to process a lecture PDF:
Turn these lecture slides into Obsidian notes:
~/Desktop/03_DesignByContract.pdf
The skill will:
- Ask for anything it needs (PDF path, vault root, canvas file) if not provided.
- Extract text via
pdftotextand grep-verify every candidate concept against the PDF. - Reject hallucinated concepts (topic-canonical material the slides didn't actually teach).
- Draft one markdown note per verified concept, grouped into a folder per lecture topic:
<Vault>/<Course>/Content/<Lecture-Topic>/<Concept>.md - Add nodes and edges to a
.canvas— either one you specify, or<Vault>/<Course>.canvasby default.
Most "summarise this PDF" skills pad the output with canonical topics the lecture didn't cover. This skill enforces a strict rule: the PDF is the only source of concepts. Every concept must have a verbatim pdftotext quote as evidence, and the subagent's JSON output is rejected if it doesn't. See the skill's Do not invent concepts and Baseline failure on record sections for the full rationale.
npx write-notes # install
npx write-notes --force # overwrite existing install
npx write-notes uninstall # remove
npx write-notes --dir=PATH # install to custom path
npx write-notes --help # show help- Claude Code or another Agent Skills–compatible CLI.
pdftotext— install viabrew install poppler(macOS) orapt install poppler-utils(Linux).- Node.js ≥ 18 (only for the installer; the skill itself has no Node dependency).
write-notes/
├── skills/
│ └── write-notes/
│ └── SKILL.md ← the actual skill
├── bin/
│ └── install.js ← standalone npx installer
├── package.json
├── README.md
└── LICENSE
MIT