Skip to content
100% local

Markdown linter

Find broken links, skipped heading levels and unclosed code blocks in Markdown.

Input
Existing file paths (one per line, optional)
Output

Markdown linter

Paste a Markdown document and this tool reports what's wrong with it, one finding per line, with the exact line number. It always checks for unmatched **bold**, __bold__, ~~strikethrough~~ and `code` markers, unbalanced [ ] link brackets and empty link or image targets, heading levels that skip a level (an H1 directly followed by an H3), and fenced code blocks that open but never close — the kind of syntax slip that renders fine in one Markdown engine and breaks in another.

The options add checks about consistency rather than syntax. Turn on link reference checking to catch a [text][ref] link with no matching [ref]: url definition, and definitions that are defined but never referenced. Duplicate-heading checking flags repeated heading text and more than one top-level heading, which confuses readers and table-of-contents generators alike. List-consistency checking catches a bullet list that switches from - to * partway through, or numbered items that fall out of sequence. You can also require a language on every fenced code block, flag trailing whitespace (a run of exactly two spaces is left alone, since that's a deliberate line break), and cap line length. Paste a list of existing file paths into the second field and local link and image targets get checked against it, so a renamed or deleted file shows up as a broken link before you publish.

The linter handles Windows (CRLF) and Unix (LF) line endings the same way, and checks that would misfire on code content — markers, links, headings, lists, trailing whitespace — are skipped inside fenced code blocks; line-length checking still applies everywhere. The output panel highlights every finding line in red, and the tally above shows lines scanned, issues found and headings counted.

Everything runs locally in your browser: the document you paste and any file paths you add for the link check are never uploaded anywhere. Copy the report, download it as a .txt file, or send it to another tool's input to keep working.

FAQ

Does it fully parse Markdown like a renderer would?
No. It's a line-based heuristic checker built to catch common slips — unmatched markers, broken links, skipped heading levels, unclosed code fences — not a full CommonMark parser, so an unusual construct can occasionally be missed or over-flagged.
Why is a run of two trailing spaces not flagged?
Two trailing spaces is standard Markdown syntax for a hard line break, so it's left alone. A single trailing space or a trailing tab is flagged, since those are almost always accidental.
What counts as a duplicate heading?
Heading text is compared case-insensitively after trimming, so "Setup" and "setup" are treated as the same heading.
How do I check links against real files in my project?
Paste one relative path per line into the second field — the same paths your links point to, like docs/setup.md. Local link and image targets that aren't in that list are flagged; external URLs and #anchors are always skipped.
Is my document uploaded anywhere?
No. The check runs entirely in your browser — your Markdown and any file paths you enter stay on your device.