Vale CMS Need more than a rule playground? Explore
OPEN SOURCE · MIT · 6.1K STARS

Your style,
our editor.

Vale brings code-like linting to prose. Turn your team’s writing guidelines into checks that run in your editor and alongside your code.

Your rules. Your workflow. Entirely offline.

01Guideline

Writing guide · Terminology

The product is Vale CLI. Don’t write Vale cli or vale-cli.

02Rule

styles/Docs/Terms.yml

extends: substitution
message: "Use '%s' instead of '%s'."
level: error
swap:
  Vale cli: Vale CLI
03Every doc

docs/install.md

  1. # Installation
  2. Vale cli runs on macOS, Windows, and Linux.
error Use 'Vale CLI' instead of 'Vale cli'. Docs.Terms
Five lines of YAML per guideline. Or start from Microsoft, Google, and fourteen other published styles.

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.

01 / Scopes

Parses your markup instead of guessing at it

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.

12 formats, each through its own parser
  • Markdown
  • AsciiDoc
  • reStructuredText
  • MDX
  • MyST
  • Quarto
  • Typst
  • HTML
  • XML
  • DITA
  • Org
  • QDoc
How scopes work
02 / Code

Your comments are documentation too

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.

19 languages, comments lifted out by tree-sitter
  • Go
  • Rust
  • Python
  • Ruby
  • C++
  • C
  • JavaScript
  • TypeScript
  • TSX
  • Java
  • Haskell
  • Julia
  • Lua
  • PHP
  • R
  • QML
  • Protobuf
  • YAML
  • CSS
Inside the grammar
03 / Views

Prose inside files that aren’t prose

An OpenAPI description, a notebook cell, the body of a commit, a docstring: a View says where the prose is in a file that isn’t a document, so Vale lints that and passes over the rest. A rule can target any one part by name.

data, plain text, and source, each through its own engine
  • OpenAPI
  • Jupyter
  • Commit messages
  • Transcripts
  • Docstrings
  • JSON
  • YAML
  • TOML
How Views work
04 / Speed

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.

GitLab's documentation, one run
2,827
pages of Markdown
82
rules applied
<20s
start to finish
What makes it fast

Distribution

Where Vale is downloaded

Seven registries publish a download count, and each counts a different window, so they sit side by side here rather than in one total.

13.4M
downloads to date
GitHub Releases, Docker Hub, conda-forge, Chocolatey · the channels reporting a lifetime total
6.1K
stars on GitHub
vale-cli/vale
63
contributors
across the main repository

Sources: GitHub, Docker Hub, PyPI, npm, conda-forge, Homebrew, Chocolatey, WinGet, Snapcraft, and Repology · updated 2026-08-28

A few lines of config.
A consistent first draft.

Start with an existing style guide. Keep the configuration in your project so everyone runs the same checks.

  1. Install Vale.Choose a package for your operating system.
  2. Pick your styles.Save this as .vale.ini in your project.
  3. Sync, then lint.Download the styles and check your docs.
StylesPath = styles
MinAlertLevel = suggestion
Packages = Microsoft

[*.md]
BasedOnStyles = Vale, Microsoft

$ vale sync

$ vale docs/

Make it your own with a YAML rule
extends: substitution
message: "Use '%s' instead of '%s'."
level: warning
swap:
  utilize: use
Learn to write rules →