HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
amperser
proselint
JavaScript2015–2025
amperser / proselint

proselint

[Mirror] A linter for prose.

21Distinct people
21Mentions
0Explicit recommenders
4.6KGitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

[Mirror] A linter for prose.

GitHub

Where it is used

No documented product use was verified in the last source check.

What people are saying

No recommendation phrase was found in the indexed comments.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

No other repository is repeatedly linked in the same discussions.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 3:56:07 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year21 dated mentions

Observed mentions: 2015-10-24 18:04:17 UTC to 2025-07-01 16:23:09 UTC.

0369122015-01-01 00:00:00 UTC to 2016-01-01 00:00:00 UTC (exclusive): 1 mentions; 1 submissions, 0 comments20152016-01-01 00:00:00 UTC to 2017-01-01 00:00:00 UTC (exclusive): 11 mentions; 1 submissions, 10 comments2017-01-01 00:00:00 UTC to 2018-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 3 mentions; 0 submissions, 3 comments2020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments20202021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments2022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2025-01-01 00:00:00 UTC to 2026-01-01 00:00:00 UTC (exclusive): 2 mentions; 1 submissions, 1 comments2025

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20152015-01-01 00:00:00 UTC2016-01-01 00:00:00 UTC110
20162016-01-01 00:00:00 UTC2017-01-01 00:00:00 UTC11110
20172017-01-01 00:00:00 UTC2018-01-01 00:00:00 UTC101
20182018-01-01 00:00:00 UTC2019-01-01 00:00:00 UTC000
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC303
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC000
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC202
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC000
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC101
20242024-01-01 00:00:00 UTC2025-01-01 00:00:00 UTC000
20252025-01-01 00:00:00 UTC2026-01-01 00:00:00 UTC211

From the project README

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

What Hacker News says

21 sources
Cool project. I've been collecting a list of automated tools for editing [1], which originated at Bell Labs with The Unix Writer's Workbench [2]. Rather than start from scratch, if you want to stick with JavaScript you might consider contributing to Titus Wormer's ReText [3]. Otherwise, we'd love for you to join us in building the Python-based Proselint [4]. 1. https://github.com/amperser/proselint/blob/master/research/c... 2. https://www.princeton.edu/~hos/frs122/unixhist/text.htm 3. https://github.com/wooorm/retext/blob/master/doc/plugins.md 4. https://github.com/amperser/proselint
In Show HN: Pedant: Linting for English texts

Showing the 15 most recent of 21 sources. Enable JavaScript to search and browse every indexed mention.

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.