Harper:Automattic 的开源离线语法检查器,挑战 Grammarly

Harper Desktop 界面截图

你写的每一封邮件、每一份文档、每一条消息,如果要过一遍 Grammarly,内容先到它的服务器走一遭。这不是推测——Grammarly 的架构就是云端的:文本上传、分析、返回结果,全程网络往返。Grammarly 的隐私政策声称不卖数据,但不排除用你的写作训练模型。

Harper 要解决的就是这个问题。一个完全离线、开源、用 Rust 写的语法检查器,不向任何服务器发送一个字符。它的背后是 Automattic——WordPress.com 的母公司,一个靠开源软件构建了数十亿美元业务的公司。

为什么需要另一个语法检查器

语法检查器市场已经相当拥挤。Grammarly 坐拥 3000 万用户,LanguageTool 是最知名的开源替代。Harper 的作者 Elijah Potter 在 README 里直接解释了他的动机:

Grammarly 的问题:价格贵,建议缺乏上下文且经常出错,更关键的是隐私噩梦——所有写作内容上传到服务器,往返延迟让修改体验拖泥带水。

LanguageTool 的问题:需要数 GB 内存和约 16GB 的 n-gram 数据集,对中等长度文档的检查也要好几秒。

Harper 的定位很明确:检查速度以毫秒计,内存占用不到 LanguageTool 的 1/50,完全本地运行,甚至小到能通过 WebAssembly 在浏览器里加载。

技术架构:从 Rust workspace 到规则 DSL

Harper 是一个庞大的 Rust workspace,包含 21 个子 crate,每个负责一个明确的功能模块:

模块功能
harper-core核心引擎:文档解析、分词、语法规则、拼写检查
harper-lsLanguage Server Protocol 实现,接入各种编辑器
harper-cli命令行工具
harper-wasmWebAssembly 编译目标,驱动浏览器端
harper-desktopTauri 桌面应用(Svelte 前端 + Rust 后端)
harper-tree-sitterTree-sitter 集成,解析代码注释中的自然语言
harper-htmlHTML 文档解析
harper-tex / harper-typstLaTeX / Typst 学术文档支持
harper-pythonPython 代码注释检查

拼写引擎:FST + Levenshtein 自动机

拼写检查是语法检查器的基础能力。Harper 的核心数据结构是 Finite State Transducer(FST)——一种压缩率极高的有序字典结构。传统哈希表存储单词列表会消耗大量内存,而 FST 通过共享前缀和后缀,将整个词典压缩到极小的体积,同时支持高效的前缀查询和模糊匹配。

模糊匹配部分使用 Levenshtein 自动机。给定一个可能拼错的单词,系统构建一个确定有限状态自动机(DFA),它能高效地枚举词典中编辑距离在阈值范围内的所有词。Harper 设定的默认编辑距离为 3,同时将换位操作的成本计为 1(类似 Damerau-Levenshtein 距离,能正确处理常见的字母打反错误如 "teh" → "the")。

这套组合的效果:查询时不需要遍历整个词典,FST 结构配合自动机直接定位候选词,查询复杂度与词典大小的对数成正比。Levenshtein 自动机的构建器在线程局部存储中缓存复用,避免重复构造的开销。

规则引擎:200+ 个 Linter 和 Weir DSL

Harper 的语法规则库是目前所见最细致的之一。harper-core/src/linting/ 目录下有超过 200 个独立的规则文件,每个针对一类特定的英语写作问题。几个代表性规则:

  • a_while.rs — 区分 "a while"(名词短语)和 "awhile"(副词)
  • oxford_comma.rs — 牛津逗号风格一致性
  • redundant_acronyms.rs — 检测 "PIN number" 这类冗余缩写
  • very_unique.rs — 提示 "very unique" 是语义矛盾(unique 本身已表示唯一)
  • no_french_spaces.rs — 修正法语标点间距习惯在英语中的误用

除了 Rust 原生规则,Harper 还设计了自己的领域特定语言 Weir——一门用于查找自然语言错误的编程语言。Weir 允许用声明式语法定义匹配模式、替换策略和错误消息,降低了贡献新规则的门槛。一条 Weir 规则可以定义匹配范围(句子级或段落级)、替换策略(保持大小写或精确替换),并通过 becomes 关键字指定建议的修正文本。

多平台集成

通过 Language Server Protocol,Harper 接入了几乎所有主流编辑器:VS Code、Neovim、Helix、Emacs、Zed。对 Obsidian 用户有专用插件,Chrome 浏览器有扩展。harper.js npm 包(周下载量约 19,400)让 JavaScript 应用直接集成,而 harper-wasm 编译目标使整个引擎能在浏览器中运行,无需任何后端服务。

2026 年 5 月,Harper 发布了桌面应用(基于 Tauri,Svelte 前端),进一步扩大了覆盖面。Harper 2.0 在 4 月发布,带来了架构升级和性能改进。

与竞品的对比

维度HarperGrammarlyLanguageTool
运行方式完全离线云端本地(可选云)
内存占用极低(<50MB)N/A(云端)~16GB(含 n-gram)
检查延迟毫秒级网络往返数秒
隐私文本不离开设备上传服务器本地运行
语言支持英语(可扩展)多语言30+ 语言
开源协议Apache-2.0闭源LGPL
编辑器集成LSP(VS Code/Neovim/Helix/Emacs/Zed)+ Obsidian + Chrome浏览器扩展 + 独立应用浏览器扩展 + 独立应用

Harper 的劣势是语言覆盖——目前只支持英语,虽然核心架构是可扩展的。Grammarly 和 LanguageTool 在多语言支持上有明显优势。但对于英语写作场景,Harper 在速度、隐私和资源占用上的优势是碾压级的。

为什么 Automattic 投资这个项目

Automattic 是 WordPress 的母公司,WordPress.com 支撑着全球超过 40% 的网站。投资一个离线语法检查器,逻辑链条很清晰:

  1. WordPress 编辑器需要写作辅助功能
  2. 现有方案要么贵(Grammarly 企业版),要么重(LanguageTool 资源占用),要么隐私不达标
  3. 自建一个 Rust 原生、可嵌入、完全离线的引擎,既服务 WordPress 生态,又能以开源项目获得社区贡献

Elijah Potter 是 Harper 的创建者和核心维护者,贡献了 2205 次 commit,占全部提交的大半。第二位贡献者 hippietrail(Andrew Dunbar)于 2026 年 6 月成为项目首位外部 committer,贡献了 1184 次 commit,主要在词典和规则完善方面。项目的开发节奏相当活跃——v2.3 到 v2.6 在三个月内连续发布,每次更新都包含新规则、bug 修复和性能优化。

增长数据

Harper 的增长曲线在 2026 年明显加速。GitHub 日增 star 数达到 877,总 star 数 12,843。v2.6.0 版本的二进制下载量超过 21,000 次,harper.js npm 包周下载量约 19,400 次。对于一个 2023 年 10 月才创建的项目,三年内达到这个规模,在开发者工具领域算得上快速成长。

快速上手

编辑器集成(以 Neovim 为例):

lua
-- 通过 harper-ls 接入
require('lspconfig').harper_ls.setup({})

命令行检查

bash
# 安装
cargo install harper-ls

# 检查文件
harper-cli check document.md

Rust 集成

rust
use harper_core::linting::{LintGroup, Linter};
use harper_core::parsers::PlainEnglish;
use harper_core::spell::FstDictionary;
use harper_core::{Dialect, Document};

let text = "This is an test.";
let document = Document::new_curated(text, &PlainEnglish);
let dict = FstDictionary::curated();
let mut linter = LintGroup::new_curated(dict, Dialect::American);

for lint in linter.lint(&document) {
    println!("{:?}", lint);
}

Harper 目前以 Apache-2.0 协议开源,代码仓库在 github.com/Automattic/harper,官网 writewithharper.com 提供在线试用(WebAssembly 版本,全程在浏览器中运行)。

推荐阅读