Markdown Linter
Spot trailing whitespace, long lines and bad heading order in Markdown.
Overview
Paste Markdown and the linter flags the common issues - trailing whitespace, lines over 120 characters, heading levels that skip (# then ###), missing blank lines around headings or fenced code, and other small things that make rendered output look uneven.
It's for technical writers, documentation maintainers, and developers shipping READMEs or contributor guides. Reach for it before a docs PR, when normalising a wiki migration, or when an auto-generated changelog needs a tidy pass before publication.
How it works
The rule set draws on markdownlint (the de facto standard for Markdown linting) and CommonMark spec conformance - the canonical Markdown grammar that GitHub, GitLab, and most static site generators have adopted as their baseline. Rules are tagged by category: whitespace, headings, lists, links, code blocks.
Findings include line numbers and rule names so the output can plug into a CI step or PR-comment workflow. The lint is non-destructive - it reports, doesn't rewrite.
Examples
- Trailing whitespace:
This line has trailing spaces. ← warning: trailing whitespace at line 3 - Heading level skip:
# Title ### Subsection <!-- skips ## --> - Missing blank line:
Some prose. ## Heading <!-- needs blank line before --> - Long line:
warning: line 17 is 142 characters (max 120)
FAQ
Does it follow GitHub Flavoured Markdown?
GFM extensions (tables, task lists, strikethrough, fenced code) are recognised. The linter treats them as valid syntax even though they're not in pure CommonMark.
Can I disable a rule per-file?
You can ignore findings by rule ID in your CI script or wrapper. The linter itself reports everything; the suppression happens downstream.
Should I wrap long lines?
Markdown collapses single newlines, so wrapping is a source-readability choice - both wrapped and one-paragraph-per-line styles render identically. The "max line length" rule is informational.
Does it check link validity?
No - it only checks syntax. Use a separate link checker for HEAD-request-based dead-link detection.