Sync semantic links
Skill yixin0829/semantic-obsidian/skills/sync-semantic-links
Validate and sync bidirectional semantic links in YAML frontmatter. Ensures RELATED_TO links are mutual between notes, and PRIOR/NEXT links are properly reversed. Use when checking link consistency, fixing broken bidirectional relationships, or maintaining Zettelkasten semantic properties.From its SKILL.md
npx -y skills add yixin0829/semantic-obsidian --skill sync-semantic-linksAssembled 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.
SKILL.md
3.7 KB, as published. Nobody here has run it
Sync Semantic Links
Validate and synchronize semantic relationship properties (PRIOR, NEXT, RELATED_TO) in Obsidian vault frontmatter.
Semantic Link Types
Bidirectional Properties
Properties where both notes should reference each other symmetrically:
| Property | Description |
|---|---|
RELATED_TO | Mutual relationship - if A links to B, B should link to A |
Reversed Properties
Property pairs where the relationship is directional but reciprocal:
| Source Property | Target Property | Description |
|---|---|---|
NEXT | PRIOR | If A has B in NEXT, B should have A in PRIOR |
PRIOR | NEXT | If A has B in PRIOR, B should have A in NEXT |
Instructions
Use the Python helper script at scripts/sync_semantic_links.py:
uv run --with pyyaml scripts/sync_semantic_links.py <command> [args]
Helper Script Commands
# Validate all semantic links in a directory (dry-run, no changes)
uv run --with pyyaml scripts/sync_semantic_links.py validate <directory>
# Sync/fix all broken semantic links in a directory
uv run --with pyyaml scripts/sync_semantic_links.py sync <directory>
# Check a single file's semantic links
uv run --with pyyaml scripts/sync_semantic_links.py check <file_path>
# Fix a single file's semantic links (updates linked notes)
uv run --with pyyaml scripts/sync_semantic_links.py fix <file_path>
Examples
Validate all SlipBox notes
uv run --with pyyaml scripts/sync_semantic_links.py validate "02-SlipBox"
Fix broken links across the vault
uv run --with pyyaml scripts/sync_semantic_links.py sync "02-SlipBox"
Check single note relationships
uv run --with pyyaml scripts/sync_semantic_links.py check "02-SlipBox/Knowledge Graph.md"
Link Format Convention
Links in frontmatter use multi-line YAML array format with quoted wikilinks:
RELATED_TO:
- "[[Note A]]"
- "[[Note B]]"
PRIOR:
- "[[Previous Note]]"
NEXT:
- "[[Following Note]]"
Validation Rules
-
Format Normalization:
- Comma-separated wikilinks like
'[[A]], [[B]], [[C]]'are automatically converted to multi-line YAML array format - This normalization happens before semantic link validation
- Comma-separated wikilinks like
-
RELATED_TO (bidirectional):
- If
Note Ahas[[Note B]]in RELATED_TO - Then
Note Bmust have[[Note A]]in RELATED_TO - If missing, add
- "[[Note A]]"to Note B's RELATED_TO
- If
-
PRIOR/NEXT (reversed):
- If
Note Ahas[[Note B]]in NEXT - Then
Note Bmust have[[Note A]]in PRIOR - If missing, add
- "[[Note A]]"to Note B's PRIOR
- If
-
Placeholder Links:
- Wikilinks to notes that don't exist yet are silently skipped
- These are treated as intentional placeholders for future notes
-
Note Resolution:
- Wikilinks are resolved by filename (without path)
-
Excluded Folders:
- Notes inside
.trashare excluded from scanning and validation — these are Obsidian-deleted notes and no longer relevant
- Notes inside
Output Format
The script outputs JSON with validation results:
{
"total_files": 100,
"files_with_issues": 5,
"issues": [
{
"source": "Note A.md",
"target": "Note B.md",
"type": "missing_backlink",
"property": "RELATED_TO",
"action": "add [[Note A]] to Note B's RELATED_TO"
}
],
"fixed": 5
}