Need more than a rule playground?

Explore Vale CMS
Why Vale

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 reference

A 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.

styles/
└── Brand/
├── Terms.yml
├── Headings.yml
└── Contractions.yml
# Brand/Terms.yml is Brand.Terms
.vale.ini
StylesPath = styles
MinAlertLevel = suggestion
[*.md]
BasedOnStyles = Vale, Brand
# Turn one rule off here.
Brand.Contractions = NO

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
Reports warning Consider removing 'basically'

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.