Offline, privacy-first grammar checker. Fast, open-source, Rust-powered
  • Rust 62.1%
  • HTML 21%
  • TypeScript 8.8%
  • Svelte 5.6%
  • JavaScript 0.7%
  • Other 1.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Tech Guy f8ff7a849a
test: pin phrasal-verb handling of "rollback" and "comeback" (#3239) (#3884)
Both words are compound nouns whose dictionary entries once carried a
stray verb flag inherited from an old Wiktionary import. While that flag
was present the linter treated them as legitimate verbs and skipped them,
so "I'm not going to rollback again" went unflagged.

The dictionary entries are correct now and PhrasalVerbAsCompoundNoun
handles both words, but nothing in the suite pinned that. The failure mode
is worth guarding specifically: a data flag silently disabling a rule
produces no error anywhere, and the rule keeps passing its other tests.

Uses the sentences from the issue, plus a negative case so the nouns
themselves stay unflagged.

5677 tests pass.
2026-07-26 08:03:00 +00:00
.buildkite Add fastlane scaffolding for macOS code signing (#3507) 2026-05-28 19:54:16 +00:00
.bundle Add fastlane scaffolding for macOS code signing (#3507) 2026-05-28 19:54:16 +00:00
.github test(chrome-plugin): always run "headless" when testing + increase workers (#3783) 2026-07-15 02:56:47 +00:00
.vscode chore: mostly annotating verbs and nouns (#1874) 2025-09-08 12:20:49 +00:00
fastlane Add fastlane scaffolding for macOS code signing (#3507) 2026-05-28 19:54:16 +00:00
fuzz feat: PowerShell comments support (#2762) 2026-02-20 15:40:56 +00:00
harper-asciidoc test(chrome-plugin): always run "headless" when testing + increase workers (#3783) 2026-07-15 02:56:47 +00:00
harper-brill Release 2.6.0 2026-06-24 09:09:49 -06:00
harper-cli feat: fall a distance below→fall a distance (#3733) 2026-07-22 07:56:17 +00:00
harper-comments Release 2.6.0 2026-06-24 09:09:49 -06:00
harper-core test: pin phrasal-verb handling of "rollback" and "comeback" (#3239) (#3884) 2026-07-26 08:03:00 +00:00
harper-desktop fix(desktop): lagging status indicator (#3779) 2026-07-20 14:59:49 +00:00
harper-dictionary-wordlist Release 2.6.0 2026-06-24 09:09:49 -06:00
harper-git-commit Release 2.6.0 2026-06-24 09:09:49 -06:00
harper-html Release 2.6.0 2026-06-24 09:09:49 -06:00
harper-ink Release 2.6.0 2026-06-24 09:09:49 -06:00
harper-jjdescription Release 2.6.0 2026-06-24 09:09:49 -06:00
harper-literate-haskell Release 2.6.0 2026-06-24 09:09:49 -06:00
harper-ls feat: lint the Source Control commit message box (#3729) 2026-07-01 05:44:00 +00:00
harper-pos-utils Release 2.6.0 2026-06-24 09:09:49 -06:00
harper-python Release 2.6.0 2026-06-24 09:09:49 -06:00
harper-stats Release 2.6.0 2026-06-24 09:09:49 -06:00
harper-tex Release 2.6.0 2026-06-24 09:09:49 -06:00
harper-thesaurus Release 2.6.0 2026-06-24 09:09:49 -06:00
harper-tree-sitter Release 2.6.0 2026-06-24 09:09:49 -06:00
harper-typst Release 2.6.0 2026-06-24 09:09:49 -06:00
harper-wasm build(deps): bump sysinfo from 0.38.4 to 0.39.5 (#3747) 2026-07-01 05:40:42 +00:00
packages fix(chrome-ext): inline Draft.js and Prosemirror pages (#3854) 2026-07-22 17:39:23 +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 fix: ignore test dataset files from source code line count 2025-11-28 13:25:20 -07:00
.gitignore Add fastlane scaffolding for macOS code signing (#3507) 2026-05-28 19:54:16 +00: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
.nvmrc Add fastlane scaffolding for macOS code signing (#3507) 2026-05-28 19:54:16 +00:00
.ruby-version Add fastlane scaffolding for macOS code signing (#3507) 2026-05-28 19:54:16 +00:00
.xcode-version Add fastlane scaffolding for macOS code signing (#3507) 2026-05-28 19:54:16 +00:00
AGENT_POLICY.md docs: copy the agent policy to be inside the repository (#3738) 2026-06-30 21:06:09 +00:00
AGENTS.md feat(docs): clearly define testing strategy (#3845) 2026-07-20 14:54:40 +00:00
ARCHITECTURE.md docs: moved architecture document to the web 2024-12-27 12:03:11 -07:00
biome.json fix(chrome-ext): inline Draft.js and Prosemirror pages (#3854) 2026-07-22 17:39:23 +00:00
Cargo.lock fix(desktop): lagging status indicator (#3779) 2026-07-20 14:59:49 +00:00
Cargo.toml feat(gitcommit): use tree-sitter for gitcommit (#3681) 2026-06-24 03:33:52 +00: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 Redesign harper-editor UI (#3278) 2026-05-07 15:43:18 +00:00
docker-compose.dev.yml refactor(web): build out feedback mechanisms (#2069) 2025-10-22 11:37:49 -06:00
docker-compose.yml refactor(web): build out feedback mechanisms (#2069) 2025-10-22 11:37:49 -06:00
Dockerfile feat: separate web editor into own package (#3191) 2026-04-30 16:33:05 +00:00
flake.lock Add wasm-bindgen-cli to nix flake (#2108) 2025-10-27 15:49:28 +00:00
flake.nix chore: reduce dependency load for new contributors (#2131) 2025-11-04 13:53:01 -07:00
Gemfile Add fastlane scaffolding for macOS code signing (#3507) 2026-05-28 19:54:16 +00:00
Gemfile.lock build(deps): bump faraday from 1.10.5 to 1.10.6 (#3735) 2026-06-29 20:15:59 +00:00
justfile feat: just sort-config-settings to put the config items in alphabetical order (#3869) 2026-07-23 10:00:29 +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 chore: reduce dependency load for new contributors (#2131) 2025-11-04 13:53:01 -07:00
pnpm-lock.yaml test(chrome-plugin): always run "headless" when testing + increase workers (#3783) 2026-07-15 02:56:47 +00:00
pnpm-workspace.yaml feat(desktop): create Harper Desktop (#3324) 2026-05-13 02:28:53 +00:00
README.md docs: update link to correct destination (#2714) 2026-02-13 15:35:09 +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 Checks Crates.io NPM Version Downloads Obsidian Plugin Downloads

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.