Markdown Linter
Check your Markdown for style and formatting errors instantly. Real-time lint results with rule IDs, line numbers, and clickable navigation. Browser-based, no data sent to server.
- Runs in your browser
- Your data never leaves your browser
- Free · No Sign-Up
Scan with WeChat to share this tool
Examples, details and FAQ Worked examples, how it compares with other tools, and answers to common questions.
What Gets Checked
The linter applies the full set of markdownlint rules, including:
- MD001 — Heading levels should only increment by one level at a time
- MD009 — No trailing spaces at end of lines
- MD010 — No hard tabs (use spaces instead)
- MD012 — No multiple consecutive blank lines
- MD022 — Headings should be surrounded by blank lines
- MD025 — Only one top-level heading per document
- MD031 — Fenced code blocks surrounded by blank lines
- MD034 — No bare URLs — use link syntax instead
- MD041 — First line should be a top-level heading
Reading a Result
Each result line has the rule ID, the line number, the rule description, details after a dash and the text in brackets, then the rule alias. This input:
Intro paragraph
## Setup
#### Install
Run `npm install`.
```
npm test
```
with a final line break gives eight results, including:
MD001 L 3 Heading levels should only increment by one level at a time — Expected: h3; Actual: h4:####follows##, so a level was skipped.MD022 L 2 Headings should be surrounded by blank lines — Expected: 1; Actual: 0; Above [## Setup], reported once for the missing blank line above and once below each heading.MD031andMD040on line 5: the code fence needs a blank line before it and a language name such as```sh.MD041 L 1 First line in a file should be a top-level heading [Intro paragraph].
Copy Results copies one line per result in the form L 3 [MD001] Heading levels should only increment by one level at a time — Expected: h3; Actual: h4, which is easy to paste into a review comment.
Turning a Rule Off for One Section
markdownlint reads configuration comments inside the document, and so does this tool. Wrapping a paragraph in
<!-- markdownlint-disable MD013 --> and <!-- markdownlint-enable MD013 --> stops the line-length
report for that part only; <!-- markdownlint-disable-next-line MD034 --> skips one line. Use these when one table or
URL has to break a rule, and keep the rule on for the rest of the file. The comments are invisible in rendered Markdown.
Limitations
- Rule descriptions and details come from markdownlint and are in English on every language version of this page.
- The tool reports problems but does not fix them. markdownlint-cli2 with
--fixcan fix many of them automatically. - One document at a time, with default settings; no
.markdownlint.jsonupload. - markdownlint checks Markdown style. It does not check spelling, broken links outside the document, or whether a renderer such as GitHub shows the file the way you expect; use the Markdown Preview for that.
Privacy
All processing is client-side. Your Markdown content is never uploaded or stored.
Related Tools
- Markdown Preview — Render your Markdown as HTML with live preview
- Markdown Table Generator — Build well-formatted tables visually
Example: A Changelog
Input:
# Changelog
## 1.2.0
### Added
- Export button
## 1.1.0
### Added
* Dark mode
See https://example.com/releases
Results (markdownlint 0.40, default rules, input ending with a line break; without the final line break MD047 is reported as well):
L13 MD004 / ul-style Unordered list style — Expected: dash; Actual: asterisk
L11 MD024 / no-duplicate-heading Multiple headings with the same content
L15 MD034 / no-bare-urls Bare URL used
- MD024 fires because both versions have an “Added” heading. That is the normal layout of a Keep a Changelog file; in your own config,
"MD024": { "siblings_only": true }allows repeated headings under different parents. - MD004 wants one bullet style per document; the first list used
-, so*is flagged. - MD034 asks for
<https://example.com/releases>or a Markdown link instead of a bare URL.
Defaults You Cannot Change Here
The tool runs every rule that markdownlint enables by default, with default settings (see markdownlint rules). There is no configuration panel, so two defaults often produce noise:
- MD013 line length is 80 characters. A 104-character English paragraph line is reported as
Expected: 80; Actual: 104. A long line with no spaces after column 80 is not reported, so long Chinese, Japanese or Korean lines without spaces usually pass. - MD024 flags any repeated heading text in the document, as in the changelog above.
To lint with your own settings, put them in .markdownlint.json and run markdownlint-cli2 locally or in CI:
{
"MD013": { "line_length": 120 },
"MD024": { "siblings_only": true }
}
markdownlint skips YAML front matter at the top of a file, and a title in it counts as the top-level heading for MD041.
FAQ
Is my content sent to a server?
No. All linting happens in your browser using JavaScript. Your Markdown never leaves your machine.
Which rules does the linter check?
It runs markdownlint 0.40 with its default settings: all 53 of its rules, covering heading levels, trailing spaces, blank lines, bare URLs, list style, code fences and more. A few rules, such as MD043 required headings and MD044 proper names, report nothing until they are configured, and this page has no configuration panel.
What does a rule ID like MD001 mean?
Rule IDs follow the markdownlint convention: MD001 means 'heading-increment', MD009 means 'no-trailing-spaces', MD041 means 'first-line-heading', and so on. The rule documentation is in the markdownlint repository (linked above).
Can I click on a result to jump to that line?
Yes. Clicking any lint result scrolls the editor to the offending line and selects it so you can fix it immediately.
How does this differ from the CLI markdownlint tool?
The CLI tool integrates with your build pipeline and can check files on disk. This browser tool is for quick checks while writing or reviewing Markdown without installing anything.