[Go to site: main page, start]

Vale CMS Need more than a rule playground? Explore
Open source · MIT 5.8K

Vale is a linter for prose

A command-line tool that brings code-like linting to your writing. Enforce a consistent editorial style across every doc, in any format—entirely offline.

bash — vale
$ vale sync
SUCCESS Synced 2 package(s) to 'styles'.
$ vale docs/
docs/configure.md
3:7 suggestion Consider using 'use' instead of 'utilize'. Microsoft.Wordiness
3:44 suggestion 'are loaded' looks like passive voice. Microsoft.Passive
9:12 error Use 'Vale CLI' instead of 'Vale cli'. Docs.Terms
docs/install.md
3:40 warning Use 'select' instead of the input-specific verb 'Click'. Microsoft.UIVerbs
4:28 error Did you really mean 'existant'? Vale.Spelling
2 errors, 1 warning and 2 suggestions in 2 files.

Read their configs

Every team here publishes something you can open — the .vale.ini they run, or the page they wrote about running it.

Why Vale

Most tools see text. Vale sees a document.

A heading, a code block, a comment, and a link URL are not the same thing—and a rule that can't tell them apart is a rule you end up switching off.

Markup-aware

Parses your markup instead of guessing at it

Markdown, AsciiDoc, reStructuredText, MDX, MyST, Quarto, Typst, HTML, XML, DITA, Org, and QDoc each go through a real parser. Rules can target headings, lists, or table cells—and code spans, URLs, and fenced blocks are skipped before a rule ever runs.

How scopes work
# Installation
You can **utilize** Vale to lint [prose](/docs)—it ignores syntax like `code` and URLs.
Vale is availible for macOS, Windows, and Linux.
suggestion Consider using 'use' instead of 'utilize'.
error Did you really mean 'availible'?
Code-aware

Your comments are documentation too

Vale lifts comments out of more than twenty languages with tree-sitter grammars, so it knows where a comment ends and a marker inside a string literal stays code. The Markdown inside a doc comment is linted as though it were its own file.

Inside the grammar
func Get(id string) (*Record, error) {
// It can utilize the cache when possible.
key := "// not a comment"
}
suggestion Consider using 'use' instead of 'utilize'.
Extensible

Rules are YAML—no plugin API, no compile step

Twelve extension points, from banned terms to readability scores to part-of-speech patterns. Write one in a text editor, drop it in a folder, and share the folder as a package.

All twelve extension points
# styles/Brand/Terms.yml
extends: existence
message: "Avoid '%s'."
level: warning
tokens:
- utilize
- leverage
Fast

One binary, nothing to install alongside it

Written in Go, with no runtime and files linted in parallel. GitLab runs 82 rules across all 2,827 pages of its documentation in under twenty seconds.

What makes it fast
2,827
pages of Markdown
82
rules applied
<20s
start to finish

Private by design

Nothing leaves your machine. No account, no upload, and no training on your writing.

Runs everywhere

macOS, Windows, and Linux. MIT-licensed and maintained in the open.

Style guides included

Microsoft, Google, Red Hat and thirteen more, each installed with one command.

One tool, every app

More than just a command-line interface.

Vale runs where you already write—in your editor, in your notes app, and in CI before anything merges.

Ready to start linting?
Install now.