Vale: a prose linter
7 minute read
Vale is a style-guide validator that helps you write better content.
When run from a command-line, it checks your work against a set of selected rules and highlights potential problems. In writing terms, Vale enforces style guidelines taken from major publishers and related resources. Think of Vale as a personal copyeditor (Wikipedia).
More formally, Vale is a linter. Developers use linters to make sure their code follows predetermined guidelines. Vale performs a similar task. You can use it to check content written in Markdown, AsciiDoc, Restructured Text (RST), HTML, and more.
By default, Vale supports three major style guides:
- Google developer doc style guide
- Microsoft Writing style guide
- Red Hat documentation style guide
Vale also supports supplementary style guides. You can also create and customize rules to match your preferences.
Quick setup
The Vale docs provide detailed installation instructions (Vale.sh) for a variety of options, including Docker. However, they can be a bit hard to follow.
For an individual writer, the typical installation process is:
To install and set up Vale:
-
Use your system’s package manager (Vale.sh) to install Vale.
$ brew install vale
This shows how to use Homebrew to install Vale on a Mac.
-
Use the Vale Config Generator (Vale.sh) to create an initial configuration.
If you’re not sure which options to choose, consider:
- Base style:
Google developer doc style guide
- Supplemental style guide:
proselint
- Configuration: As appropriate for your project.
- Base style:
-
In the home directory for your project, create a hidden configuration file named
.vale.ini
$ cd ~/work/myproject $ touch .vale.ini
-
Update your configuration file with the generated configuration.
StylesPath = styles MinAlertLevel = suggestion Packages = Google, proselint, Hugo, alex, Readability [*.{md}] BasedOnStyles = Vale, Google, proselint, alex, Readability
-
Sync Vale to your project settings. This downloads the packages specified in the
Packages
setting.$ vale sync SUCCESS Synced 5 package(s) to '~/work/myproject/styles'
When the sync completes, Vale is ready to check your work.
Checking a file
To check a single file, run vale and specify the filename:
% vale README.md
README.md
1:3 warning 'Docsy Example' should use Google.Headings
sentence-style capitalization.
1:3 error Did you really mean 'Docsy'? Vale.Spelling
3:2 error Did you really mean 'Docsy'? Vale.Spelling
4:46 error Did you really mean 'Docsy'? Vale.Spelling
4:79 error Did you really mean 'Docsy'? Vale.Spelling
5:22 error Did you really mean 'hugo'? Vale.Spelling
8:22 error Did you really mean 'Docsy'? Vale.Spelling
8:34 suggestion In general, use active voice Google.Passive
instead of passive voice ('is
pulled').
In this partial result, Vale:
- Reports a capitalization issue with a header
- Highlights words it doesn’t recognize (
Docsy
andhugo
) - Suggests fixing passive voice
The numbers on the left report the location of the problem in your source file. The first value is the line number and the second reports the character position.
The value on the right reports the package and name of the rule, which helps with later configuration.
You probably won’t fix every reported problem. You should at least investigate and then decide next steps.
Checking multiple files
Use the glob
parameter to check multiple files:
% vale --glob="**/*.md" content/
// details removed
✖ 86 errors, 32 warnings and 52 suggestions in 85 files.
Here, Vale recursively scans the content
folder and reports issues in each Markdown file.
Supplementary styles
Vale supports a variety of supplementary style packages, which include:
proselint
: A collection of editorial advice (Github)write-good
: Designed to help developers write better prose (Github)alex
: Helps write neutral and unbiased content (alexjs.com)Joblint
: Helps job posts avoid common pitfalls (Github)Readability
: Calculates readability scores
To add and use a supplementary style:
-
Update your Vale configuration:
a. Add the supplementary style to
Packages
.Packages = Google, proselint, Hugo, alex, Readability
b. Update
BasedOnStyles
to include the supplementary style.BasedOnStyles = Vale, Google, proselint, alex, Readability
-
Sync your Vale packages
$ vale sync SUCCESS Synced 5 package(s) to '~/work/myproject/styles'
-
Test your content
Many organizations publish Vale packages for their in-house style guides.
To see what’s available:
- Explore Vale’s Package library (Vale.sh)
- Search GitHub for the
vale-linter-style
tag (GitHub).
Customizing Vale
Vale is a rich and flexible environment, one that supports many customization opportunities.
You can adjust Vale so your personal style or to keep it from flagging valid content.
This section shows three ways to customize Vale for different uses.
Alternate rulesets
Use the config
parameter to run Vale with a different set of rules.
To do so:
-
Create an alternate configuration file:
StylesPath = styles Packages = Readability [*.{md}] BasedOnStyles = Readability
-
Use the
--config
parameter to specify the alternate configuration file:% vale --config=".readability.ini" README.md README.md 1:1 warning Try to keep the LIX score Readability.LIX (35.90) below 35. 1:1 warning Try to keep the SMOG grade Readability.SMOG (10.01) below 10. 1:1 warning Try to keep the Coleman–Liau Readability.ColemanLiau Index grade (9.06) below 9. 1:1 warning Try to keep the Flesch–Kincaid Readability.FleschKincaid grade level (8.02) below 8. 1:1 warning Try to keep the Flesch reading Readability.FleschReadingEase ease score (61.88) above 70. ✖ 0 errors, 5 warnings and 0 suggestions in 1 file.
In this example, the
Readability
package calculates a readability score for README.
Use this to set up validations run at specific points in your workflow, possibly as part of a final review or a milestone checkup. Doing so can reveal insights into your content and provide valuable feedback.
For best results, use your primary configuration to manage and update packages. Declare them as part of the Packages
setting, exclude them from your primary BasedOnStyles
, and then create alternate configurations to run on demand. They’ll update when you sync your primary configuration.
Rule adjustments
You can use the configuration file to turn off individual rules.
For example, the following configuration deactivates two rules specified by the Google Developer Doc style guide.
## Project style overrides
Google.FirstPerson = NO
Google.We = NO
Such customizations are sometimes called project styles, as they reflect choices limited to a given project (such as this website).
Use this with care, as each rule was originally selected for good reason.
If you’re using a set of rules to match an organization’s style, work with your contacts to determine available options.
Custom vocabulary
Vale includes a partial spell check and flags words it doesn’t recognize. For example, the earlier single file example included warnings about “Docsy,” the name of the theme used in this site.
The file reviewed in that sample was the theme’s README file, so it makes sense to add the name to a custom vocabulary.
You can define a custom vocabulary that defines terms that should not be flagged as potential spelling errors.
To do so, you need to create a specific set of folders and files in your Vale styles
folder:
project-home
└── styles
└── config
└── vocabularies
└── myproject
├── accept.txt
└── reject.txt
Here:
project-home
is the root folder (or home) of your projectmyproject
is the name of your custom vocabularyaccept.txt
lists acceptable words; that is, words that aren’t spelling errorsreject.txt
lists words to be flagged as “Avoid using”
Here’s one way to set this up:
-
Make sure you’re in the directory containing your Vale
styles
folder.% cd ~/work/myproject
-
Update
.vale.ini
to define a folder for your custom vocabulary.
StylesPath = styles
Vocab = myproject
MinAlertLevel = suggestion
Packages = Google, proselint, Hugo
// remaining lines deleted
-
In your
styles/config/vocabularies
folder, create a folder for your custom vocabulary and then create a calledaccept.txt
:% mkdir styles/config % mkdir styles/config/vocabularies % mkdir styles/config/vocabularies/myproject % touch styles/config/vocabularies/myproject/accept.txt % touch styles/config/vocabularies/myproject/reject.txt
-
Next, add the word
Docsy
toaccept.txt
file.Each word should have its own line.
Words are case-sensitive by default, but this can be configured (Vale.sh).
After setting this up, Vale ignores the words in your accept.txt
file and flags the ones in your reject.txt
file as terms to avoid.
Use this feature carefully.
To learn more about how Vale handles custom vocabularies, see Vocabularies (Vale.sh).
Evaluate customizations
Take time to evaluate the impact of customization. Vale’s diligence can seem annoying, however, there is also value in catching common mistakes. Try to balance convenience against risk.
It may tempting to turn off a specific rule that routinely flags false positives. Before doing so, consider the impact of letting an embarrassing mistake slip through.
To learn more about Vale customization, start by exploring Vale’s:
- Media Library (Vale.sh)
- Styles doc (Vale.sh)
Editor integration
You can integrate Vale into popular editors, such as IntelliJ, Sublime Text, Visual Studio Code (VSC), and more.
When you integrate Vale into an editor, the built-in style checking provides real-time feedback about potential issues as you type.
You can also incorporate Vale into CI/CD deployment pipelines, which can create automation opportunities.
To learn more, see Vale’s Language Server (LSP) (Vale.sh) docs
Vital statistics
- 17 August 2025: Minor tweaks and editorial adjustments.
- 16 August 2025: First post to this site.