Markdown Link Checker
Extract and validate all links in Markdown — format checks, anchor references, duplicate detection
Statistics
Protocol distribution:
Unique domains (4):
https://docs.example.com/guideText: official documentation
http://npmjs.com/package/my-toolText: npm
https://example.comText: homepage
./contactText: contact page
https://example.com/images/hero.pngText: Hero image
#installationText: configuration section
example.com/api-referenceText: API reference
https://github.com/example/my-toolText: GitHub repository
https://docs.example.com/guideText: Official documentation
Text: Empty link
#nonexistent-headingText: Broken anchor
https://docs.example.comText: docs
Your README has 40 links — documentation pages, API references, badge URLs, anchor links to sections. After a refactor, three of those links point to renamed files, one has a typo in the protocol (htps://), and two anchor links reference headings that no longer exist. You need to scan all links at once and find the broken ones before pushing.
Why This Checker (Not markdown-link-check CLI)
The markdown-link-check npm package makes HTTP requests to verify each URL — slow, rate-limited, and requires Node.js. This tool does format validation only — it extracts all links, detects missing protocols, empty hrefs, broken anchor references, duplicate links, and relative vs absolute URL issues. No HTTP requests are made, so it’s instant and works offline. Everything runs in your browser.
What Is a Markdown Link Checker?
A Markdown link checker scans Markdown source text for hyperlinks and validates their format. This tool extracts every link — inline links, image links, reference definitions, and bare URLs — then flags common issues such as missing protocols, empty hrefs, broken anchor references, and duplicate URLs.
Unlike server-side link checkers that send HTTP requests to verify each URL, this tool performs format-only validation entirely in your browser. No requests are made, no data leaves your device, and you can safely check internal documentation, drafts, or private content.
How to Use This Tool
- Paste Markdown — paste any Markdown content into the input area, or click Load sample to see a pre-filled example.
- Review the summary — the four stat cards show how many links are valid, have warnings, or have errors.
- Check statistics — see unique URL count, unique domain count, and protocol distribution.
- Filter results — use the filter buttons (All / Valid / Warnings / Errors) to focus on specific link categories.
- Expand issues — click the ”▼ N issues” button on any link row to see the specific issue codes and explanations.
- Fix and re-paste — correct issues in your source document and paste again to re-check.
All processing runs in your browser. Nothing is sent to a server.
Detected Link Types
| Source type | Syntax | Example |
|---|---|---|
link (inline) | [text](url) | [GitHub](https://github.com) |
image |  |  |
ref (reference definition) | [label]: url | [docs]: https://docs.example.com |
bare | Raw https:// in text | https://example.com |
Not extracted (intentional):
- Links inside fenced code blocks (
``` ```) - Links inside inline code spans (
`url`) - Reference link usages like
[text][ref]— the URL is captured from the reference definition
Issue Codes
Errors (must fix)
| Code | Meaning | Example |
|---|---|---|
EMPTY_URL | The link URL is blank | [Click here]() |
MISSING_PROTOCOL | Looks like a URL but has no http:// or https:// | example.com/page |
MALFORMED_URL | Cannot be parsed as a valid URL | https://exa mple.com |
Warnings (review recommended)
| Code | Meaning | When to fix |
|---|---|---|
HTTP_PROTOCOL | Uses http:// instead of https:// | Always — upgrade to HTTPS |
RELATIVE_URL | URL is relative, e.g. ./page or ../docs | Check if the rendering context supports relative links |
BROKEN_ANCHOR | #fragment doesn’t match any heading in the document | Fix the anchor or add the missing heading |
EMPTY_ANCHOR | URL is just # with no fragment | Add a target heading or remove the link |
DUPLICATE_URL | The same URL appears more than once | Consolidate or confirm intentional repetition |
Anchor Reference Validation
When a link uses a fragment-only URL such as [see usage](#usage), this tool checks whether the document contains a heading that matches the anchor.
How headings are slugified (following GitHub Flavored Markdown rules):
- Convert to lowercase
- Replace spaces with hyphens (
-) - Remove characters that are not alphanumeric or hyphens
- Collapse multiple consecutive hyphens
Examples:
| Heading | Anchor slug |
|---|---|
## Getting Started | #getting-started |
### API Reference | #api-reference |
## What's New? | #whats-new |
## C++ Setup | #c-setup |
If #getting-started appears as a link target but the document has ## Getting Started Guide, the anchor won’t match and you’ll see a BROKEN_ANCHOR warning.
Link Statistics Explained
After checking, the Statistics panel shows:
- Total links — all links extracted from the document, including duplicates
- Unique URLs — distinct URL strings (deduplication is case-sensitive)
- Unique domains — distinct hostnames across all parseable
http://andhttps://URLs - Protocol distribution — count of links by scheme (
https,http,mailto,relative,anchor, etc.) - Domain list — all unique hostnames found, useful for auditing external dependencies
Common Markdown Link Issues
Missing protocol
A frequent mistake is writing a URL without its scheme:
<!-- Wrong — will be treated as a relative path -->
[Visit us](www.example.com)
<!-- Correct -->
[Visit us](https://www.example.com)
Anchor mismatch after heading change
When you rename a heading, existing anchor links break silently:
## Old Heading Name
<!-- This still works -->
[see above](#old-heading-name)
After renaming to ## New Section:
## New Section
<!-- Now broken — slug changed to #new-section -->
[see above](#old-heading-name)
Use this tool to catch such regressions after heading edits.
Reference definition typos
Reference-style links are easy to mis-define:
[Visit docs][docs-link]
<!-- Typo: "doc-link" won't match "docs-link" -->
[doc-link]: https://docs.example.com
The tool extracts reference definitions (the [label]: url lines) as separate link entries so you can audit the URLs they point to.
Duplicate links
See the [installation guide](https://docs.example.com/install).
...
For setup, follow the [installation guide](https://docs.example.com/install).
Duplicate links are flagged with a DUPLICATE_URL warning. This is not always an error — sometimes repetition is intentional — but it’s worth reviewing.
What This Tool Does Not Check
- HTTP reachability — the tool does not send requests to verify that URLs return a 200 OK response. Use a server-side checker (e.g.,
markdown-link-checknpm package) for live validation. - Cross-file anchor references — anchor validation only covers headings within the pasted Markdown. Links to anchors in other files are treated as relative URLs.
- HTML anchors —
<a id="anchor">and<a name="anchor">elements are not currently extracted as anchor targets. - Footnote links — Pandoc-style footnotes (
[^1]) are not extracted. - Wiki-style links —
[[WikiLink]]syntax is not supported.
Frequently Asked Questions
Q: Does this tool make HTTP requests? A: No. All validation is purely based on URL format and document structure. No requests are sent to any URL. This means you can safely check drafts, internal documentation, or confidential content.
Q: Why is my relative link showing a warning?
A: Relative URLs (like ./page or ../docs) are valid in many contexts but can break when Markdown is rendered on a platform with a different base path (e.g., GitHub, npm README, or a docs site with path prefixes). The warning is advisory — if you know your rendering environment handles relative links correctly, you can ignore it.
Q: My link has a title in parentheses — is that supported?
A: Yes. The tool correctly strips optional titles from URLs: [text](https://example.com "My title") extracts https://example.com as the URL and ignores the title string.
Q: Why aren’t links in my code blocks extracted?
A: Links inside fenced code blocks ( ``` ```) and inline code spans ( `` `` “) are intentionally ignored. Code examples often contain placeholder or example URLs that are not meant to be real links.
Q: Can I check a large Markdown file? A: Yes. The tool has no size limit. Processing happens in your browser using JavaScript, so performance depends on your device. Documents up to several hundred kilobytes will process near-instantly.
Q: Is my Markdown content stored anywhere? A: No. The content is only held in memory in your browser tab and is never sent to a server. Closing the tab clears it entirely.