Offline, privacy-first grammar checker. Fast, open-source, Rust-powered
Find a file
Andrew Dunbar 92b964d038
Some checks are pending
Build Chrome Plugin / package (push) Waiting to run
Build Binaries / Release harper-cli - macOS-aarch64 (push) Waiting to run
Build Binaries / Release harper-cli - Linux-aarch64-GNU (push) Waiting to run
Build Binaries / Release harper-cli - Linux-aarch64-musl (push) Waiting to run
Build Binaries / Release harper-cli - macOS-x86_64 (push) Waiting to run
Build Binaries / Release harper-cli - Linux-x86_64-GNU (push) Waiting to run
Build Binaries / Release harper-cli - Linux-x86_64-musl (push) Waiting to run
Build Binaries / Release harper-cli - Windows-x86_64 (push) Waiting to run
Build Binaries / Release harper-ls - macOS-aarch64 (push) Waiting to run
Build Binaries / Release harper-ls - Linux-aarch64-GNU (push) Waiting to run
Build Binaries / Release harper-ls - Linux-aarch64-musl (push) Waiting to run
Build Binaries / Release harper-ls - macOS-x86_64 (push) Waiting to run
Build Binaries / Release harper-ls - Linux-x86_64-GNU (push) Waiting to run
Build Binaries / Release harper-ls - Linux-x86_64-musl (push) Waiting to run
Build Binaries / Release harper-ls - Windows-x86_64 (push) Waiting to run
Build Web / build (push) Waiting to run
Package VS Code Plugin / Package - darwin-arm64 (push) Waiting to run
Package VS Code Plugin / Package - darwin-x64 (push) Waiting to run
Package VS Code Plugin / Package - linux-arm64 (push) Waiting to run
Package VS Code Plugin / Package - linux-x64 (push) Waiting to run
Package VS Code Plugin / Package - win32-x64 (push) Waiting to run
Package WordPress Plugin / package (push) Waiting to run
Precommit / precommit (push) Waiting to run
chore: rename affixes.json to annotations.json (#1504)
* chore: rename `affixes.json` to `annotations.json`

The name was getting further and further from the function of the file. And the file is very important so a more representative name makes it less abstract when learning how Harper works.

* fix: mention old name `affixes.json`

I also noticed two fields in the sample entry had outdated names.

---------

Co-authored-by: Elijah Potter <me@elijahpotter.dev>
2025-07-07 16:41:17 +00:00
.github feat(chrome-plugin): set up build system for Firefox (#1408) 2025-06-19 08:51:26 -06:00
.vscode build: fix tsdk 2025-03-18 00:49:14 +08:00
harper-brill Release 0.48.0 2025-07-04 12:40:49 -06:00
harper-cli chore: rename affixes.json to annotations.json (#1504) 2025-07-07 16:41:17 +00:00
harper-comments Release 0.48.0 2025-07-04 12:40:49 -06:00
harper-core chore: rename affixes.json to annotations.json (#1504) 2025-07-07 16:41:17 +00:00
harper-html Release 0.48.0 2025-07-04 12:40:49 -06:00
harper-literate-haskell Release 0.48.0 2025-07-04 12:40:49 -06:00
harper-ls build(deps): bump tokio from 1.45.1 to 1.46.1 (#1517) 2025-07-07 16:39:42 +00:00
harper-pos-utils Release 0.48.0 2025-07-04 12:40:49 -06:00
harper-stats Release 0.48.0 2025-07-04 12:40:49 -06:00
harper-tree-sitter Release 0.48.0 2025-07-04 12:40:49 -06:00
harper-typst Release 0.48.0 2025-07-04 12:40:49 -06:00
harper-wasm Release 0.48.0 2025-07-04 12:40:49 -06:00
packages chore: rename affixes.json to annotations.json (#1504) 2025-07-07 16:41:17 +00:00
.dockerignore fix: dockerfile issues 2025-03-19 11:51:08 +08:00
.editorconfig feat: enforce LF line endings everywhere 2025-03-10 10:51:39 -06:00
.envrc feat(devshell): init devshell 2025-04-04 16:06:31 -04:00
.gitattributes feat: enforce LF line endings everywhere 2025-03-10 10:51:39 -06:00
.gitignore feat(devshell): init devshell 2025-04-04 16:06:31 -04:00
.node-version chore(node): use lts/* instead of lts/iron 2025-02-03 16:54:14 +08:00
.npmrc fix: dockerfile issues 2025-03-19 11:51:08 +08:00
ARCHITECTURE.md docs: moved architecture document to the web 2024-12-27 12:03:11 -07:00
biome.json feat(core): write linter to detect erroneous use of plurality (#1486) 2025-07-04 08:37:57 -06:00
Cargo.lock build(deps): bump lru from 0.15.0 to 0.16.0 (#1516) 2025-07-07 16:40:14 +00:00
Cargo.toml feat(brill): train and use Brill tagger (#1344) 2025-06-16 15:33:49 -06:00
COMPARISON.md fix: changed links from elijah-potter/harper to automattic/harper 2024-12-18 08:05:16 -07:00
CONTRIBUTING.md docs: moved contributor documentation to the web 2024-12-27 11:49:08 -07:00
demo.md feat(web): added a splash of color to the demo 2025-01-31 10:15:20 -07:00
Dockerfile build(harper.js): make parallel available in Docker build 2025-04-03 08:51:09 -06:00
flake.lock feat(devshell): remove rust overlay 2025-04-04 16:06:31 -04:00
flake.nix feat(devshell): echo harper logo to terminal when dev environment loads 2025-04-05 01:06:59 -04:00
justfile chore: rename affixes.json to annotations.json (#1504) 2025-07-07 16:41:17 +00:00
LICENSE fix: filled in LICENSE 2024-03-25 14:58:52 -06:00
logo.svg feat: added logo to README.md and web client 2024-02-15 20:56:27 -07:00
package.json build: add caching (#1172) 2025-04-29 09:25:04 -06:00
pnpm-lock.yaml test(chrome-ext): on Firefox in Playwright (#1491) 2025-07-04 12:13:17 -06:00
pnpm-workspace.yaml fix: dockerfile issues 2025-03-19 11:51:08 +08:00
README.md docs(readme): fix grammar and minor rephrasing (#1176) 2025-04-29 19:32:54 +00:00
rust-toolchain.toml feat: enforce stable rust with a rust-toolchain.toml 2024-09-27 08:28:57 +02:00
rustfmt.toml feat(core): added Whereas rule 2025-02-06 08:57:02 -07:00

Harper

Harper Binaries Website Precommit Crates.io NPM Version

Harper is an English grammar checker designed to be just right. I created it after years of dealing with the shortcomings of the competition.

Grammarly was too expensive and too overbearing. Its suggestions lacked context, and were often just plain wrong. Not to mention: it's a privacy nightmare. Everything you write with Grammarly is sent to their servers. Their privacy policy claims they don't sell the data, but that doesn't mean they don't use it to train large language models and god knows what else. Not only that, but the round-trip-time of the network request makes revising your work all the more tedious.

LanguageTool is great, if you have gigabytes of RAM to spare and are willing to download the ~16GB n-gram dataset. Besides the memory requirements, I found LanguageTool too slow: it would take several seconds to lint even a moderate-size document.

That's why I created Harper: it is the grammar checker that fits my needs. Not only does it take milliseconds to lint a document, take less than 1/50th of LanguageTool's memory footprint, but it is also completely private.

Harper is even small enough to load via WebAssembly.

Language Support

Harper currently only supports English, but the core is extensible to support other languages, so we welcome contributions that allow for other language support.

Performance Issues

We consider long lint times bugs. If you encounter any significant performance issues, please create an issue on the topic.

If you find a fix to any performance issue, we would appreciate the contribution. Just please make sure to read our contribution guidelines first.

Huge Thanks

This project would not be possible without the hard work from those who contribute.

Harper's logo was designed by Lukas Werner.