Harper is an offline, open-source grammar checker built in Rust + WebAssembly by Automattic (30,000+ users across VS Code, Chrome, Firefox, Neovim, and Obsidian). Lints documents in under 10ms using less than 1/50th of LanguageTool's memory with zero AI/ML.
Rewrote the Chrome extension's text replacement engine, replacing a monolithic function with per-framework DOM strategies and direct text node manipulation for Draft.js, Lexical, Slate, ProseMirror, textarea, and contenteditable editors. Built shared Playwright E2E test infrastructure with cross-editor coverage running against live editor sites (draftjs.org, slatejs.org, lexical.dev, GitHub, Hacker News). See merged PRs below for details.
Media
Merged Pull Requests
- PR #2495: Replaced naive text injection with surgical per-framework replacement strategies for Draft.js and Slate, restoring keyboard input and cursor sync after applying suggestions.
- PR #2563: Built direct DOM text node manipulation for Lexical editors, bypassing WhatsApp Web's ignored synthetic events. Consolidated Slate/CkEditor/DraftJS into a shared replacement handler.
- PR #2597: Built dedicated Draft.js handler with deferred execution for multiline replacement on X/Twitter. Created shared multiline test factory with visual-position highlight sorting.
- PR #2617: Rewrote generic contenteditable handler with surgical DOM replacement, preserving cursor position for editors like Notion. Extracted shared test factories across all editor specs.
- PR #2650: Rewrote textarea/input replacement to preserve cursor position and native undo history. Unified test factories with element-type auto-detection.
- PR #3112: Built Selection/Range save-restore around suggestion popup dismiss, preventing cursor jump to position 0 across Draft.js, Slate, and Lexical editors.
Skills
- Browser Extension: DOM Manipulation | Content Scripts | MutationObserver | execCommand
- Testing: Playwright E2E | Cross-browser Testing (Chrome, Firefox)
- Editors: Draft.js | Lexical | Slate | ProseMirror