---
name: Check Links
slug: check-links
category: Quality
description: Check Links scans a vault for broken [[wiki-links]] by extracting link targets and verifying each target file exists. Use it to find link rot after renaming files or periodically maintain a knowledge base.
github: "https://github.com/ballred/obsidian-claude-pkm/tree/main/vault-template/.claude/skills/check-links"
language: Shell
stars: 1826
forks: 124
install: "npx degit https://github.com/ballred/obsidian-claude-pkm/tree/main/vault-template/.claude/skills/check-links ~/.claude/skills/check-links"
installs_to: ~/.claude/skills/check-links
source_path: vault-template/.claude/skills/check-links/SKILL.md
collection_size: 13
category_size: 1354
collection_url: "https://dirskills.com/collections/ballred/obsidian-claude-pkm"
added: 2026-08-18T06:59:34.155Z
last_synced: 2026-08-18T06:59:34.155Z
canonical_url: "https://dirskills.com/skills/check-links"
---

# Check Links

Check Links scans a vault for broken [[wiki-links]] by extracting link targets and verifying each target file exists. Use it to find link rot after renaming files or periodically maintain a knowledge base.

**Install:**

```bash
npx degit https://github.com/ballred/obsidian-claude-pkm/tree/main/vault-template/.claude/skills/check-links ~/.claude/skills/check-links
```

## README

# Check Links Skill

Finds broken `[[wiki-links]]` across your vault by extracting link targets and verifying that each target file exists. Read-only — never modifies files.

## Usage

```
/check-links
```

Or ask:
- "Check for broken links in my vault"
- "Find dead wiki-links"
- "Are there any broken links?"

## How to Execute

### Step 1: Extract all wiki-links

Use **Grep** to find all `[[...]]` patterns in markdown files:

```
Grep:
  pattern: "\\[\\[([^\\]|]+)"
  glob: "*.md"
  output_mode: content
  -n: true
```

This captures the link target (before any `|` alias). Exclude `.claude/` and `.obsidian/` directories from results.

### Step 2: Build unique target list

From the grep results, extract the unique link targets. For each match like `[[My Note]]` or `[[My Note|display text]]`, the target is `My Note`.

Strip:
- Heading anchors: `[[Note#heading]]` → target is `Note`
- Block references: `[[Note^block-id]]` → target is `Note`
- Aliases: `[[Note|alias]]` → target is `Note`

### Step 3: Verify each target exists

For each unique target, use **Glob** to check if a matching file exists:

```
Glob:
  pattern: "**/<target>.md"
```

A link is **broken** if no file matches. A link is **valid** if at least one file matches.

### Step 4: Report results

Group broken links by source file:

```markdown
## Broken Links Report

### Daily Notes/2024-01-15.md
- [[Projet Alpha]] — no matching file found
- [[Old Goal]] — no matching file found

### Projects/Project Beta.md
- [[Meeting Notes Jan]] — no matching file found

---

**Summary:** 3 broken links across 2 files (out of 45 total links checked)
```

### Step 5: Suggest fixes

For each broken link, try to find a close match:

1. Use **Glob** with a partial pattern: `**/*<partial-target>*.md`
2. If a similar filename exists, suggest it:
   ```
   - [[Projet Alpha]] — Did you mean [[Project Alpha]]?
   ```
3. If no close match, just report "no matching file found"

## Edge Cases

- **Embedded images** (`![[image.png]]`) — skip these, they reference attachments
- **External links** (`[text](https://...)`) — skip these, they are not wiki-links
- **Template placeholders** (`[[{{date}}]]`) — skip anything with `{{` in the target
- **Empty links** (`[[]]`) — report as malformed, not broken

## No Broken Links

If all links are valid:

```
✅ All wiki-links verified — no broken links found across X files (Y links checked)
```

## Tips

- Run `/check-links` periodically to catch link rot
- After renaming files, run this to find links that need updating
- Combine with `/search` to find notes that reference deleted content
