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

你写的每一封邮件、每一份文档、每一条消息,如果要过一遍 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-ls | Language Server Protocol 实现,接入各种编辑器 |
harper-cli | 命令行工具 |
harper-wasm | WebAssembly 编译目标,驱动浏览器端 |
harper-desktop | Tauri 桌面应用(Svelte 前端 + Rust 后端) |
harper-tree-sitter | Tree-sitter 集成,解析代码注释中的自然语言 |
harper-html | HTML 文档解析 |
harper-tex / harper-typst | LaTeX / Typst 学术文档支持 |
harper-python | Python 代码注释检查 |
拼写引擎: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 月发布,带来了架构升级和性能改进。
与竞品的对比
| 维度 | Harper | Grammarly | LanguageTool |
|---|---|---|---|
| 运行方式 | 完全离线 | 云端 | 本地(可选云) |
| 内存占用 | 极低(<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% 的网站。投资一个离线语法检查器,逻辑链条很清晰:
- WordPress 编辑器需要写作辅助功能
- 现有方案要么贵(Grammarly 企业版),要么重(LanguageTool 资源占用),要么隐私不达标
- 自建一个 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 为例):
-- 通过 harper-ls 接入
require('lspconfig').harper_ls.setup({})命令行检查:
# 安装
cargo install harper-ls
# 检查文件
harper-cli check document.mdRust 集成:
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 版本,全程在浏览器中运行)。
- OpenSEO:5800 Star 的开源 SEO 工具,10 美元/月挑战 Semrush 与 Ahrefs7/20/2026
- 腾讯玄武阿图因AI在CyberGym测试中超越Mythos7/3/2026
- 华为开源 920 亿参数 openPangu-2.0-Flash 模型6/30/2026
- OmniRoute:日增 1300+ Star 的开源 AI 网关,一个端点接通 250 个模型提供商7/20/2026
- 华为天才少年的开源AI Agent全书:6700星、十章、可跑实验代码7/20/2026
- xAI 开源 Grok Build:Rust 编写的终端编程代理7/15/2026
- 美国政府要求 OpenAI 分阶段发布 GPT-5.66/26/2026
- Anthropic 获美国政府批准,恢复 Mythos 5 模型对关键基础设施组织的部署6/27/2026
- Gemini Omni Flash 登顶 Video Arena 盲测榜,领先第二名 101 分7/3/2026
- 6.4 万 Star 的开源全球情报平台:World Monitor 架构与能力全景7/21/2026
- AI 代码审查的 token 困境:code-review-graph 如何用代码图谱砍掉 98% 的上下文7/20/2026
- Block 开源 Buzz:Nostr 上的 AI 协作工作空间7/23/2026
- Qwen3.8 发布:2.4T 参数、原生多模态、开放权重承诺7/19/2026
- Voicebox:43K Stars 的开源 AI 语音工作室,7 引擎 TTS + MCP Agent 集成7/19/2026
- Hallmark:一份写给AI编码助手的反AI味设计手册7/17/2026
- 英伟达发布公开信力挺AI开放权重:黄仁勋第一条推文的五重信号7/24/2026
- RuView:用 WiFi 信号隔墙感知人体姿态和生命体征,8.5万 Star 的开源 WiFi 感知平台7/24/2026
- FLUX 3:Black Forest Labs 的多模态模型与机器人野心7/24/2026
- Kronos:金融市场的第一个开源 K 线基础模型7/24/2026
- KTransformers:单 GPU 跑 671B MoE 模型的清华方案7/21/2026
- B站在WAIC展出开源AI猫娘:能看懂屏幕、主动搭话的桌面伙伴7/18/2026
- 27B 模型塞进手机:PrismML Bonsai 27B 把权重压到 1-bit7/18/2026
- Gigatoken:比 HuggingFace 快 1000 倍的开源分词器7/22/2026
- jcode:用 Rust 重写的 AI 编码代理,内存占用仅为 Claude Code 的 1/147/22/2026
- DeepSeek 联合北大开源 DSpark:半自回归推测解码,推理速度提升 57% 至 85%6/27/2026
- AI 连破三大数学猜想:Jacobian 猜想 87 年反例与形式化验证的新时代7/21/2026
- Kimi K3 首登 DeepSWE v1.1:开源权重模型挤进前三7/18/2026
- 960个参数跑通Transformer:从零理解大模型7/24/2026
- GPT-5.6用一段十页提示词,关闭凸优化30年的复杂性缺口7/19/2026
- Moonshine Micro:80美分芯片跑完整语音流水线,500KB内存装下VAD+STT+TTS7/18/2026