What's Changed
Howdy! Today, I'm starting a new tradition for Harper. Instead of the bland, colorless release notes you've been receiving for past releases, you'll now be getting these new, awesome release notes I type up myself.
The hope is that by writing these notes directly, in addition to the updates on my blog, I can get closer to you guys, the people using Harper. I'll share some of the things on my mind, the places Harper is going, and the wonderful work Harper's community has gotten done since the last release.
We have a ton of updates and bug fixes coming in this release. I'll cover some of my favorite changes, but I won't be able to cover everything. You can find a list of ALL the changes in the PR notes at the end.
First off, we've simplified some parts of Harper's UI. In the desktop app, instead of seeing a green or red bar to signify if Harper is activated, you should see a dot below the Harper logo in the menu if the service is running. If the service is not running, there's no dot. Simple enough. You'll also observe that the menu bar should look much nicer in both light and dark modes. In the Chrome Extension, we've reverted some of the changes from v3.0.0 that made the popup menu (what you get when you click on the Harper logo) more "exciting". They were distracting and a little confusing, so we banished them.
Secondly, I've done a ton of work fixing bugs in our support for Google Docs. You should now see correct behavior when Harper checks sentences that span multiple pages and tables should now play more nicely with suggestions. Plus, thanks to @mvanhorn, we have some improved support for editors like WordPress' Gutenberg.
In the desktop app, we're pushing out some similar improvements. We got some reports that Harper didn't play well with setups with multiple monitors. It should be much cleaner now.
We also got some feedback that the Desktop app was a little confusing. We heard similar feedback a while ago about the Chrome Extension, which we addressed with a tip system. We set a similar "tip" system up for the Desktop app. We shall see if it help make things a little less confusing. From now on, you'll occasionally see tips appear when you review a highlighted problem in your text.
The most important changes, as always, were in our core grammar engine. We've added a ton of new rules and fixed a number of broken ones. Thanks to everyone who opened PRs in that vein, especially @hippietrail who's been reviewing them so prodigiously.
I'll talk to you again in the next release! Thanks for using Harper. Have a great weekend.
Best, Elijah Potter (@elijah-potter)
The PRs We Merged
- feat: kids-friendly → kid-friendly by @hippietrail in #4706
- fix(web): icons in the FAQ section looked weird by @elijah-potter in #4668
- feat(web): add time-series graph to the dashboard for reported lint frequency by @elijah-potter in #4712
- feat: redundant 'my first half of my life' etc. by @hippietrail in #4684
- feat: accuse as → accuse of by @hippietrail in #4700
- feat: tent to → tend to by @hippietrail in #4701
- fix(chrome-ext): remove distracting visual elements from the popup by @elijah-potter in #4713
- fix(ls): avoid config/doc_state lock-order deadlock by @willismonroe in #4711
- fix(core): don't flag a compound noun followed by a modal verb by @ozenyunus35 in #4630
- feat(core): flag "tenant" where "tenet" is meant by @manduinca in #4425
- fix(lint-framework): don't mistake a foreign element for the highlight style by @braklo in #4504
- test(core): prove that #4692 is fixed by @elijah-potter in #4715
- feat: the all the → all the by @hippietrail in #4702
- fix(core): don't insert a space between ¥ and the amount by @drakeo338 in #4450
- feat(web): restyle the "uninstall-browser-extension" page by @elijah-potter in #4717
- fix(desktop): remove useless setting by @elijah-potter in #4718
- feat(desktop): redesign icon to be more easily visible in both light and dark modes by @elijah-potter in #4719
- build(deps): bump tree-sitter-haskell from 0.23.1 to 0.24.1 by @dependabot[bot] in #4720
- build(deps): bump rustls from 0.23.45 to 0.23.46 in /harper-desktop/src-tauri by @dependabot[bot] in #4724
- fix: wrong variants of "an arm and a leg" by @hippietrail in #4726
- fix(web): broken dark mode by @elijah-potter in #4727
- feat(harper-editor): add storybook by @elijah-potter in #4728
- feat: clown one's judgment → cloud one's judgement by @hippietrail in #4725
- fix(core): flag 'get access at' and suggest 'get access to' (#3309) by @hammadmunir959 in #3880
- feat(harper-editor): add a dark mode by @elijah-potter in #4729
- fix(web): install-browser-extension page dark mode quirks by @elijah-potter in #4733
- feat: redundant "way with which" → "way" alone by @hippietrail in #4739
- Seems like adjective by @hippietrail in #4745
- feat(web): detect browser when the user submits feedback upon uninstallation by @elijah-potter in #4746
- fix(web): incorrect date reporting in graphs by @elijah-potter in #4747
- feat: wreck/wrack one's brain → rack one's brain by @hippietrail in #4687
- Dictionary curation 2026 10 29 by @hippietrail in #4740
- feat: cool, calm, and collective → ... and collected by @hippietrail in #4743
- feat: "sufficient enough" → "sufficient" or "enough" by @hippietrail in #4750
- fix(web): show the correct link for the user's browser by @elijah-potter in #4757
- feat(web): show browser extension install links on the home page by @elijah-potter in #4758
- docs(weir): compare wildcards to regex
.instead of*by @costajohnt in #4763 - feat: fan fare/fan-fare → fanfare by @hippietrail in #4766
- feat: backlash vs backslash by @hippietrail in #4768
- feat: redundant self-level itself by @hippietrail in #4778
- feat: Upgrade Vite to v8 and disable SSR on broken pages by @elijah-potter in #4787
- fix: add "gatekeep" to
irregular_verbs.jsonby @hippietrail in #4785 - fix(web): present correct metadata in head by @elijah-potter in #4764
- docs: start PR template with link to agent policy by @hippietrail in #4790
- feat: a bit of → a few / a couple of by @hippietrail in #4774
- feat: expand "blanketed statement" to "blanked", "blanker", and plurals by @hippietrail in #4780
- feat: round about → roundabout by @hippietrail in #4793
- chore(chrome-ext): add spell checker to extension title by @elijah-potter in #4796
- feat: all that's X are → all that's X is by @hippietrail in #4798
- feat: what so ever → whatsoever by @hippietrail in #4799
- feat: we see us → we see each other by @hippietrail in #4802
- fix(chrome-ext): Typst editors did not properly use
<br>by @elijah-potter in #4732 - fix(web): remove SveltePress by @elijah-potter in #4803
- fix(web): keep site utilities after prebuilt CSS by @retrofox in #4811
- fix(web): the dark mode had some regressions by @elijah-potter in #4817
- fix: keep the editor typable after clicking a highlighted lint by @mvanhorn in #3834
- feat: flag verb agreement errors in questions by @mcampal in #4823
- feat(chrome-ext): button to clear ignored lints by @elijah-potter in #4829
- fix(web): fix loading of the LazyEditor by @elijah-potter in #4832
- docs: use level 2 headings in GitHub templates by @GaryJones in #4819
- feat: flag "agree" used after "am", "is" or "are" by @mcampal in #4831
- chore(web): remove old unused presentation by @elijah-potter in #4834
- Use the Xcode 26.6 v2 CI image by @twstokes in #4836
- feat(chrome-ext): allow users to hover over suggestions to open them by @elijah-potter in #4839
- feat: flag "depend of" where "depend on" is meant by @mcampal in #4833
- feat(core): correct
dointodoingby @elijah-potter in #4848 - fix(desktop): only show the suggestion popup on the monitor being edited by @amsultan2010 in #4651
- fix(web): add final browser extension setup slide by @elijah-potter in #4840
- fix: suggest "a lot" and "lots" for "a lots" by @hippietrail in #4770
- fix: dict entries for forms of
strikeandstriveby @hippietrail in #4816 - feat: the worse thing→the worst thing by @hippietrail in #4800
- feat: mixing up "of" and "off" (after quantifiers) by @hippietrail in #4754
- feat: expand discourse markers, add gating by @andersmmg in #4806
- fix(chrome-ext): preserve sentences across Google Docs pages by @elijah-potter in #4756
- feat(desktop): add tip system by @elijah-potter in #4847
- fix(chrome-ext): correctly apply suggestions in Google Doc table by @elijah-potter in #4761
- fix(chrome-ext): bind Google Docs corrections to exact text by @elijah-potter in #4788
New Contributors
- @willismonroe made their first contribution in #4711
- @manduinca made their first contribution in #4425
- @drakeo338 made their first contribution in #4450
- @hammadmunir959 made their first contribution in #3880
- @retrofox made their first contribution in #4811
- @mcampal made their first contribution in #4823
- @GaryJones made their first contribution in #4819
- @twstokes made their first contribution in #4836
- @amsultan2010 made their first contribution in #4651
- @andersmmg made their first contribution in #4806
Full Changelog: v3.0.0...v3.1.0