← Package directory
Available on winget

Install Harper Language Server

Harper Grammar Checker Language Server Protocol

Install with winget
winget install --id Automattic.harper-ls
Upgrade
winget upgrade --id Automattic.harper-ls
Uninstall
winget uninstall --id Automattic.harper-ls

About Harper Language Server

Harper Grammar Checker Language Server Protocol

What's new in 2.6.0

What's Changed - feat: now a days→nowadays; add to discourse markers by @hippietrail in #3392 - feat: the entire of→the entirety of by @hippietrail in #3604 - feat: leaving in drones→leaving in droves by @hippietrail in #3636 - fix(core): support multiple brackets in rune matcher by @marcbachmann in #3608 - feat: tho→though by @hippietrail in #3526 - feat(desktop): mark support for Slack and Discord by @elijah-potter in #3641 - docs: grammar fix(es) in contributors/desktop by @hippietrail in #3645 - feat: dir → directory by @hippietrail in #3470 - fix: don't flag missing "to" between "want" and a noun+verb word by @hippietrail in #3649 - feat(cli): allow forms subcommand to accept multiple arguments by @abhishekDeshmukh74 in #2996 - feat: app picker bundle ID lookup by @hippietrail in #3653 - feat: as compare to→as compared to by @hippietrail in #3647 - refactor: introduce SequenceExpr::word_seq() by @hippietrail in #3659 - Add version numbers next to key integrations that are often not up-to-date with the GitHub version by @hippietrail in #3553 - feat: (since) indefinite durations by @hippietrail in #3283 - feat: a handful of more → a handful more by @hippietrail in #3223 - feat: convenient store→convenience store by @hippietrail in #3113 - feat: the last days→the last few days by @hippietrail in #3268 - feat: feet/inches and minutes/seconds from '/" to ′/″ by @hippietrail in #3275 - feat: fix run into problem/a trouble/troubles by @hippietrail in #3685 - feat: in depth→in-depth by @hippietrail in #3684 - docs: Describe what a Harper Committer is by @elijah-potter in #3687...

Read release notes

Version history

Version Updated Notes
2.6.0 Unknown What's Changed - feat: now a days→nowadays; add to discourse markers by @hippietrail in #3392 - feat: the entire of→the entirety of by @hippietrail in #3604 - feat: leaving in drones→leaving in droves by @hippietrail in...
2.5.0 Unknown What's Changed - fix(core): false-positive after contraction by @elijah-potter in #3595 - fix(core): ignore the letter s when found in a parenthesis after a word by @elijah-potter in #3596 - feat(weir): add BoarderBorder...
2.4.0 Unknown What's Changed - docs: add Desktop app to list of platforms by @hippietrail in #3530 - feat: fellow coworker→fellow worker/coworker by @hippietrail in #3478 - feat: proof-of-concepts→proofs-of-concept by @hippietrail in...
2.3.1 Unknown What's Changed - feat(desktop): add report issue buttons to menus by @elijah-potter in #3543 - fix(desktop): rename to Harper by @elijah-potter in #3542 - Dictionary curation for May 22, 2026 by @hippietrail in #3469 - f...
2.2.1 Unknown What's Changed - fix(ci): produce universal desktop binaries by @elijah-potter in #3462 - feat(desktop): generate Harper-branded icons by @elijah-potter in #3430 - Quarto language detection for vscode by @silverhikari in...
2.2.0 Unknown What's Changed - feat: at lest→at least by @hippietrail in #3243 - chore: add "day of age" to DayAndAge rule by @hippietrail in #3272 - feat: less confident SplitWords message when either word is only 1 char by @hippietr...
2.1.0 Unknown What's Changed - fix(chrome-ext): Harper not activating in Instagram DMs by @elijah-potter in #3145 - fix: all to/too linters now use same LintKind by @hippietrail in #3135 - chore: dictionary curation 2026/04/02 by @hip...
2.0.0 Unknown What's Changed Hey all! We're finally releasing Harper 2.0. Why? It isn't because we have any new groundbreaking features in this release, because we don't let major versioning stop us from pushing those out as soon as t...
1.12.0 Unknown What's Changed - fix(chrome-ext): formatting issues on Google Docs by @elijah-potter in #2960 - feat: grind to halt → grind to a halt by @hippietrail in #2972 - fix: correct typos and grammar in docs and comments by @cl2...
1.11.0 Unknown What's Changed - chore: dictionary curation by @hippietrail in #2867 - feat: do a mistake→make a mistake by @hippietrail in #2463 - refactor: two-digit decade support by @hippietrail in #2911 - fix: warn about clashing l...
1.10.0 Unknown What's Changed - build(deps): bump pulldown-cmark from 0.13.0 to 0.13.1 by @dependabot[bot] in #2848 - build(deps): bump chrono from 0.4.43 to 0.4.44 by @dependabot[bot] in #2852 - build(deps): bump quickcheck from 1.0.3...
1.9.0 Unknown What's Changed - Propagating newer methods of SequenceExpr through the codebase by @hippietrail in #2759 - feat(core): many more Weir rules by @elijah-potter in #2742 - feat(chrome-ext): the ability to load/unload Weirpa...
1.8.0 Unknown What's Changed - build(thesaurus): reduce compression level for debug builds by @86xsk in #2694 - feat(chrome-ext): move the review request to 14 days after installation by @elijah-potter in #2707 - feat(web): show bette...
1.7.0 Unknown What's Changed - feat: worth to do → worth doing by @hippietrail in #2638 - build(deps): bump time from 0.3.41 to 0.3.47 by @dependabot[bot] in #2663 - refactor: use Span::empty to create empty spans by @86xsk in #2658 -...
1.6.0 Unknown What's Changed - refactor(brill): remove lazy_static dependency by @86xsk in #2571 - feat: afterall → after all by @hippietrail in #2582 - perf(core): cache Wier ASTs by @86xsk in #2584 - deps(cli): bump ariadne from 0.4...
1.5.1 Unknown What's Changed - fix(chrome-ext): problems with incorrect dialect selection and reversion by @elijah-potter in #2569 Full Changelog: v1.5.0...v1.5.1
1.4.1 Unknown What's Changed - fix(chrome-ext): properly support Zendesk by @elijah-potter in #2424 - refactor(cli): refactor Input and adjacent code by @86xsk in #2412 - fix(obsidian): bug causing the Indian dialect to crash the sett...
1.4.0 Unknown What's Changed - feat: be good in sth. → be good at sth. by @hippietrail in #2368 - fix: issue 1722 by @hippietrail in #2373 - fix: expand BestOfAllTime linter by @hippietrail in #2381 - fix: don't change 'you' to 'your'...
1.3.0 Unknown What's Changed - feat: daml support by @Sengoku11 in #2347 - fix: false positive for "since N years old" by @hippietrail in #2342 - feat: make senses→make sense by @hippietrail in #2330 - build(deps): bump uuid from 1.18...
1.2.0 Unknown What's Changed - feat(core): many new rules by @elijah-potter in #2292 - fix: flag "piece of advise" by @hippietrail in #2266 - fix(web): problems with the title casing page by @elijah-potter in #2293 - feat: implement #...