obsidian-plugin/skills/vault-orphans/SKILL.md
Triage orphaned notes (zero in/out wikilinks) in an Obsidian vault. Use when finding orphans, linking them into a MOC, or reconnecting Zettelkasten notes.
npx skillsauth add laurigates/claude-plugins vault-orphansInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
| Use this skill when... | Use the alternative instead when... |
|---|---|
| Triaging orphan notes (zero incoming, zero outgoing wikilinks) for archive vs. reconnect | Building a new MOC hub the orphans should link into — use vault-mocs |
| Distinguishing expected orphans (inbox, daily notes) from meaningful ones | Discovering the orphan list itself via the running CLI — use search-discovery |
| Suggesting archival paths for stale isolated Zettelkasten notes | Classifying or consolidating work-namespace redirect stubs — use vault-stubs |
An "orphan" is a note with no incoming wikilinks AND no outgoing wikilinks — disconnected from the knowledge graph. Some orphans are expected; others are the most productive places to add structure.
| Class | Where | Treat as |
|-------|-------|----------|
| Inbox items | Inbox/*.md | Expected; process via /process-inbox |
| Daily notes | Notes/YYYY-MM-DD.md, work/notes/… | Expected; they link out but rarely in |
| Standalone references | Zettelkasten/*.md with 0↔0 | Meaningful — add linkage |
| Kanban board notes | Kanban/*.md | Usually acceptable; boards are self-contained |
| Archive / logs | under Archive/ subfolders | Expected; stale by design |
The vault-agent graph analyzer classifies each automatically.
The detection methodology above is unchanged — only the data source changes when Obsidian (and its obsidian CLI / live link index) is closed. The obsidian CLI and vault-agent analyzers are the live-index path; parsing the .md corpus directly with Glob/Grep is the deterministic headless default, and for batch/scheduled audits it is often the better choice (reproducible, free of app/index state). vault-frontmatter already operates this way.
Parse the corpus directly:
--- fences; extract tags, aliases, context. See vault-frontmatter for YAML-block mechanics.[[Target]], [[Target|Alias]], [[Target#Heading]], [[folder/Target]], and ![[embed]]. Resolve each target to a note by basename, then relative path, then alias (from frontmatter), all case-insensitive. Resolve ![[embed]] against attachments as well as notes — the attachment folder is per-vault configurable, so read it from .obsidian/app.json (attachmentFolderPath) and fall back to the vault root / Files/ only when that key is unset.Build the link graph from the resolved wikilinks: a note is an orphan when no resolved link targets it (zero incoming) and it emits no link that resolves (zero outgoing). The class table above (Inbox / daily / Archive) is path-derived and works identically offline.
For each meaningful orphan:
🛠️/neovim → Neovim MOC) or by title.[[Note]] to the appropriate MOC under the right sectionArchive/ subfolder if no longer usefulvault-mocs for thresholds.When adding a note to a MOC, match on:
🛠️/neovim belongs in the Neovim MOC.A, B, C all link to each other but none link from a MOC, add the whole cluster to the MOC under one section heading.MOCs typically have sections like ## Core Concepts, ## Tools, ## Specific Configurations. Pick the most specific section that fits; create a new ## Something section only if 3+ notes fall under the same new heading.
Never modify 100+ MOC links in one commit — that's unreviewable. Use one commit per MOC:
feat(mocs): link 12 orphaned CLI tool notes into new CLI Tools MOC
development
Debug HTTP APIs: trace requests, inspect headers. Use when a request fails: check status first.
documentation
Render architecture diagrams from text sources. Use when documenting system topology.
tools
Inspect JSON payloads and extract nested fields. Use when parsing API responses.
tools
--- name: no-description allowed-tools: Read --- # No Description This skill has no description and must be dropped with a warning.