Harper checks your grammar without sending it anywhere

Contents

Harper is an offline grammar checker that runs entirely on your own machine. It lints a document in milliseconds instead of seconds, uses a sliver of the memory LanguageTool needs, and never opens a network connection. Automattic bought the project in 2024 and kept it open source.

Key Takeaways

  • Harper checks your writing on your own machine, so nothing gets uploaded.
  • It answers in milliseconds, fast enough to run as you type.
  • It plugs into VS Code, Neovim, Helix, Emacs, Zed, Obsidian, and the browser.
  • WordPress owner Automattic bought it in 2024 and kept it open source.
  • English only, and the bug queue is big. Expect a few odd suggestions.

What is an offline grammar checker?

An offline grammar checker does its work on your computer instead of on someone else’s. Almost every grammar tool most people have used is a cloud service, so the distinction rarely comes up.

Cloud checkers send your sentence to a server and send a suggestion back. Local checkers keep every word on the machine you typed it on. A model-based checker hands the job to a language model, wherever that model happens to run.

Diagram comparing cloud, local, and model-based grammar checkers by where the text travels, response time, and cost

Harper is a local checker, built as a rule and dictionary engine in Rust. Because no neural model is involved, it answers fast and needs no GPU.

If the checker never opens a socket, there’s no privacy policy to read and no chance your draft ends up training something. You don’t have to trust anybody, because nothing leaves.

Speed is the part people feel. A local checker has no round trip, so suggestions can appear while you type. The cost story follows from the same fact: there’s no server to pay for, so there’s no subscription.

Still, a rule engine has no world knowledge. It flags a sentence as ungrammatical and stops there. Whether the sentence is confusing is beyond its reach. The project is named after the novelist Harper Lee.

Harper against Grammarly and LanguageTool

The speed and license numbers below come from the project’s own comparison table, so read them as the maintainers’ figures.

CheckerSuggestion timeLicenseRuns offlineLanguages
Harper10 msApache 2.0AlwaysEnglish only
LanguageTool650 msLGPL 2.1Self-hosted onlyMany, one at a time
Grammarly4000 msProprietaryNoEnglish

Against Grammarly, Harper wins on privacy and price and loses on scope. Grammarly rewrites tone, flags clarity problems, and does a lot more than grammar. Harper stops at grammar and style rules.

The LanguageTool tradeoff is memory. Its full accuracy wants a roughly 16 GB n-gram dataset, plus the gigabytes of RAM to hold it. The Harper README claims under one fiftieth of that, again the maintainer’s own figure.

The Automattic announcement and TechCrunch’s writeup both put suggestions under 20 milliseconds, and the announcement took a swipe at the competition.

That’s less than 1% of the time it takes a certain popular online grammar tool.

Automattic (acquisition announcement)

Founder Elijah Potter wrote the origin story into the README himself. Grammarly was expensive and bossy, LanguageTool was slow, so he built the one he wanted. He joined Automattic as a Code Wrangler when the company bought the project.

All three lose to a language model in the same place: none of them know what you meant. A rule engine catches a dangling modifier but never a bad argument. So the sane setup is Harper in the editor for the mechanics and a model for the rewrite, with no subscription for either.

Where Harper runs

Harper ships in six shapes, and one of them probably fits the editor you already use.

  • A language server, harper-ls, published on crates.io. This is the path for Neovim , Helix , Emacs , and Zed .
  • A Visual Studio Code extension , installed from the marketplace like anything else.
  • An Obsidian plugin , which is the one that reaches writers who are not developers.
  • A browser build, compiled to WebAssembly. The live demo at writewithharper.com runs the entire checker inside the page.
  • A JavaScript library, harper.js , for dropping the checker into your own web app.
  • A Chrome extension, for checking text in web forms and comment boxes.

That WebAssembly demo is the clearest proof the privacy claim is real. Load the page, cut your network, and the suggestions still show up as you type.

Harper flagging a grammar issue inside an Obsidian note, showing the underline and suggestion popup
The Obsidian plugin underlines the problem and offers the fix in place
Image: Harper docs

Two more shapes live in the repository without much fanfare: harper-cli for checking a file from the terminal, and an experimental desktop app built with Tauri.

Experimental Harper desktop app built with Tauri, checking a block of text and listing the suggestions beside it
The Tauri desktop build is unpolished but shows the same engine outside an editor
Image: Automattic/harper

After the buyout, Automattic said it would fold Harper into WordPress.com, WooCommerce, and Jetpack. A WordPress plugin did ship. However, the project’s WordPress docs now say it no longer gets regular updates, and point people at the Chrome extension instead.

What Harper still cannot do

Harper handles English and nothing else. The core was built to stretch to other languages, and the project openly asks for help with them. Still, today there is one language. A bilingual writer, or anyone drafting in Polish, gets nothing from it.

False positives are the usual complaint about rule-based checkers. The project’s own Neovim docs admit that programmers find some rules too jumpy. Their fix is to switch off the sentence capitalization and spell check rules. A codebase full of odd identifiers and half-finished comments is exactly the input that makes a rule engine cranky. You can also add words to a personal dictionary and disable rules one by one.

The linting directory carries roughly 300 rule modules, one file per pattern, with names like a_ways_to_go and another_think_coming. Each rule fires only on the exact pattern it names.

The issue queue is large: about 570 open issues against 943 closed. That’s mostly what heavy use looks like, because the other side of the ledger is healthy. The project has merged 1,948 pull requests from more than 130 contributors, with 130 more still open. Tagged releases land roughly monthly. The README also says the maintainers treat slow lints as bugs, worth knowing before you file one.

The Apache 2.0 license lets you ship Harper inside your own product. That’s how a Rust grammar engine ends up in front of millions of writers who never learn its name.