Markdown Link Monitoring

Catch broken links before your readers do.

go-linkchecker scans markdown content, checks every HTTP or HTTPS URL, and ships a clean report you can use in CI, cron jobs, or weekly content reviews.

Dependencies Zero
Works With Markdown
Email Reports Built In
CI Exit Code 1 on Broken

Why people use it

Most link checkers are too heavy, too generic, or too noisy for markdown-only content repos. go-linkchecker stays narrow and useful.

Scans recursively Walks a markdown directory tree and checks every unique URL it finds.
Handles difficult sites better HEAD falls back to GET, retries once on transient failures, and supports status-code ignores for bot-hostile sites.
Built for automation Use it in CI, cron, or systemd timers. Exit code stays strict so broken links are machine-detectable.
Readable reporting Terminal output stays plain and script-friendly; email reports now include a clean HTML layout for humans.

Quick start

Install from source or use Go directly.

go install github.com/srmdn/go-linkchecker@latest

go-linkchecker ./content/blog

Only want the failures?

go-linkchecker --only-broken ./content/blog

Typical production command

This is the kind of command you would wire into a weekly timer for a content repo.

go-linkchecker \
  --only-broken \
  --concurrency 8 \
  --timeout 15s \
  --ignore-status 401,403 \
  --skip-pattern "localhost|openai\.com|wikipedia\.org" \
  ./content/blog
Skipped links are intentional. Some sites block bots or require auth. You can keep them visible in the report without treating them as broken.

Email reports

SMTP support is built in. Configure it once and send weekly reports directly to your inbox.

export LINKCHECKER_SMTP_HOST=smtp.example.com
export LINKCHECKER_SMTP_PORT=465
export LINKCHECKER_SMTP_USER=user@example.com
export LINKCHECKER_SMTP_PASS=yourpassword
export LINKCHECKER_SMTP_FROM="Link Checker <user@example.com>"
export LINKCHECKER_SMTP_TO=you@example.com

go-linkchecker --only-broken ./content/blog

Set --email-only-broken=false when you want an all-clear email too.

Links

If this is useful, star the repo.

It helps other people find a simple markdown-first link checker without pulling in a large stack.

Star go-linkchecker