An excerpt from the repository, fetched Nov 13, 2026.
Read the project’s introduction
Writing is notoriously hard, even for the best writers, and it's not for lack of
good advice — a tremendous amount of knowledge about the craft is strewn across
usage guides, dictionaries, technical manuals, essays, pamphlets, websites, and
the hearts and minds of great authors and editors. But poring over Strunk &
White hardly makes one a better writer — it turns you into neither Strunk nor
White. And nobody has the capacity to apply all the advice from Garner’s Modern
English Usage, an 1100-page usage guide, to everything they write. In fact, the
whole notion that one becomes a better writer by reading advice on writing rests
on untenable assumptions about learning and memory. The traditional formats of
knowledge about writing are thus essentially inert, waiting to be transformed.
We devised a simple solution: proselint, a linter for English prose. A linter
is a computer program that, akin to a spell checker, scans through a file and
detects issues — like how a real lint roller helps you get unwanted lint off of
your shirt.
proselint places the world's greatest writers and editors by your side, where
they whisper suggestions on how to improve your prose. You’ll be guided by
advice inspired by Bryan Garner, David Foster Wallace, Chuck Palahniuk, Steve
Pinker, Mary Norris, Mark Twain, Elmore Leonard, George Orwell, Matthew
Butterick, William Strunk, Elwyn White, Philip Corbett, Ernest Gowers, and the
editorial staff of the world’s finest literary magazines and newspapers, among
others. Our goal is to aggregate knowledge about best practices in writing and
to make that knowledge immediately accessible to all authors in the form of a
linter for prose; all in a neat command-line utility that you can integrate into
other tools, scripts, and workflows.
Installation
To get this up and running, install it using pip.
pip install proselint
Fedora
sudo dnf install proselint
Debian
sudo apt install python3-proselint
Ubuntu
sudo add-apt-repository universe
sudo apt install python3-proselint
Nix
proselint is packaged by nixpkgs.
pre-commit
To use proselint with pre-commit, or prek, point its config at this repository:
repos:
- repo: https://github.com/amperser/proselint
rev: v0.16.0
hooks:
- id: proselint
Be sure to change rev to use the desired proselint git tag or revision.
Thanks to Andy Airey for the pre-commit configuration.
Declarative
environment.systemPackages = [pkgs.proselint];
Imperative
nix profile install nixpkgs#proselint
Plugins for other software
proselint is available on:
Vim via ALE
Emacs via Flycheck
CI/CD via MegaLinter
Neovim via none-ls.nvim
The following plugins are also available, but they are archived or unmaintained:
IntelliJ plugin by Victor Kropp
Flymake plugin by Manuel Uberti
Sublime Text plugin by Jordan Suchow
Phabricator Arc plugin by Jeff Verkoeyen
Visual Studio Code plugin by Patryk Peszko
Coala plugin by the Coala Development Group
Danger plugin by David Grandinetti and Orta Therox
Syntastic plugin by LCD 047, M Bussonnier, and Daniel M. Cappella
Usage
On the command line
Suppose you have a document text.md with the following text:
John is very unique.
You can run proselint over the document using the command line:
proselint check text.md
This prints a list of suggestions to stdout, one per line. Each suggestion is of
the form:
file:<line>:<column>: <check_name>: <message>
For example,
text.md:1:9: uncomparables: Comparison of an uncomparable: 'very unique' is not comparable.
The command-line utility can also print suggestions in JSON using the
--output-format json option. In this case, the output is considerably richer,
following our stable wire schema.
{
"result": {
"file:///path/to/text.md": {
"diagnostics": [
{
// Name of the check that output this suggestion.
"check_path": "uncomparables",
// Message to describe the suggestion
"message": "Comparison of an uncomparable: 'very unique' is not comparable.",
// Line and column where the error begins in the source
"pos": [1, 9],
// Absolute start and end of the error in the source
"span": [9, 20],
// Suggested replacements for the content, if applicable
"replacements": null,
}
]
}
}
}
As a library
To run the linter as part of another Python program, you can use the LintFile
class in proselint.tools. This requires CheckRegistry to be populated.
from proselint.checks import __register__
from proselint.registry import CheckRegistry
from proselint.tools import LintFile
CheckRegistry().register_many(__register__)
suggestions = LintFile("source-name", "This sentence is very unique").lint()
This will return a list of suggestions:
[LintResult(
check_result=CheckResult(
check_path='uncomparables',
message="Comparison of an uncomparable: 'very unique' is not comparable.",
span=(18, 29),
replacements=None,
),
pos=(1, 18),
)]
Configuring
Noteproselint searches for configuration files in the order described below, and
loads the first file it finds. If no configuration files are found, it falls
back to its built in defaults.
The file given by the --config flag, if specified
proselint.json in the current working directory
proselint.json in any directory above the current working directory
$XDG_CONFIG_HOME/proselint/config.json, defaulting to
~/.config/proselint/config.json if XDG_CONFIG_HOME is not set
This section's examples use JSONC for comments and trailing commas. Please
ensure you remove these features from your own configuration to avoid errors.
The configuration schema and defaults are as follows:
{
// The maximum allowable number of results proselint can output.
"max_errors": 1000,
// Checks to select or deselect.
"checks": {
// ...
},
// Checks to select or deselect on a per-file basis. These are merged with
// the selections specified in "checks" so you don't have to repeat them.
Read the full README on GitHub