Rules are YAML—no plugin API, no compile step
Extensible
Every style guide has a rule no linter shipped with. Vale's answer is that rules are just files—a few lines of YAML in a directory, with no plugin API to learn, nothing to compile, and no release to wait for. Twelve extension points cover the shapes those rules take.
Extension point referenceA rule is a file
Styles are directories of YAML. Vale finds them through your configuration, and the rule's name in a report is just its path: directory, then filename.
Twelve extension points
Each one takes the same base keys—message, level, scope, link—and adds the few that describe its own shape. Pick one to see a rule you could run today.
Flag anything that matches
The workhorse. A list of tokens—literal or regular expressions—that should not appear.
extends: existence message: "Consider removing '%s'" level: warning ignorecase: true tokens: - actually - basically - essentially - clearly
What the rules are built on
The pieces a rule reaches for are not Vale's own inventions. Each is a project you can read, and each brings capabilities a hand-rolled matcher would not have.
regexp2
A backtracking engine, so patterns can use lookahead, lookbehind, and backreferences—all
of which Go's standard regexp rejects outright.
prose
Sentence segmentation and part-of-speech tagging. It is what lets a sequence rule match
on grammar rather than on words.
Hunspell
The dictionary format behind LibreOffice and Firefox, so any language with a Hunspell dictionary already has a Vale spell-checker.
Tengo
A small embedded language for the rules that need real logic—compiled once when the rule loads, then cloned per block.
Rules can carry their fix
An alert that only says what's wrong makes the reader do the work twice. Attach an action and the fix travels with the alert—into the CLI, and into any editor speaking the language server protocol.
replace A fixed suggestion you already know—the default for substitutions.
suggest Computed at alert time, like spelling candidates for a misspelling.
remove Delete the match outright.
edit Transform the match: trim, truncate, split, or run a regular expression.
Write it, then hand it around
A style is a directory, so sharing one is packaging a directory. Vale fetches packages by name, resolves what they depend on, and keeps them out of your repository.