What's New
- CLI updates: Proselint now has subcommands. These are
proselint checkfor the original behaviour,proselint versionto print the version and exit, andproselint dump-configto view the loaded or default configuration. - Stable JSON output: We now have stable output for connecting Proselint with other programs. Use
proselint check --output-format jsonto access this new functionality, with a schema shown in the documentation. - Phantom power and ludicrous speed: A 5x performance improvement against the demo file has been achieved over the last release.
- Configuration changes: You can now specify checks down to the individual level in your configuration, while still being able to control them at the module level. Accompanying this new granularity is the ability to nest dictionaries to keep your configuration concise.
- Housekeeping: The cache system of yore is gone, and the many check streamlining suggestions from #1373 were implemented.
Thank you to all of our new and returning contributors for this release. An unabridged summary is also available below.
Change Log
0.16.0 - 2025-11-14
💥 Breaking Changes
This release is not backwards compatible. The following breaking changes have been made.
As a program
- Python 3.9 is now end-of-life, and no longer supported
- Different calling conventions. See
--helpfor a full list of optionsproselint --versionis nowproselint version, for consistency with other lintersproselintis nowproselint checkproselint --dump-configand--dump-default-configare nowproselint dump-configanddump-config --default--timeand--cleanhave been removed--debugis now--verbose--jsonand--compactare now--output-format jsonand--output-format compact
- Several checks have been removed and renamed as an implementation of #1373.
User configurations will need to be modified accordinglyairlinese,bureaucratese,chatspeak,commercialese,corporate_speak, andjargonhave been recategorized underindustrial_language.security,links, andcursing(except forcursing.nword) have been removedsexism,lgbtq, andcursing.nwordhave been recategorized undersocial_awarenessconsistency.spacinghas been moved totypography.punctuation.spacingtypography.exclamationandhyperbolehave been merged and moved totypography.punctuation.hyperboleconsistency.spellinghas been moved tospelling.consistencyconsistencyhas been removed- All modules that previously contained a single check file have been flattened
archaism.miscis nowarchaismhedging.miscis nowhedginglexical_illusions.miscis nowlexical_illusionsmalapropisms.miscis nowmalapropismsmixed_metaphors.misc.bottleneckis nowmixed_metaphors.bottleneckmisc.mondegreensis nowmondegreensneedless_variants.miscis nowneedless_variantsnonwords.miscis nownonwordsoxymorons.miscis nowoxymoronsskunked_terms.miscis nowskunked_termsuncomparables.miscis nowuncomparables
- There is a new JSON output schema for
--output-format json. This is documented, stable, and versioned. Plugins will require updates. - The on-disk cache has been removed
As a library
- The cache has been removed, along with all related features in
proselint.tools - The
scoremodule has been removed - The build backend is now
uv_build - The
topicsandcontextfeatures ofproselint.toolshave been removed - The
_checkfunctions ofproselint.toolshave been replaced by classes inproselint.registry.checks.types - Checks are now specified with
Checkinproselint.registry.checks - Lint runs are executed with
LintFileand returnLintResult, both inproselint.tools - The
ppm_thresholdwrapper inproselint.toolshas been replaced byCheckFlagsinproselint.registry.checks - The
max_errorswrapper inproselint.toolshas been removed load_optionsinproselint.toolshas been replaced by theproselint.configmoduleerrors_to_jsoninproselint.toolshas been replaced byLintResult.into_dict
⛰️ Features
- (registry) Add strict padding for checks (#1428) - (f1894bc)
- Override keys and dot-prop (#1440) - (ddebe9f)
- Add flag to prevent filtering quotes in lintfile (#1404) - (109f58f)
- Implement check registry (#1396) - (3bc0d13)
🐛 Bug Fixes
- (checks) Ignore least and most in uncomparables after at (#1433) - (b94542c)
- (checks) Allow very well in weasel_words (#1426) - (616e855)
- (checks) Resolve meantime/meanwhile conflict in misc.preferred_forms (#1425) - (18ecce6)
- (registry) [breaking] Remove results_limit (#1421) - (d77cd1b)
- Move chocolatey to spelling.consistency (#1432) - (7a2d503)
- Simplify but check and properly count lines (#1423) - (68be196)
- Rectify capitalisation in preferred forms (#1413) - (81d2ea1)
- Check venery-waxed return types (#1414) - (b481488)
- Update Sublime plugin for SublimeLinter4 (#1107) - (8df0966)
🚜 Refactor
- (cli) Switch click -> argparse and add logging (#1400) - (01b507e)
- (config) Remove unused copy import (#1402) - (cd19388)
- (tools) Upgrade internals (#1399) - (d9db2c5)
- Stabilise wire logging (#1444) - (02e85a8)
- [breaking] Upgrade to python 3.10 (#1435) - (1b986fe)
- [breaking] Remove unused corpus scoring (#1403) - (85fde74)
- Implement iterators for check results (#1398) - (fa73970)
- Modernise config (#1394) - (0e1feba)
- Tidy checks (#1383) - (053295c)
📚 Documentation
⚡ Performance
- (checks) [breaking] Use dual engine system (#1436) - (e12a943)
- (cli) Import version lazily (#1438) - (7bfb8f1)
- (registry) Early exit matches_partial (#1441) - (9fa6339)
- (tools) Use bisect for boundary checks (#1407) - (c80ef08)
⚙️ Miscellaneous Tasks
- (gh) Remove pr frontmatter - (da58e87)
- (publish) Bypass protections (#1447) - (200a817)
- (publish) Fix release configurations (#1446) - (79885f8)
- Prepare release v0.16.0 - (a83a616)
- Prepare release v0.15.0 - (19827df)
- Use nix for workflows (#1416) - (9c24e8c)
- Update issue templates (#1420) - (35e7686)
- Update workflows (#1419) - (7280204)
- Ignore .envrc and .direnv (#1415) - (6bf7ab5)
- Remove danger (#1384) - (def7995)
- Update ci and flake (#1386) - (35e48a0)
- Update tooling (#1381) - (9132ee4)
- Remove duplicate items from lists (#1369) - (f01742d)
- Pin runner image versions (#1368) - (03a7360)
Build
New Contributors ❤️
- @github-actions[bot] made their first contribution
- @renovate[bot] made their first contribution in #1443
- @drainpixie made their first contribution in #1440
- @Yoshanuikabundi made their first contribution in #1107
- @ferdnyc made their first contribution in #1370