Cross-Linker
SkillDocs & knowledgeUse 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".
Available today. Use it from your connected AI after setup.
No other account needed.
Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
Then ask your AI: use the Cross-Linker skill
What this skill tells your AI
The instructions your AI receives, as published by thoreinstein/gemini-obsidian in skills/cross-linker/SKILL.md and read by ahel’s review.
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
Signals
- GitHub stars
- 102
- Forks
- 9
- Last commit
- Jul 2026
Advanced
- Item type
- skill
- Key
cross-linker-thoreinstein- Source
- github.com/thoreinstein/gemini-obsidian