Skip to content
Back to skills

2502 Link Checker 5590f161

ASecurity

Validate external URLs in Markdown notes using curl-based checking and parallel Haiku agents to detect dead links, redirects, and timeouts

  • 9 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 11, 2026
businessgobashapi

Works with

  • cli
  • api

Security analysis

A100/100

Scanned October 11, 2026

npx -y skills add tools-only/X-Skills --skill 2502-link-checker_5590f161 --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of 2502 Link Checker 5590f161?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for 2502 Link Checker 5590f161
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tools-only-2502-link-checker-5590f161/badge)](https://www.skillsdirectory.com/skills/tools-only-2502-link-checker-5590f161)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

SKILL.md
---
description: Validate external URLs in Markdown notes using curl-based checking and parallel Haiku agents to detect dead links, redirects, and timeouts
model: haiku
---

# /link-checker

Validate external URLs (HTTP/HTTPS) found in Markdown notes. Uses curl for reliable bulk URL validation and parallel Haiku agents to check batches of 10-15 URLs simultaneously, detecting dead links, redirects, and timeouts.

## When to Use This Skill

- Periodic maintenance to find dead external links
- Validating reference notes with URLs
- Checking links before publishing or sharing content
- Post-migration validation of external references
- Quarterly vault health reviews

## Usage

```
/link-checker [--scope path/to/folder] [--timeout 10] [--include-redirects] [--fix] [--update]
```

### Parameters

| Parameter             | Description                                              | Required |
|-----------------------|----------------------------------------------------------|----------|
| `--scope`             | Folder to scan (default: entire vault)                   | No       |
| `--timeout`           | Timeout per URL in seconds (default: 10)                 | No       |
| `--include-redirects` | Report permanent redirects as issues (default: no)       | No       |
| `--fix`               | Update frontmatter with `linkStatus` and `lastChecked`   | No       |
| `--update`            | Offer to update URLs that have permanently redirected    | No       |

## Instructions

### Phase 1: Extract External URLs

1. **Scan Markdown files** in scope
2. **Extract URLs** matching patterns:
   - `[text](https://...)` -- Standard Markdown links
   - `url: "https://..."` -- Frontmatter URL fields
   - Bare URLs in text (https://...)
3. **Deduplicate** -- Same URL referenced from multiple files should only be checked once
4. **Build URL-to-files map** -- Track which files reference each URL
5. **Divide into batches** of 10-15 URLs per agent

### Phase 2: Batch URL Validation -- Agent Team (Parallel Haiku Agents)

Use the Batch Processing pattern. Launch N parallel agents.

**Agent 1-N: URL Checker** (Haiku)
Task: Validate assigned batch of URLs

For each URL, use the curl-based validation script via the Bash tool:

```bash
#!/bin/bash
# URL validation script -- run via Bash tool for each URL

URL="$1"
TIMEOUT="${2:-10}"

# Follow redirects, capture final status code
STATUS=$(curl -I -L -s -o /dev/null -w "%{http_code}" --max-time $TIMEOUT "$URL" 2>/dev/null)

if [ -z "$STATUS" ] || [ "$STATUS" = "000" ]; then
  echo "error:timeout"
else
  # Also capture redirect target if applicable
  REDIRECT=$(curl -I -L -s -o /dev/null -w "%{url_effective}" --max-time $TIMEOUT "$URL" 2>/dev/null)
  echo "status:$STATUS|redirect:$REDIRECT"
fi
```

**Classify each result:**

| HTTP Status | Classification | Action                            |
|-------------|----------------|-----------------------------------|
| 200-299     | `active`       | No action needed                  |
| 301, 308    | `redirected`   | Note new URL, flag for review     |
| 302, 307    | `redirected`   | Temporary redirect, note for info |
| 403         | `error`        | Forbidden -- may be access-restricted, not necessarily dead |
| 404, 410    | `dead`         | Confirmed dead link               |
| 500-599     | `error`        | Server error -- may be temporary  |
| 000/timeout | `error`        | Unreachable -- retry once after 2s before classifying |

For failed URLs (error or dead), attempt one retry after 2 seconds before finalising the classification.

Return: List of `{ url, status, classification, redirectUrl, error }` per URL

### Phase 3: Synthesis and Cross-Reference Checking

1. **Categorise results:**
   - **Active** (200-299) -- Working fine
   - **Redirected** (301/302/307/308) -- URL has moved
   - **Dead** (404, 410, DNS failure) -- Definitely dead
   - **Error** (timeout, 403, 5xx) -- May be temporary
2. **Map broken URLs to source files**
3. **Cross-reference dead links** -- For each dead or errored link, check which other notes reference it:

```bash
# Find all notes that reference a dead link's note title
grep -rl "Reference - Old API Guide" *.md Meetings/ Projects/ ADRs/ Tasks/
```

This identifies notes that depend on the dead reference, so they can be updated or the link removed.

4. **Suggest fixes** for broken links (e.g., Wayback Machine URL, updated URL from redirect chain)

### Phase 4: Update Frontmatter (if `--fix`)

When the `--fix` flag is provided, update frontmatter on each checked note with link health metadata:

```yaml
# Frontmatter fields added/updated by --fix
url: https://example.com/page
linkStatus: active | redirected | dead | error
lastChecked: 2026-01-10
redirectUrl: https://new-location.com/page  # Only if redirected
```

**Field definitions:**

| Field         | Type   | Values                                | Description                          |
|---------------|--------|---------------------------------------|--------------------------------------|
| `linkStatus`  | string | `active`, `redirected`, `dead`, `error` | Current health of the external URL |
| `lastChecked` | date   | `YYYY-MM-DD`                          | Date the URL was last validated      |
| `redirectUrl` | string | URL                                   | Final destination if URL redirects   |

**Rules for frontmatter updates:**
- Only update notes that have a `url` field in frontmatter
- Set `lastChecked` to today's date for all checked URLs
- Set `linkStatus` based on the classification from Phase 2
- Add `redirectUrl` only when status is `redirected`; remove it if status changes to `active`
- Use the Edit tool to modify frontmatter in-place (do not rewrite the entire file)

### Phase 5: Update Redirected URLs (if `--update`)

When the `--update` flag is provided, offer to replace redirected URLs with their final destination:

1. List all redirected URLs with their original and final URLs
2. For each redirected URL:
   - Show the original URL and the redirect target
   - Update the `url` field in frontmatter to the redirect target
   - Set `linkStatus` to `active`
   - Remove `redirectUrl` (no longer needed)
3. Confirm each update with the user before applying

**Note:** `--update` implies `--fix` behaviour (frontmatter is updated regardless).

## Output Format

```markdown
# External Link Check Report

**Date:** YYYY-MM-DD | **Scope:** <scope> | **URLs Checked:** X

## Summary

| Status       | Count | Percentage |
|--------------|-------|------------|
| Active       | X     | X%         |
| Redirected   | X     | X%         |
| Dead         | X     | X%         |
| Error        | X     | X%         |
| **Total**    | **X** | **100%**   |

## Dead Links (X found)

| File | URL | Status | Referenced By | Recommendation |
|------|-----|--------|---------------|----------------|
| `Reference - Old API Guide.md` | `https://example.com/old-page` | 404 | None | Archive candidate |
| `Reference - Deprecated Tool.md` | `https://dead-site.com/docs` | 410 | `Concept - Patterns.md`, `ADR - Tool Selection.md` | Review referencing notes |

## Error Links (X found)

| File | URL | Status | Referenced By |
|------|-----|--------|---------------|
| `Reference - Slow API.md` | `https://slow-site.com/api` | Timeout | `System - Gateway.md` |

## Redirected Links (X found)

| File | Original URL | Redirects To | Referenced By |
|------|--------------|--------------|---------------|
| `Reference - Cloud Guide.md` | `https://old.example.com/docs` | `https://new.example.com/docs` | `Concept - Cloud Strategy.md` |

## Recommendations

1. **Archive:** Reference - Old API Guide.md (dead, unreferenced)
2. **Update URL:** Reference - Cloud Guide.md (redirected)
3. **Review:** Reference - Deprecated Tool.md (dead but referenced by 2 notes)
4. **Recheck:** Reference - Slow API.md (timeout, may be temporary)
```

### Frontmatter Update Summary (when `--fix` is used)

Append to the report:

```markdown
## Frontmatter Updates Applied

| File | linkStatus | lastChecked | redirectUrl |
|------|------------|-------------|-------------|
| `Reference - Old API Guide.md` | dead | 2026-01-10 | -- |
| `Reference - Cloud Guide.md` | redirected | 2026-01-10 | `https://new.example.com/docs` |
| `Reference - Active Page.md` | active | 2026-01-10 | -- |
```

## Examples

### Example 1: Full Vault Check

```
/link-checker
```

### Example 2: Reference Notes Only

```
/link-checker --scope Reference*
```

### Example 3: Check and Update Frontmatter

```
/link-checker --fix
```

### Example 4: Check, Fix, and Update Redirects

```
/link-checker --fix --update
```

### Example 5: Custom Timeout with Redirect Reporting

```
/link-checker --include-redirects --timeout 15
```

## Notes

- Uses curl for URL validation (more reliable than HTTP client libraries for bulk checking)
- Uses parallel Haiku agents for batch processing (faster for large numbers of links)
- Respects rate limits -- does not hammer servers
- Some sites block curl HEAD requests -- the agent should retry with GET if HEAD returns 403/405
- Corporate firewalls or VPNs may affect results (run from an appropriate network)
- Cross-reference checking identifies downstream impact of dead links
- Run quarterly as part of vault maintenance, or before major vault reviews

---

**Invoke with:** `/link-checker` to validate all external URLs in your vault

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.