Vale Is a Linter for Prose

Bluestein1 pts0 comments

Vale: Your style, our editor

Toggle Menu

Open source · MIT 5.6K Vale is a linter for prose<br>A command-line tool that brings code-like linting to your writing. Enforce a consistent<br>editorial style across every doc , in any format —entirely offline .<br>Get started Star on GitHub

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

Setting up with an agent? Open in Claude Open in ChatGPT Agent skills<br>Thanks to Claude for Open Source.

Sponsor spotlights<br>These companies support Vale's future — and put it to work in their own products today.

Mintlify Ships Vale as a built-in CI check.<br>Read the story Promptless Runs Vale on every doc its agents write.<br>Read the story<br>See everyone who funds Vale

Read their configs<br>Every team here publishes something you can open — the .vale.ini they run,<br>or the page they wrote about running it.

Writeup<br>The EKS User Guide walks contributors through installing Vale for live style feedback.<br>docs.aws.amazon.com Cloud & infrastructure<br>Repository<br>Runs a packaged PowerShell-Docs style in their Documentarian toolkit.<br>microsoft/Documentarian github.com<br>Discord Public config<br>Vale's built-in rules across the public API documentation.<br>.vale.ini discord/discord-api-docs<br>Writeup<br>A required check in GitLab's documentation testing pipeline.<br>docs.gitlab.com Developer tools<br>Writeup<br>Powers the prose linting rules in the Grafana Writers' Toolkit.<br>grafana.com Data & observability<br>NVIDIA Writeup<br>All NeMo Agent Toolkit documentation is checked with Vale before it merges.<br>docs.nvidia.com Developer tools<br>Public config<br>Enforces style standards across the Docker product docs.<br>.vale.ini docker/docs<br>Writeup<br>Maintains "Vale at Red Hat", a public style package and onboarding guide.<br>redhat-documentation.github.io Open source<br>Writeup<br>Publishes datadog-vale and shifted docs quality left with it.<br>datadoghq.com Data & observability<br>Browse all 90

Why Vale<br>Most tools see text. Vale sees a document.<br>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<br>Twelve formats, each through a real parser rather than a pattern. Rules can target headings, lists, or table cells—and code spans, URLs, and fenced blocks are skipped before a rule ever runs.<br>Markdown<br>AsciiDoc<br>reStructuredText<br>MDX<br>MyST<br>Quarto<br>Typst<br>HTML<br>XML<br>DITA<br>Org<br>QDoc<br>How scopes work<br>Installation.md<br>Markdown parsed before prose rules run

heading paragraph blockquote list link ignored code ignored footnote ignored

#Installation<br>You can **utilize** Vale to lint [prose](/docs)—it ignores<br>syntax like `code` and URLs.<br>>A blockquote can still contain very unique product guidance.<br>-Install the extension before the end result ships.<br>Vale is availible for macOS, Windows, and Linux.<br>```js<br>const message = "This code utilizes a URL";<br>```

[^install]: https://example.com/docs/utilize

Checked<br>headings, prose, quotes, lists

Skipped<br>syntax, links, code, footnotes

suggestion Consider replacing 'utilize', 'very unique', and 'end result'.<br>error Did you really mean 'availible'?

Code-aware Your comments are documentation too<br>Vale lifts comments out of nineteen 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.<br>Go<br>Rust<br>Python<br>Ruby<br>C++<br>JavaScript<br>TypeScript<br>TSX<br>Java<br>Haskell<br>Julia<br>Lua<br>PHP<br>QML<br>Protobuf<br>YAML<br>CSS<br>Inside the grammar<br>person.rs<br>comments extracted with tree-sitter

line comment doc comment markdown string ignored code ignored

/// Creates a person with the given name.<br>///<br>/// # Examples<br>///<br>/// ```<br>/// use doc::Person;<br>/// let person = Person::new("name");<br>/// ```<br>pub fn new(name: &str) -> Person {<br>// Names can utilize any script.<br>let raw = "// not a comment and not prose";

Checked<br>line comments, doc comments, Markdown prose

Skipped<br>syntax, identifiers, strings, fenced code

suggestion Consider using 'use' instead of 'utilize'.

Extensible Rules that read grammar, not just strings<br>Part-of-speech patterns, cross-file relationships, readability formulas, and Tengo scripts sit alongside the token lists—twelve extension points in all. Each is a few lines of YAML in a folder you can hand around as a package.<br>All twelve extension points<br>sequence Matches grammar, not characters<br>extends: sequence<br>message: "Use 'meetup' instead of 'meet up'."<br>level: error<br>tokens:<br>- upos: NOUN<br>pattern: meet<br>- pattern: up Our next meet up is on...

vale docs code prose style open

Related Articles