Cross linker
A Claude Code plugin for interfacing with an Obsidian vault with local first RAG capabilities
npx -y skills add thoreinstein/obsidian-rag --skill cross-linkerAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 3 stars3 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Use when the user wants to find and insert missing wikilinks across vault notes. Triggers on "cross-link", "find missing links", "weave links", "unlinked mentions", "add wikilinks", or "link notes together".
SKILL.md
3.5 KB, as published. Nobody here has run it
Cross-Linker
Discover unlinked mentions of vault concepts and insert [[wikilinks]]. Complements link-audit (which finds broken/orphan links) by finding links that should exist but don't.
Workflow
Phase 1 — Build Page Registry
- Call
obsidian_list_noteson the target scope (default:Engineering/). - For each note, call
obsidian_read_noteand extract from frontmatter:- Title (from
# headingor filename) - Aliases (from
aliases:frontmatter field, if present) - Type (pattern, trap, decision, concept)
- Title (from
- Build a registry:
{ title, aliases[], path, type }for each note.
For large scopes (>50 notes), batch reads and process incrementally.
Phase 2 — Scan for Unlinked Mentions
For each note in scope:
- Call
obsidian_read_noteto get the full body text. - For each other page in the registry, check if the page's title or any alias appears in the body text without being wrapped in
[[...]]. - Skip matches inside:
- Existing wikilinks
[[...]] - Code blocks (fenced or inline)
- Frontmatter
- The note's own title/heading
- Existing wikilinks
- Record each match:
{ source_note, target_note, matched_text, line_context, confidence }
Phase 3 — Score and Rank
Assign confidence to each proposed link:
- High — exact title match (case-insensitive), target is a Pattern/Trap/Decision note
- Medium — alias match, or title match in a less structured note
- Low — partial match or only semantically related (use
obsidian_rag_queryto verify)
Sort findings: high confidence first, grouped by source note.
Phase 4 — Present Findings
Show the user a report:
## Cross-Link Report for: Engineering/
### High Confidence (auto-apply)
- Engineering/Patterns/table-driven-tests.md
Line 12: "table driven tests" → [[Table-Driven Tests]]
### Medium Confidence (confirm each)
- Engineering/Traps/mock-drift.md
Line 8: "interface injection" → [[Interface Injection]]
### Low Confidence (review)
- working/appiary/knowledge/auth.md
Line 23: "token" → possibly [[Token Rotation]] ?
### Summary
- X high-confidence links ready to apply
- Y medium-confidence links for review
- Z low-confidence suggestions
Phase 5 — Apply Links
- High confidence: Apply automatically using
obsidian_replace_in_note, replacing the first unlinked mention with[[Target Title]]or[[path/to/note|display text]]. - Medium confidence: Apply one at a time, asking user to confirm each.
- Low confidence: List for reference only — don't auto-apply.
Only link the first unlinked mention of each target per source note. Repeated mentions stay as plain text (standard wiki convention).
Arguments
- Optional scope:
/cross-linker Engineering/Patterns/(default:Engineering/) - Optional depth:
/cross-linker --deepto includeworking/andreference/scopes
Tips
- Run on a narrow scope first (
Engineering/Patterns/) to calibrate before going vault-wide - If a note has many false positives, it may need
aliases:in frontmatter to disambiguate - Short titles (1-2 words like "Testing" or "Auth") generate noise — prefer linking specific concept names
- After running, consider
/link-auditto verify no broken links were introduced