From semantic-skills
Deduplicate wikilinks in any YAML frontmatter property that contains multi-line wikilink arrays. Removes case-insensitive duplicates like [[ml]] and [[ML]], keeping the version with more capital letters. Use when cleaning up frontmatter, fixing duplicate links, or normalizing link casing.
npx claudepluginhub yixin0829/semantic-obsidian --plugin semantic-skillsThis skill is limited to using the following tools:
Deduplicate wikilinks in YAML frontmatter properties using case-insensitive comparison.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Generates original PNG/PDF visual art via design philosophy manifestos for posters, graphics, and static designs on user request.
Share bugs, ideas, or general feedback.
Deduplicate wikilinks in YAML frontmatter properties using case-insensitive comparison.
In Obsidian, users may accidentally add duplicate wikilinks to frontmatter properties that differ only in case:
RELATED_TO:
- "[[ml]]"
- "[[ML]]"
- "[[Machine Learning]]"
These duplicates clutter the frontmatter and can cause issues with queries and navigation.
This skill identifies and removes case-insensitive duplicate wikilinks, keeping the version with the most capital letters (as it's typically the more "canonical" form):
[[ml]], [[ML]], [[Ml]][[ML]] (most capitals wins)Use the Python helper script at .claude/skills/dedupe-frontmatter-links/scripts/dedupe_links.py:
uv run --with pyyaml .claude/skills/dedupe-frontmatter-links/scripts/dedupe_links.py <command> [args]
# Scan directory for duplicate links (dry-run, shows what would be changed)
uv run --with pyyaml .claude/skills/dedupe-frontmatter-links/scripts/dedupe_links.py scan <directory>
# Fix all duplicate links in directory
uv run --with pyyaml .claude/skills/dedupe-frontmatter-links/scripts/dedupe_links.py fix <directory>
# Check single file for duplicate links (dry-run)
uv run --with pyyaml .claude/skills/dedupe-frontmatter-links/scripts/dedupe_links.py check <file_path>
# Deduplicate links in single file
uv run --with pyyaml .claude/skills/dedupe-frontmatter-links/scripts/dedupe_links.py dedupe <file_path>
uv run --with pyyaml .claude/skills/dedupe-frontmatter-links/scripts/dedupe_links.py scan "02-SlipBox"
uv run --with pyyaml .claude/skills/dedupe-frontmatter-links/scripts/dedupe_links.py fix "."
uv run --with pyyaml .claude/skills/dedupe-frontmatter-links/scripts/dedupe_links.py check "02-SlipBox/Machine Learning.md"
[[ml]] and [[ML]] are considered duplicatesThe script outputs JSON with scan/fix results:
{
"total_files_scanned": 100,
"files_with_duplicates": 3,
"total_duplicates_found": 7,
"files": [
{
"file": "02-SlipBox/Machine Learning.md",
"properties": {
"RELATED_TO": {
"before": ["[[ml]]", "[[ML]]", "[[deep learning]]"],
"after": ["[[ML]]", "[[deep learning]]"],
"removed": ["[[ml]]"]
}
}
}
]
}
.claude, .obsidian, .trash, .git, node_modulesscan first to preview changes before using fix[[ML|machine learning]]) are compared by their target only[[Note#Section]]) compare only the note name portion