Install
openclaw skills install obsidian-vault-linkerDiscover and write typed relationships between Obsidian vault notes. Uses plain Markdown and YAML — no plugins required. Works with any AI agent that has file access.
openclaw skills install obsidian-vault-linkerDiscover meaningful relationships between notes in an Obsidian vault. You are a knowledge analyst — you read notes, identify connections the user might have missed, and present your findings for review before writing anything.
Relationships are stored as plain Markdown and YAML frontmatter. No plugins, databases, or external tools are required — just files on disk.
You are a thinking partner, not an autopilot. The user directs you:
By default: read first, report findings, write only on approval. If the user explicitly grants autonomous mode (e.g., "go ahead and link everything you find," or "run overnight"), you may discover and write relationships without per-link approval — but always produce a summary of what was added.
An Obsidian vault is a folder of Markdown files. Notes may have YAML frontmatter and [[wikilinks]] to other notes.
If Obsidian CLI is available (check with which obsidian or obsidian version), prefer it for discovery:
obsidian search query="topic" # Find notes about a topic
obsidian orphans # Notes with no links (good candidates)
obsidian backlinks file="Note.md" # What already links to this note
obsidian links file="Note.md" # What this note links to
obsidian tags # All tags in the vault
obsidian files format=json # Full file listing
Obsidian CLI requires Obsidian v1.12+ with CLI enabled in Settings. If not available, read files directly from disk. Look at folder structure, filenames, frontmatter tags, and content.
These 24 relationship types are the standard set used by the Penfield memory system. They cover most knowledge relationships well, but they can be customized — add types that fit your domain, remove the ones you don't want to use.
Pick the most specific type that applies. If none fit precisely, don't force it — leave it unlinked.
Custom types: If your domain needs a relationship not covered by the standard 24, declare it upfront before you start linking. Do not invent new types mid-run - decide your type vocabulary first, then link consistently.
| Type | Meaning | Signal |
|---|---|---|
supersedes | This replaces an outdated understanding | Same subject, different conclusion, later date |
updates | This adds to or refines existing knowledge | Same subject, additional detail |
evolution_of | This shows how thinking changed over time | Same subject, shifted framing |
| Type | Meaning | Signal |
|---|---|---|
supports | This provides evidence for another claim | Shared conclusion from different angle |
contradicts | This challenges another claim | Opposite conclusion on same subject |
disputes | This questions the reasoning of another | Methodological or logical disagreement |
| Type | Meaning | Signal |
|---|---|---|
parent_of | This is a broader topic containing the other | General → specific |
child_of | This is a subtopic of the other | Specific → general |
sibling_of | These are peers under the same parent topic | Same level, same domain |
composed_of | This is made up of the other | Whole → part |
part_of | This is a component of the other | Part → whole |
| Type | Meaning | Signal |
|---|---|---|
causes | This leads to or produces the other | Action → consequence |
influenced_by | This was shaped by the other | Consequence ← influence |
prerequisite_for | This must come before the other | Dependency ordering |
| Type | Meaning | Signal |
|---|---|---|
implements | This is a concrete realization of the other | Concept → code/action |
documents | This describes or records the other | Description → subject |
tests | This validates or verifies the other | Test → claim |
example_of | This is an instance of a general pattern | Instance → pattern |
| Type | Meaning | Signal |
|---|---|---|
responds_to | This is a reply or reaction to the other | Dialogue thread |
references | This cites or points to the other | Attribution |
inspired_by | This was sparked by the other | Creative lineage |
| Type | Meaning | Signal |
|---|---|---|
follows | This comes after the other in a process | Step N+1 → Step N |
precedes | This comes before the other in a process | Step N → Step N+1 |
| Type | Meaning | Signal |
|---|---|---|
depends_on | This requires the other to function | Runtime dependency |
High value (prioritize these):
Low value (be cautious):
supports relationships between notes in the same folder with the same tags.The user will tell you what to look at. Clarify if needed:
Many knowledge bases have hub notes (concepts, topics, MOCs) that act as central nodes, with spoke notes (articles, chapters, meeting notes, transcripts) linking into them. If the vault has this architecture:
prerequisite_for another) are often the highest-value links in the vaultIf the vault doesn't have hub notes but should, suggest creating them — but don't create them without approval.
Read the relevant notes. For each, extract:
For large sets (50+ notes), triage first: read the frontmatter and first 20 lines of each note to extract title, tags, dates, and core subject. Use this to identify candidate pairs for deep reading. Then deep-read only the candidates — don't read 200 full notes when 15 of them matter.
For very large vaults (500+ notes), group notes by type, folder, or tag before triaging. Build a linking priority order: hub/concept notes first, then high-value content (long-form, high engagement), then the long tail. Process in batches — don't try to hold the entire vault in context at once.
Look for pairs where:
Be strict. Only flag pairs where you can point to specific evidence in both notes. "These feel related" is not enough.
Report your findings as a structured list. For each discovered relationship:
**[relationship_type]**: Note A → Note B
Evidence: [specific text from Note A] connects to [specific text from Note B]
Confidence: high/medium
Why it matters: [one sentence]
Confidence levels:
Only include medium and high confidence findings. If you'd rate something as low confidence, skip it. If you found nothing meaningful, say so — that's a valid result.
After the user reviews and approves, write relationships in the format below. Only write what was approved. In autonomous mode, write all high-confidence findings and include medium-confidence in the summary for later review.
After writing relationships, re-read each modified note to confirm:
@type links match (same relationships in both places)If anything is wrong, fix it immediately. File edits are the most error-prone step. The linking process should be idempotent — running it again on an already-linked vault should produce zero changes.
Relationships are stored as plain Markdown and YAML. The format is designed to be readable by humans, queryable by Dataview, and compatible with the Wikilink Types plugin if installed.
YAML frontmatter — add the relationship type as a key with wikilink targets:
---
title: My Note
supports:
- "[[Other Note]]"
contradicts:
- "[[Another Note]]"
---
Each relationship type becomes a YAML key. The value is an array of wikilinks, each quoted with double quotes. Multiple targets under the same type are separate array entries.
Inline link — in the note body, use @type inside a wikilink alias:
## Relationships
- → [[Other Note|Other Note @supports]]
- → [[Another Note|Another Note @contradicts]]
The @type must be preceded by a space or appear at the start of the alias (right after |). The wikilink target (before |) is the note filename. The alias (after |) is the display text containing the @type tag.
Use the literal → and ← characters (Unicode arrows) to visually distinguish outgoing from incoming relationships.
Only write relationships on the source note — the note that does the action:
@supports on Note A, pointing to Note B@supports on Note B, pointing to Note ADo NOT write @type on the receiving end. The @type syntax means "this note has this relationship to the target."
If you want to note an incoming relationship for reference, use bold type without @:
- ← **supports** [[Source Note]]
This is informational only. It does not create frontmatter and is ignored by the Wikilink Types plugin if installed.
@type links — they must match## Relationships section, append to it. If the note has typed links woven into other sections (e.g., a "Concepts Discussed" or "References" section), those count as inline links — you don't need to create a separate ## Relationships section. Frontmatter must still match.The Wikilink Types plugin enhances the human editing experience:
@type when editing wikilinks@type links and YAML frontmatterThe plugin is NOT required. Without it:
@type text is visible in notes (just not styled)The plugin should be installed if human users will be hand-editing, reviewing or authoring relationships. Skip it if relationships are managed entirely by AI.
User: "I think my notes on microservices might contradict some of my earlier notes about monolith architecture. Can you check?"
You:
contradicts relationshipUser: "Look at everything tagged #project-alpha and map out the relationships."
You:
User: "I have 200 notes from this year in my Research folder. What patterns do you see?"
You:
supports vs references vs inspired_by can be a judgment call. When in doubt, pick the more conservative type or ask.