Repository: Automattic/harper
Pull request #755: docs: update integrations section
Author: login: mcecode
Created: 2025-02-23T16:02:20Z | Merged: 2025-03-06T20:10:19Z

# Issues 

Not an issue, but a discussion on #710.

# Description

- [x] Rearrange integrations section's navigation (language server which powers editor integrations > editors with official plugins > editors that directly integrate with `harper-ls` > editors with third-party/community plugins) 
- [x] Transfer VS Code readme info to official docs
- [x] Transfer VS Code development guide to official docs
- [x] Remove non-Neovim specific installation methods in the Neovim page
- [x] Transfer the configuration section explanations from the Neovim page to a new configuration section in the language server page
- [x] Add link to language server installation instructions and sample config in the Helix page
- [x] Add link to language server installation instructions and sample config in the Emacs page
- [x] Add code actions section in language server page

**Note:** I removed the "Copy Default Config to Clipboard" button in the Neovim page for now, but I'll try to bring it back in another PR so this one can focus on the docs' contents rather than functionality.

# How Has This Been Tested?

- Using Harper in VS Code
- Using `just dev-web` and viewing the results in my browser

# Checklist

- [x] I have performed a self-review of my own code
- [ ] I have added tests to cover my changes


Diff:
diff --git a/README.md b/README.md
index cbb5f0f1d0..3066a4ebf8 100644
--- a/README.md
+++ b/README.md
@@ -43,8 +43,14 @@ Just make sure to read [our contribution guidelines first.](https://github.com/a
 ## Links
 
 - [Frequently Asked Questions](https://writewithharper.com/docs/faq)
+- [Obsidian Documentation](https://writewithharper.com/docs/integrations/obsidian)
 - [`harper-ls` Documentation](https://writewithharper.com/docs/integrations/language-server)
-- [Neovim Support](https://writewithharper.com/docs/integrations/neovim)
+- Supported Editors' Documentation
+  - [Visual Studio Code](https://writewithharper.com/docs/integrations/visual-studio-code)
+  - [Neovim](https://writewithharper.com/docs/integrations/neovim)
+  - [Helix](https://writewithharper.com/docs/integrations/helix)
+  - [Emacs](https://writewithharper.com/docs/integrations/emacs)
+  - [Zed](https://writewithharper.com/docs/integrations/zed)
 - [`harper.js` Documentation](https://writewithharper.com/docs/harperjs/introduction)
 - [Official Discord Server](https://discord.com/invite/JBqcAaKrzQ)
 
diff --git a/packages/vscode-plugin/README.md b/packages/vscode-plugin/README.md
index e5e0610315..1e0d8fe9a2 100644
--- a/packages/vscode-plugin/README.md
+++ b/packages/vscode-plugin/README.md
@@ -1,35 +1,9 @@
 # Harper for VS Code
 
-Harper is the next-generation grammar checker for your code. It catches common stylistic errors, as well as complex grammatical or layout-related problems. It works for almost [all common programming languages](./language-server#Supported-Languages) and a number of markup formats.
+Harper is the next-generation grammar checker for your code. It catches common stylistic errors, as well as complex grammatical or layout-related problems. It works for almost [all common programming languages](https://writewithharper.com/docs/integrations/language-server#Supported-Languages) and a number of markup formats.
 
 If you use Rust, Java, JavaScript, or any number of other programming languages, your comments may end up as part of your API's documentation. If that's the case, grammatical mistakes in your code could be down-ranking your site on search results and tarnishing your reputation for quality.
 
 Most importantly, Harper runs on-device and uses barely any memory at all. That means you can get feedback on your work in milliseconds, dramatically increasing your iteration speed.
 
-## Installation
-
-Installation should be relatively straightforward.
-It just depends on which editor and marketplace you're using.
-
-If you use the official Microsoft Visual Studio Code release, go ahead and go to the marketplace and search for "Harper" and click "Install".
-You can also visit our [official page](https://marketplace.visualstudio.com/items?itemName=elijah-potter.harper&ssr=false#overview).
-
-If you use OpenVSX, for instance if you use VSCodium, you'll want to install from [here](https://open-vsx.org/extension/elijah-potter/harper).
-
-### Commands
-
-| Command                         | Id                              | Description         |
-| ------------------------------- | ------------------------------- | ------------------- |
-| Harper: Restart Language Server | `harper.languageserver.restart` | Restart `harper-ls` |
-
-### Settings
-
-| Setting                        | Type                                              | Default Value   | Description                                                                                                                                                 |
-| ------------------------------ | ------------------------------------------------- | --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `harper-ls.path`               | `string`                                          | `""`            | Optional path to a `harper-ls` executable to use. Primarily useful if the bundled binary doesn't work in your system like in immutable Linux distributions. |
-| `harper-ls.linters.*`          | `boolean`                                         | Varies          | Detect and provide suggestions in a variety of common situations.                                                                                           |
-| `harper-ls.diagnosticSeverity` | `"error"`, `"hint"`, `"information"`, `"warning"` | `"information"` | How severe do you want diagnostics to appear in the editor?                                                                                                 |
-
-## Developing and Contributing
-
-See the [Development Guide](/packages/vscode-plugin/development-guide.md).
+You can learn more about [this extension](https://writewithharper.com/docs/integrations/visual-studio-code) and [Harper](https://writewithharper.com/docs/about) over at our [official website](https://writewithharper.com).
diff --git a/packages/vscode-plugin/development-guide.md b/packages/vscode-plugin/development-guide.md
index 6fd16ee06b..e43533ac65 100644
--- a/packages/vscode-plugin/development-guide.md
+++ b/packages/vscode-plugin/development-guide.md
@@ -1,48 +1,3 @@
 # Development Guide
 
-This document details how to develop the extension locally. If you're interested in how it's packaged for distribution, you can checkout the [Package VS Code Plugin](/.github/workflows/package_vscode_plugin.yml) workflow.
-
-## Notes
-
-- The extension code and its tests live in the `src` directory. Most changes you'll need to make will be there.
-- VS Code can only pickup the tasks and launch configurations set in `packages/vscode-plugin/.vscode` if this directory, `packages/vscode-plugin`, not the root of the Harper repository, is open.
-- You can look at the project's [`justfile`](/justfile) to see exactly what running the `just` recipes below do.
-
-## Prerequisites
-
-- Make sure to read the [Contributing guide](/CONTRIBUTING.md) and follow the "Setup Your Environment" section.
-- Before running or testing the extension using VS Code's Debugger, make sure you have `harper-ls` in `packages/vscode-plugin/bin`. You can either manually create the directory, compile `harper-ls`, and put it there or you can run `just test-vscode` or `just package-vscode` which will do that for you.
-
-## Running the Extension
-
-1. Open the Run and Debug view by selecting it from the Activity Bar or by pressing `Ctrl+Shift+D`.
-2. Choose `Run Extension`, if not chosen already.
-3. Click the play (Start Debugging) button or press `F5`.
-
-## Running the Tests
-
-### Using VS Code's Debugger
-
-1. Open the Run and Debug view by selecting it from the Activity Bar or by pressing `Ctrl+Shift+D`.
-2. Choose `Test Extension`, if not chosen already.
-3. Click the play (Start Debugging) button or press `F5`.
-
-### Using the Command Line
-
-```console
-just test-vscode
-```
-
-## Packaging and Installing the Extension
-
-1. Package the extension:
-
-   ```console
-   just package-vscode
-   ```
-
-2. Install the extension:
-
-   ```console
-   code --install-extension path/to/created/.vsix
-   ```
+This document has been moved to the [official documentation](https://writewithharper.com/docs/contributors/visual-studio-code).
diff --git a/packages/vscode-plugin/package.json b/packages/vscode-plugin/package.json
index 67f3e75c8f..582c54e1fc 100644
--- a/packages/vscode-plugin/package.json
+++ b/packages/vscode-plugin/package.json
@@ -81,7 +81,7 @@
 					"scope": "resource",
 					"type": "boolean",
 					"default": false,
-					"description": "Make code actions appear in \"stable\" positions by placing code actions that should always be available like adding misspelled words in the dictionary first."
+					"description": "Make code actions appear in \"stable\" positions by placing code actions that should always be available, like adding misspelled words in the dictionary, first."
 				},
 				"harper.diagnosticSeverity": {
 					"scope": "resource",
diff --git a/packages/web/src/app.css b/packages/web/src/app.css
index ae428a8c0c..99f33f1c99 100644
--- a/packages/web/src/app.css
+++ b/packages/web/src/app.css
@@ -7,6 +7,10 @@
 		@apply list-disc pl-4;
 	}
 
+	ol {
+		@apply list-decimal pl-4;
+	}
+
 	h1 {
 		@apply text-5xl py-4;
 	}
@@ -19,6 +23,10 @@
 		@apply text-xl sm:text-xl lg:text-2xl py-4;
 	}
 
+	h4 {
+		@apply font-bold;
+	}
+
 	p {
 		@apply lg:text-base md:text-lg xl:text-lg py-4;
 	}
diff --git a/packages/web/src/routes/docs/contributors/review/+page.md b/packages/web/src/routes/docs/contributors/review/+page.md
index 6c02b2fb2f..c11ce20f03 100644
--- a/packages/web/src/routes/docs/contributors/review/+page.md
+++ b/packages/web/src/routes/docs/contributors/review/+page.md
@@ -24,13 +24,13 @@ Most of our build tooling exists for Harper's various integrations.
 If you are testing `harper-core`, you can skip all the fluff and compile the patch using [Cargo](https://doc.rust-lang.org/cargo/) directly.
 
 ```bash
-cargo install --git https://github.com/automattic/harper --branch <branch-name> <binary-artifact>
+cargo install --git https://github.com/automattic/harper --branch <branch-name> <binary-artifact> --locked
 ```
 
 For example, for [PR #445](https://github.com/Automattic/harper/pull/455), we can install the patched version of the `harper-cli` debug tool with the following command:
 
 ```bash
-cargo install --git https://github.com/automattic/harper --branch somewhat-something harper-cli
+cargo install --git https://github.com/automattic/harper --branch somewhat-something harper-cli --locked
 ```
 
 From there, you can run the tool on any file with `harper-cli lint <path>`.
diff --git a/packages/web/src/routes/docs/contributors/visual-studio-code/+page.md b/packages/web/src/routes/docs/contributors/visual-studio-code/+page.md
new file mode 100644
index 0000000000..700068ddb4
--- /dev/null
+++ b/packages/web/src/routes/docs/contributors/visual-studio-code/+page.md
@@ -0,0 +1,50 @@
+---
+title: Visual Studio Code
+---
+
+This document details how to develop the Visual Studio Code extension locally. If you're interested in how it's packaged and distributed, you can checkout the [Release VS Code Plugin](https://github.com/Automattic/harper/blob/master/.github/workflows/release_vscode_plugin.yml) workflow.
+
+## Notes
+
+- The extension code and its tests live in the `packages/vscode-plugin/src` directory. Most changes you'll need to make will be there.
+- VS Code can only pickup the tasks and launch configurations set in `packages/vscode-plugin/.vscode` if this directory, `packages/vscode-plugin`, not the root of the Harper repository, is open.
+- You can look at the project's [`justfile`](https://github.com/Automattic/harper/blob/master/justfile) to see exactly what running the `just` recipes below do.
+
+## Prerequisites
+
+- Make sure to [set up your environment](./environment).
+- Before running or testing the extension using VS Code's Debugger, make sure you have `harper-ls` in `packages/vscode-plugin/bin`. You can either manually create the directory, compile `harper-ls`, and put it there or you can run `just test-vscode` or `just package-vscode` which will do that for you.
+
+## Running the Extension
+
+1. Open the Run and Debug view by selecting it from the Activity Bar or by pressing `Ctrl+Shift+D`.
+2. Choose `Run Extension`, if not chosen already.
+3. Click the play (Start Debugging) button or press `F5`.
+
+## Running the Tests
+
+### Using VS Code's Debugger
+
+1. Open the Run and Debug view by selecting it from the Activity Bar or by pressing `Ctrl+Shift+D`.
+2. Choose `Test Extension`, if not chosen already.
+3. Click the play (Start Debugging) button or press `F5`.
+
+### Using the Command Line
+
+```bash
+just test-vscode
+```
+
+## Packaging and Installing the Extension
+
+1. Package the extension:
+
+   ```bash
+   just package-vscode
+   ```
+
+2. Install the extension:
+
+   ```bash
+   code --install-extension path/to/created/.vsix
+   ```
diff --git a/packages/web/src/routes/docs/faq/+page.md b/packages/web/src/routes/docs/faq/+page.md
index db4a4bf2d0..5455904492 100644
--- a/packages/web/src/routes/docs/faq/+page.md
+++ b/packages/web/src/routes/docs/faq/+page.md
@@ -7,7 +7,7 @@ title: Frequently Asked Questions
 **Short answer**: not yet.
 
 **Long answer:** at the time of writing, we've just released our first version of `harper.js` ([documentation here](./harperjs/introduction)), which will make it significantly easier to build such a product.
-That said, our road map has higher priority items at the moment, so don't expect the offical Harper maintainers to make an attempt in the near future.
+That said, our road map has higher priority items at the moment, so don't expect the official Harper maintainers to make an attempt in the near future.
 
 If you're interested in trying to make one, let us know how it goes.
 We might be able to help.
@@ -21,6 +21,6 @@ We are entirely open to PRs that add support.
 If you just want to be able to run grammar checking on your code's comments, it's actually quite straightforward.
 You can use [this PR as a model for what to do](https://github.com/Automattic/harper/pull/332).
 
-### Where Did the Name Harper Come From?
+## Where Did the Name Harper Come From?
 
 See [this blog post](https://elijahpotter.dev/articles/naming_harper).
diff --git a/packages/web/src/routes/docs/integrations/emacs/+page.md b/packages/web/src/routes/docs/integrations/emacs/+page.md
index 61d40420d7..f28ed95e7c 100644
--- a/packages/web/src/routes/docs/integrations/emacs/+page.md
+++ b/packages/web/src/routes/docs/integrations/emacs/+page.md
@@ -2,5 +2,59 @@
 title: Emacs
 ---
 
-Our Emacs support is limited and primarily provided by the community.
-You can see the longer discussion [here](https://github.com/Automattic/harper/discussions/150).
+Our Emacs integration is powered by [`harper-ls`](./language-server).
+
+## Required Setup
+
+Make sure you have [`harper-ls` installed](./language-server#Installation) on your system and available in your `PATH`.
+
+Since version 29, Emacs has had native support for the Language Server Protocol through [Eglot](https://www.gnu.org/software/emacs/manual/html_mono/eglot.html), so all you have to do is configure it to use `harper-ls` in your `init.el`:
+
+```elisp title=init.el
+(with-eval-after-load 'eglot
+  (add-to-list 'eglot-server-programs
+               '(text-mode . ("harper-ls" "--stdio"))))
+```
+
+where `text-mode` can be set to any, some, or all major modes that correspond to the [languages `harper-ls` supports](./language-server#Supported-Languages). Typically, if you may want to use `harper-ls` to edit Markdown files and you have [`markdown-mode`](https://jblevins.org/projects/markdown-mode) installed, you can configure it like this:
+
+```elisp title=init.el
+(with-eval-after-load 'eglot
+  (add-to-list 'eglot-server-programs
+               '(markdown-mode . ("harper-ls" "--stdio"))))
+```
+
+## Optional Configuration
+
+Additionally, you can also configure things like which linters to use or how you want code actions to appear. Below is an example config where everything is set to their default values:
+
+```elisp title=init.el
+(setq-default eglot-workspace-configuration
+              '(:harper-ls (:userDictPath ""
+                            :fileDictPath ""
+                            :linters (:SpellCheck t
+                                      :SpelledNumbers :json-false
+                                      :AnA t
+                                      :SentenceCapitalization t
+                                      :UnclosedQuotes t
+                                      :WrongQuotes :json-false
+                                      :LongSentences t
+                                      :RepeatedWords t
+                                      :Spaces t
+                                      :Matcher t
+                                      :CorrectNumberSuffix t)
+                            :codeActions (:ForceStable :json-false)
+                            :markdown (:IgnoreLinkTitle :json-false)
+                            :diagnosticSeverity "hint"
+                            :isolateEnglish :json-false)))
+```
+
+:::note
+This example only contains some of the available linters, check out our [rules page](../rules) to view the full list.
+:::
+
+For more information on what each of these configs do, you can head over to the [configuration section](./language-server#Configuration) of our `harper-ls` documentation.
+
+## Additional Links
+
+- [Community discussion on configuring `harper-ls` for Emacs](https://github.com/Automattic/harper/discussions/150)
diff --git a/packages/web/src/routes/docs/integrations/helix/+page.md b/packages/web/src/routes/docs/integrations/helix/+page.md
index 0536aa5942..27dc4bbe19 100644
--- a/packages/web/src/routes/docs/integrations/helix/+page.md
+++ b/packages/web/src/routes/docs/integrations/helix/+page.md
@@ -1,15 +1,77 @@
 ---
-title: Helix Support
+title: Helix
 ---
 
-To use Harper in [Helix](https://helix-editor.com/), you'll need to have `harper-ls` installed.
+Our Helix integration is powered by [`harper-ls`](./language-server).
 
-Once you do, add this to you configuration:
+## Required Setup
 
-```toml
+Make sure you have [`harper-ls` installed](./language-server#Installation) on your system and available in your `PATH`.
+
+Helix supports language servers [out-of-the-box](https://docs.helix-editor.com/languages.html), but you'll still need to configure it to use `harper-ls`. First, you need to tell Helix how it should run `harper-ls`:
+
+```toml title=languages.toml
 [language-server.harper-ls]
 command = "harper-ls"
 args = ["--stdio"]
 ```
 
-Helix has [official documentation](https://github.com/helix-editor/helix/wiki/Language-Server-Configurations#harper-ls) as well.
+Then, for all the [languages `harper-ls` supports](./language-server#Supported-Languages) that you want it to be enabled for, you need to declare the following in your `languages.toml`:
+
+```toml title=languages.toml
+[[language]]
+name = "language-id"
+language-servers = ["default-servers", "harper-ls"]
+```
+
+where `language-id` is the language ID of the language you want `harper-ls` to be used for and `default-servers` are any of the [default language servers](https://docs.helix-editor.com/lang-support.html) supported by Helix that you use for that language. For example, if you want to configure it for Markdown and you use both Marksman and Markdown-Oxide, you'd end up with this:
+
+```toml title=languages.toml
+[[language]]
+name = "markdown"
+language-servers = ["marksman", "markdown-oxide", "harper-ls"]
+```
+
+You need to include the default language servers since there currently isn't a way to append a language server to the default `language-servers` list. Of course, you can also add other language servers you use before or after `harper-ls`.
+
+## Optional Configuration
+
+Additionally, you can also configure things like which linters to use or how you want code actions to appear. Below is an example config where everything is set to their default values:
+
+```toml title=languages.toml
+[language-server.harper-ls.config.harper-ls]
+userDictPath = ""
+fileDictPath = ""
+diagnosticSeverity = "hint"
+isolateEnglish = false
+
+[language-server.harper-ls.config.harper-ls.linters]
+SpellCheck = true
+SpelledNumbers = false
+AnA = true
+SentenceCapitalization = true
+UnclosedQuotes = true
+WrongQuotes = false
+LongSentences = true
+RepeatedWords = true
+Spaces = true
+Matcher = true
+CorrectNumberSuffix = true
+
+[language-server.harper-ls.config.harper-ls.codeActions]
+ForceStable = false
+
+[language-server.harper-ls.config.harper-ls.markdown]
+IgnoreLinkTitle = false
+```
+
+:::note
+This example only contains some of the available linters, check out our [rules page](../rules) to view the full list.
+:::
+
+For more information on what each of these configs do, you can head over to the [configuration section](./language-server#Configuration) of our `harper-ls` documentation.
+
+## Additional Links
+
+- [Helix's official documentation on `harper-ls`](https://github.com/helix-editor/helix/wiki/Language-Server-Configurations#harper-ls)
+- [Community discussion on configuring `harper-ls` for Helix](https://github.com/Automattic/harper/discussions/135)
diff --git a/packages/web/src/routes/docs/integrations/language-server/+page.md b/packages/web/src/routes/docs/integrations/language-server/+page.md
index 1e9043a6aa..6f8d34f96b 100644
--- a/packages/web/src/routes/docs/integrations/language-server/+page.md
+++ b/packages/web/src/routes/docs/integrations/language-server/+page.md
@@ -5,28 +5,35 @@ title: Language Server
 `harper-ls` is the [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) frontend for Harper.
 Out of the box, it has built-in support for parsing the comments of most programming languages, as well as any and all Markdown files.
 
-### Cargo
+## Installation
+
+### Scoop
 
-If you have [Rust installed](https://www.rust-lang.org/tools/install), you're in luck!
-To install `harper-ls`, simply run:
+You can install Harper on Windows through [Scoop](https://scoop.sh/#/apps?q=harper).
 
 ```bash
-cargo install harper-ls --locked
+scoop install harper
 ```
 
-For this to work, make sure that `~/.cargo/bin` is in your system `$PATH`. If you are on a Debian-based Linux distribution, you may need to install `build-essential`.
+### Homebrew
+
+You can install Harper on macOS and Linux through [Homebrew](https://formulae.brew.sh/formula/harper).
+
+```bash
+brew install harper
+```
 
 ### Arch Linux
 
-**Stable Release**
+#### Stable Release
 
-The latest stable release is available through the `extra` repo:
+The latest stable release is available through the [`extra` repo](https://archlinux.org/packages/extra/x86_64/harper):
 
 ```bash
 sudo pacman -S harper
 ```
 
-**Bleeding-Edge**
+#### Bleeding-Edge
 
 If you want the latest bleeding-edge, you can install `harper-git` from the [Arch User Repository](https://aur.archlinux.org/packages/harper-git) with your favorite AUR helper:
 
@@ -35,22 +42,6 @@ paru -S harper-git
 # or yay -S harper-git, etc.
 ```
 
-### Scoop
-
-You can install Harper on Windows through [Scoop](https://scoop.sh/).
-
-```bash
-scoop install harper
-```
-
-### Homebrew
-
-You may install Harper through [Homebrew](https://brew.sh).
-
-```bash
-brew install harper
-```
-
 ### Nixpkgs/NixOS
 
 You may install Harper via
@@ -69,46 +60,164 @@ or if you have the `nix-command` and `flakes` experimental features enabled:
 nix shell 'nixpkgs#harper'
 ```
 
+### Cargo
+
+If you have Rust installed, `harper-ls` is on [crates.io](https://crates.io/crates/harper-ls), so you can simply run:
+
+```bash
+cargo install harper-ls --locked
+```
+
+For this to work, make sure that `~/.cargo/bin` is in your system `$PATH`. If you are on a Debian-based Linux distribution, you may need to install `build-essential`.
+
+### GitHub Releases
+
+If none of the previous installation methods are available to you, we also provide [portable pre-built binaries on GitHub](https://github.com/Automattic/harper/releases).
+
 ## Dictionaries
 
-`harper-ls` has three kinds of dictionaries: user, file-local, and static dictionaries.
+`harper-ls` has three kinds of dictionaries: user, file-local, and static dictionaries. All three dictionaries are combined and used together when spell checking files.
 
 ### User Dictionary
 
-Each user of `harper-ls` has their own dictionary, located in the following directories on each operating system:
-
-| Operating System |                                       Location |
-| :--------------- | ---------------------------------------------: |
-| Linux            |                  `$XDG_CONFIG_HOME/harper-ls/` |
-| MacOS            | `$HOME/Library/Application Support/harper-ls/` |
-| Windows          |             `FOLDERID_LocalAppData/harper-ls/` |
+Each user of `harper-ls` has their own dictionary, which by default, is located in the following directories on each operating system:
 
-This dictionary is a simple line-separated word list in plain-text.
-You can add and remove words at will.
-Code actions on misspelled words allow you to add elements to this list.
+| Operating System |                                                  Location |
+| :--------------- | --------------------------------------------------------: |
+| Linux            | `$XDG_CONFIG_HOME/harper-ls` or `$HOME/.config/harper-ls` |
+| macOS            |             `$HOME/Library/Application Support/harper-ls` |
+| Windows          |                     `%FOLDERID_RoamingAppData%/harper-ls` |
 
-This was added in response to [issue #89](https://github.com/automattic/harper/issues/89).
+This dictionary is a simple line-separated word list in plaintext. You can add and remove words at will. Code actions on misspelled words allow you to add elements to this list. Additionally, [its location is configurable](#Dictionaries_).
 
 ### File-Local Dictionary
 
-Sometimes, you'll encounter a word (or name) that is only valid within the context of a specific file.
-In this case, you can use the code action that adds the word to the file-local dictionary.
-Any words added to this dictionary will, like the name implies, only be included in the dictionary when performing corrections on the file at that specific path.
+Sometimes, you'll encounter a word (or name) that is only valid within the context of a specific file. In this case, you can add this file-specific word to a file-local dictionary using code actions. Any words added to this dictionary will only be included in the combined dictionary when spell checking a file at that specific path.
 
-You can find the file-local dictionaries in the following directories on each operation system:
+You can find the file-local dictionaries in the following directories by default on each operation system:
 
 | Operating System |                                                                                         Location |
 | :--------------- | -----------------------------------------------------------------------------------------------: |
 | Linux            | `$XDG_DATA_HOME/harper-ls/file_dictionaries` or `$HOME/.local/share/harper-ls/file_dictionaries` |
-| MacOS            |                                  `$HOME/Library/Application Support/harper-ls/file_dictionaries` |
-| Windows          |                                              `FOLDERID_LocalAppData/harper-ls/file_dictionaries` |
+| macOS            |                                  `$HOME/Library/Application Support/harper-ls/file_dictionaries` |
+| Windows          |                                            `%FOLDERID_LocalAppData%/harper-ls/file_dictionaries` |
+
+The format of these files is identical to user dictionaries and [their location can also be configured](#Dictionaries_).
+
+### Static Dictionary
+
+The static dictionary is built into the binary and is (as of now) immutable. It contains almost all words you could possibly encounter.
+
+We _do_ take pull requests or issues for adding words to the static dictionary. [Read the documentation on the matter before you do](../contributors/dictionary).
+
+## Code Actions
+
+`harper-ls` has code actions that help in quickly dealing with spelling or grammar errors you encounter. The examples below assume that you have misspelled "contained" as "containes" and have selected it to apply a code action to it.
 
-The format of these files is identical to user dictionaries.
+| Code Action or Command | Description                                                | Example                                     |
+| ---------------------- | ---------------------------------------------------------- | ------------------------------------------- |
+| Quick Fixes            | Suggests fixes for the selected error                      | `Replace with: "contained"`                 |
+| `HarperIgnoreLint`     | Ignores the selected error for the duration of the session | `Ignore Harper error.`                      |
+| `HarperAddToUserDict`  | Adds the selected word to the user dictionary              | `Add "containes" to the global dictionary.` |
+| `HarperAddToFileDict`  | Adds the selected word to a file-local dictionary          | `Add "containes" to the file dictionary.`   |
 
-### Configuration
+## Configuration
 
-Configuration of `harper-ls` varies by editor.
-If you use Neovim, [read this documentation](./neovim#Configuration).
+`harper-ls` expects a JSON object with a `harper-ls` key that contains your configs:
+
+```json
+{
+	"harper-ls": {
+		// Your config goes here...
+	}
+}
+```
+
+### Dictionaries
+
+| Config         | Type     | Default Value | Description                                                     |
+| -------------- | -------- | ------------- | --------------------------------------------------------------- |
+| `userDictPath` | `string` | `""`          | Set the directory where the user dictionary is located          |
+| `fileDictPath` | `string` | `""`          | Set the directory where the file-local dictionaries are located |
+
+### Linters
+
+These configs are under the `linters` key:
+
+```json
+{
+	"harper-ls": {
+		"linters": {
+			// Your linter configs go here...
+		}
+	}
+}
+```
+
+The list of linters together with their descriptions can be found at our [rules page](../rules). All linters are of `boolean` type. Here's an example config with some of them and their default values:
+
+```json
+{
+	"harper-ls": {
+		"linters": {
+			"SpellCheck": true,
+			"SpelledNumbers": false,
+			"AnA": true,
+			"SentenceCapitalization": true,
+			"UnclosedQuotes": true,
+			"WrongQuotes": false,
+			"LongSentences": true,
+			"RepeatedWords": true,
+			"Spaces": true,
+			"Matcher": true,
+			"CorrectNumberSuffix": true
+		}
+	}
+}
+```
+
+### Code Actions
+
+These configs are under the `codeActions` key:
+
+```json
+{
+	"harper-ls": {
+		"codeActions": {
+			// Your code action configs go here...
+		}
+	}
+}
+```
+
+| Config        | Type      | Default Value | Description                                                                                                                                                    |
+| ------------- | --------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `ForceStable` | `boolean` | `false`       | Make code actions appear in "stable" positions by placing code actions that should always be available, like adding misspelled words in the dictionary, first. |
+
+### Markdown
+
+These configs are under the `markdown` key:
+
+```json
+{
+	"harper-ls": {
+		"markdown": {
+			// Your Markdown configs go here...
+		}
+	}
+}
+```
+
+| Config            | Type      | Default Value | Description              |
+| ----------------- | --------- | ------------- | ------------------------ |
+| `IgnoreLinkTitle` | `boolean` | `false`       | Skip linting link titles |
+
+### Other Configs
+
+| Config               | Type                                              | Default Value | Description                                                                                                                                                               |
+| -------------------- | ------------------------------------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `diagnosticSeverity` | `"error"`, `"hint"`, `"information"`, `"warning"` | `"hint"`      | Configures how severe diagnostics appear in your editor                                                                                                                   |
+| `isolateEnglish`     | `boolean`                                         | `false`       | In documents that are a mixture of English and another language, only lint English text. This feature is incredibly new and unstable. Do not expect it to work perfectly. |
 
 ## Supported Languages
 
@@ -147,11 +256,3 @@ If you use Neovim, [read this documentation](./neovim#Configuration).
 
 Want your language added?
 Let us know by [commenting on this issue](https://github.com/Automattic/harper/issues/79).
-
-### Static Dictionary
-
-The static dictionary is built into the binary and is (as of now) immutable.
-It contains almost all words you could possibly encounter.
-
-I _do_ take pull requests or issues for adding words to the static dictionary.
-[Read the documentation on the matter before you do.](../contributors/dictionary)
diff --git a/packages/web/src/routes/docs/integrations/neovim/+page.md b/packages/web/src/routes/docs/integrations/neovim/+page.md
index f0f8191aec..7b4a84e59c 100644
--- a/packages/web/src/routes/docs/integrations/neovim/+page.md
+++ b/packages/web/src/routes/docs/integrations/neovim/+page.md
@@ -2,117 +2,30 @@
 title: Neovim
 ---
 
-[Neovim](https://neovim.io/) is a popular open-source text editor.
-Its lack of fast grammar-checking was the primary motivation for creating Harper.
+Our Neovim integration is powered by [`harper-ls`](./language-server).
 
-## Installation
+## Required Setup
 
-How you choose to install `harper-ls` depends on your use-case.
-Right now, we only directly support usage through [`nvim-lspconfig`](https://github.com/neovim/nvim-lspconfig/blob/master/doc/configs.md#harper_ls).
-Refer to the linked documentation for more information.
+Make sure you have `harper-ls` installed and available on your global or Neovim's `PATH`. You can do this using [`mason.nvim`](https://mason-registry.dev/registry/list?search=harper-ls) or via any of our other [supported installation methods](./language-server#Installation).
 
-If you happen to use [`mason.nvim`](https://github.com/williamboman/mason.nvim), installation will be pretty straightforward.
-`harper-ls` is in the official Mason registry, so you can install it the same way you install anything through Mason.
+Though Neovim supports language servers [out-of-the-box](https://neovim.io/doc/user/lsp.html), for ease of use, we suggest using `harper-ls` through [nvim-lspconfig](https://github.com/neovim/nvim-lspconfig).
 
-If you **don't** install your LSPs through Mason, we have binary releases available on [GitHub](https://github.com/Automattic/harper/releases) or you can use one of a number of package managers.
+Once you have `harper-ls` and nvim-lspconfig installed, you need to add this to your `init.lua`:
 
-### Cargo
-
-If you have [Rust installed](https://www.rust-lang.org/tools/install), you're in luck!
-To install `harper-ls`, simply run:
-
-```bash
-cargo install harper-ls --locked
-```
-
-If you are on a Debian-based Linux distribution, you may need to install `build-essential`.
-
-### Arch Linux
-
-Harper is available through the `extra` repo:
-
-```bash
-sudo pacman -S harper
-```
-
-### Scoop
-
-You can install Harper on Windows through [Scoop](https://scoop.sh/).
-
-```bash
-scoop install harper
-```
-
-### Homebrew
-
-You may install Harper through [Homebrew](https://brew.sh).
-
-```bash
-brew install harper
-```
-
-## Configuration
-
-Neovim is also one of the two primarily supported editors for `harper-ls`.
-As such, you can view this page as canonical documentation for the available configuration options.
-[Helix](./helix) and [Zed](./zed) users may also find it helpful.
-
-### Markdown-Specific Config
-
-The Markdown parser has its own configuration option, used to modify its behavior in specific ways.
-For example, the title of a link is linted by default, but this behavior can be changed through the `ignore_link_title` key:
-
-```lua
-lspconfig.harper_ls.setup {
-  settings = {
-    ["harper-ls"] = {
-      markdown = {
-        IgnoreLinkTitle = true,
-      }
-    }
-  },
-}
+```lua title=inti.lua
+require('lspconfig').harper_ls.setup {}
 ```
 
-### Dictionaries
+## Optional Configuration
 
-You do not have to stick with the default dictionary locations ([listed on this page](./language-server)).
-If you use Neovim, you can set the location of the user dictionary with the `userDictPath` key, and the file dictionary with the `fileDictPath` key:
+Additionally, you can also configure things like which linters to use or how you want code actions to appear. Below is an example config where everything is set to their default values:
 
-```lua
-lspconfig.harper_ls.setup {
-  settings = {
-    ["harper-ls"] = {
-      userDictPath = "~/dict.txt",
-      fileDictPath = "~/.harper/",
-    }
-  },
-}
-```
-
-For example, if you want to use Vim's dictionary, you can do something like this:
-
-```lua
-lspconfig.harper_ls.setup {
-  settings = {
-    ["harper-ls"] = {
-      userDictPath = vim.fn.stdpath("config") .. "/spell/en.utf-8.add",
-    }
-  },
-}
-```
-
-See the [relevant issue for details](https://github.com/Automattic/harper/issues/143).
-
-### Linters
-
-Linters are grammatical rules Harper looks for to correct your work.
-You can toggle them on or off to your liking.
-
-```lua
-lspconfig.harper_ls.setup {
+```lua title=inti.lua
+require('lspconfig').harper_ls.setup {
   settings = {
     ["harper-ls"] = {
+      userDictPath = "",
+      fileDictPath = "",
       linters = {
         SpellCheck = true,
         SpelledNumbers = false,
@@ -124,62 +37,27 @@ lspconfig.harper_ls.setup {
         RepeatedWords = true,
         Spaces = true,
         Matcher = true,
-        CorrectNumberSuffix = true,
-      }
-    }
-  },
-}
-```
-
-<script>
-import DefaultNeovimConfig from "$lib/DefaultNeovimConfig.svelte"
-</script>
-
-<DefaultNeovimConfig/>
-
-By default, `harper-ls` will mark all diagnostics with HINT.
-If you want to configure this, refer below:
-
-```lua
-lspconfig.harper_ls.setup {
-  settings = {
-    ["harper-ls"] = {
-        diagnosticSeverity = "hint" -- Can also be "information", "warning", or "error"
-    }
-  },
-}
-```
-
-You can also configure how `harper-ls` displays code actions.
-For example, to make code actions appear in "stable" positions, use the following configuration:
-
-```lua
-lspconfig.harper_ls.setup {
-  settings = {
-    ["harper-ls"] = {
+        CorrectNumberSuffix = true
+      },
       codeActions = {
-        ForceStable = true
-      }
+        ForceStable = false
+      },
+      markdown = {
+        IgnoreLinkTitle = false
+      },
+      diagnosticSeverity = "hint",
+      isolateEnglish = false
     }
-  },
+  }
 }
 ```
 
-If you work with a lot of documents that are a mixture of English and another language, Harper can attempt to automatically detect which is which and only lint the English text.
-To enable it, just set the `isolateEnglish` key.
-
 :::note
-This feature is incredibly new and unstable.
-Do not expect it to work perfectly.
-If improvements are important to you, feel free to [open an issue](https://github.com/Automattic/harper/issues/new?template=Blank+issue) to let us know.
+This example only contains some of the available linters, check out our [rules page](../rules) to view the full list.
 :::
 
-```lua
-lspconfig.harper_ls.setup {
-  settings = {
-    ["harper-ls"] = {
-        isolateEnglish = false
-    }
-  },
-}
-```
+For more information on what each of these configs do, you can head over to the [configuration section](./language-server#Configuration) of our `harper-ls` documentation.
+
+## Additional Links
+
+- [nvim-lspconfig's documentation on `harper-ls`](https://github.com/neovim/nvim-lspconfig/blob/master/doc/configs.md#harper_ls)
diff --git a/packages/web/src/routes/docs/integrations/visual-studio-code/+page.md b/packages/web/src/routes/docs/integrations/visual-studio-code/+page.md
index 997190696e..59452ba161 100644
--- a/packages/web/src/routes/docs/integrations/visual-studio-code/+page.md
+++ b/packages/web/src/routes/docs/integrations/visual-studio-code/+page.md
@@ -2,10 +2,28 @@
 title: Visual Studio Code
 ---
 
-Harper is the next-generation grammar checker for your code. It catches common stylistic errors, as well as complex grammatical or layout-related problems. It works for almost [all common programming languages](./language-server#Supported-Languages) and a number of markup formats.
+For our Visual Studio Code integration, we provide an extension powered by [`harper-ls`](./language-server), which also works for VS Code forks like VSCodium and Windsurf. It's available in the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=elijah-potter.harper) as well as the [Open VSX Registry](https://open-vsx.org/extension/elijah-potter/harper).
 
-If you use Rust, Java, JavaScript, or any number of other programming languages, your comments may be ending up as part of your API's documentation. If that's the case, grammatical mistakes in your code could be down-ranking your site on search results and tarnishing your reputation for quality.
+## Installation
 
-Most importantly, Harper runs on-device and uses barely any memory at all. That means you can get feedback on your work in milliseconds, dramatically increasing your iteration speed.
+Open the Extensions view in your editor by selecting the Extensions icon in the Activity Bar or by using the `Ctrl+Shift+X` keyboard shortcut, then search for "Harper" and click "Install".
 
-Just search for "Harper" in the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=elijah-potter.harper) and hit install!
+If you prefer to use the command line, you can use the following command:
+
+```bash
+code --install-extension elijah-potter.harper
+```
+
+## Commands
+
+| Command                         | ID                              | Description          |
+| ------------------------------- | ------------------------------- | -------------------- |
+| Harper: Restart Language Server | `harper.languageserver.restart` | Restarts `harper-ls` |
+
+## Settings
+
+The settings below are VS Code specific. There are other settings that `harper-ls` supports such as which linters to use or how code actions should appear that you can configure. You can view them in your editor's Settings UI under "Harper" or peruse through them in the [configuration section](./language-server#Configuration) of our `harper-ls` documentation.
+
+| Setting       | Type     | Default Value | Description                                                                                                                                                 |
+| ------------- | -------- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `harper.path` | `string` | `""`          | Optional path to a `harper-ls` executable to use. Primarily useful if the bundled binary doesn't work in your system like in immutable Linux distributions. |
diff --git a/packages/web/src/routes/docs/integrations/zed/+page.md b/packages/web/src/routes/docs/integrations/zed/+page.md
index 5f275d9439..9ff1227e46 100644
--- a/packages/web/src/routes/docs/integrations/zed/+page.md
+++ b/packages/web/src/routes/docs/integrations/zed/+page.md
@@ -2,9 +2,4 @@
 title: Zed
 ---
 
-[Zed](https://zed.dev) is a new editor from the folks who made [Atom](https://atom-editor.cc/).
-It has a host of attractive features that align quite well with Harper's mission (including lightning-fast startup and responsiveness).
-
-The best part: thanks to the wonderful work of community contributors, Harper has support for it!
-To get started, follow the instructions over on the [Zed plugin's README](https://github.com/Stef16Robbe/harper_zed).
-Once installed, it will automatically download and run [`harper-ls`](/docs/integrations/language-server).
+For our Zed integration, we have a [community-maintained extension](https://github.com/Stef16Robbe/harper_zed) that automatically downloads and runs [`harper-ls`](./language-server). For more information on how to install it and how it works, you can head over to the [extension's README](https://github.com/Stef16Robbe/harper_zed/blob/main/README.md).
diff --git a/packages/web/vite.config.ts b/packages/web/vite.config.ts
index 8e5601bb2c..cb04700015 100644
--- a/packages/web/vite.config.ts
+++ b/packages/web/vite.config.ts
@@ -1,8 +1,8 @@
-import wasm from 'vite-plugin-wasm';
-import topLevelAwait from 'vite-plugin-top-level-await';
-import { defineConfig } from 'vite';
-import { sveltepress } from '@sveltepress/vite';
 import { defaultTheme } from '@sveltepress/theme-default';
+import { sveltepress } from '@sveltepress/vite';
+import { defineConfig } from 'vite';
+import topLevelAwait from 'vite-plugin-top-level-await';
+import wasm from 'vite-plugin-wasm';
 
 export default defineConfig({
 	server: {
@@ -44,14 +44,14 @@ export default defineConfig({
 									title: 'Obsidian',
 									to: '/docs/integrations/obsidian'
 								},
-								{
-									title: 'Visual Studio Code',
-									to: '/docs/integrations/visual-studio-code'
-								},
 								{
 									title: 'Language Server',
 									to: '/docs/integrations/language-server'
 								},
+								{
+									title: 'Visual Studio Code',
+									to: '/docs/integrations/visual-studio-code'
+								},
 								{
 									title: 'Neovim',
 									to: '/docs/integrations/neovim'
@@ -60,13 +60,13 @@ export default defineConfig({
 									title: 'Helix',
 									to: '/docs/integrations/helix'
 								},
-								{
-									title: 'Zed',
-									to: '/docs/integrations/zed'
-								},
 								{
 									title: 'Emacs',
 									to: '/docs/integrations/emacs'
+								},
+								{
+									title: 'Zed',
+									to: '/docs/integrations/zed'
 								}
 							]
 						},
@@ -122,6 +122,10 @@ export default defineConfig({
 									title: 'Author a Rule',
 									to: '/docs/contributors/author-a-rule'
 								},
+								{
+									title: 'Visual Studio Code',
+									to: '/docs/contributors/visual-studio-code'
+								},
 								{
 									title: 'Reviewing Pull Requests',
 									to: '/docs/contributors/review'
@@ -150,7 +154,9 @@ export default defineConfig({
 						'scss',
 						'toml',
 						'rust',
-						'lua'
+						'lua',
+						'json',
+						'elisp'
 					]
 				}
 			})


Reviews:
user: login: ficd0
body: ### On the Helix integration:

I think it would be better to get rid of the `Installation` section and instead begin with a `Required Setup` section. This section should say you need `harper-ls` available on your system path, show how to create the `harper-ls` language server inside `languages.toml` (you have these already), but also mention that you need to explicitly enable harper for any languages/filetypes you want it to run on, with an example of how to do that. 

I expand on what I mean by this in comments on the file itself. Please let me know if you're unclear about it. 

What's left of the configuration section, in my opinion you could rename to `Optional Configuration`. This way, it's immediately clear to the user what's *required* in order for harper to work, and what's *optional* for them to tweak to their liking.
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-03T23:07:41Z
user: login: ficd0
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-03T23:16:37Z
user: login: mcecode
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-04T03:45:20Z
user: login: ficd0
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-04T03:50:32Z
user: login: ficd0
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-04T04:46:22Z
user: login: elijah-potter
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-03-04T19:04:13Z
user: login: ficd0
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-05T00:01:23Z
user: login: anarcat
body: lgtm, in general, but since you asked for my advice, i have suggestions :)
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-06T16:00:07Z
user: login: ficd0
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-06T16:25:29Z
user: login: ficd0
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-06T16:26:37Z
user: login: elijah-potter
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-06T20:08:02Z
user: login: elijah-potter
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-06T20:08:13Z
user: login: elijah-potter
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-06T20:08:22Z

Review comments:
diff_hunk: @@ -1,15 +1,59 @@
 ---
-title: Helix Support
+title: Helix
 ---
 
-To use Harper in [Helix](https://helix-editor.com/), you'll need to have `harper-ls` installed.
+Our Helix integration is powered by [`harper-ls`](./language-server).
 
-Once you do, add this to you configuration:
+## Installation
 
-```toml
+[Helix supports language servers out-of-the-box](https://docs.helix-editor.com/languages.html#language-server-configuration), so all you have to do is [install `harper-ls` in your system](./language-server#Installation).
path: packages/web/src/routes/docs/integrations/helix/+page.md
user: login: ficd0
body: The "all you have to do is..." here I think is a bit misleading. When I read this it makes me think that just installing `harper-ls` is enough and it will work with Helix OOTB; and that the following configuration section is optional. 

However, as you mention later the `languages.toml` change is required. 
created_at: 2025-03-03T22:58:37Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,15 +1,59 @@
 ---
-title: Helix Support
+title: Helix
 ---
 
-To use Harper in [Helix](https://helix-editor.com/), you'll need to have `harper-ls` installed.
+Our Helix integration is powered by [`harper-ls`](./language-server).
 
-Once you do, add this to you configuration:
+## Installation
 
-```toml
+[Helix supports language servers out-of-the-box](https://docs.helix-editor.com/languages.html#language-server-configuration), so all you have to do is [install `harper-ls` in your system](./language-server#Installation).
+
+## Configuration
+
+This the minimum you need to add to your `languages.toml` to get up and running:
path: packages/web/src/routes/docs/integrations/helix/+page.md
user: login: ficd0
body: This isn't actually the minimum; you also need to add it to the `language-servers` array for every filetype you want Harper to run on. Here's an example from my `languages.toml`:

```toml
[[language]]
name = "typst"
language-servers = ["tinymist", "harper-ls"]
```

Harper will *only* run for languages that you've explicitly enabled it for in this way. There also isn't a way to "append" a language server to the default `language-servers` array for that language, hence why I'm still including `tinymist` in this config. 

I think this would be very important to add. Otherwise, users may be confused why Harper isn't running even though they've followed the rest of the instructions.  
created_at: 2025-03-03T23:02:46Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,15 +1,59 @@
 ---
-title: Helix Support
+title: Helix
 ---
 
-To use Harper in [Helix](https://helix-editor.com/), you'll need to have `harper-ls` installed.
+Our Helix integration is powered by [`harper-ls`](./language-server).
 
-Once you do, add this to you configuration:
+## Installation
 
-```toml
+[Helix supports language servers out-of-the-box](https://docs.helix-editor.com/languages.html#language-server-configuration), so all you have to do is [install `harper-ls` in your system](./language-server#Installation).
+
+## Configuration
+
+This the minimum you need to add to your `languages.toml` to get up and running:
path: packages/web/src/routes/docs/integrations/helix/+page.md
user: login: ficd0
body: I'm also considering opening a PR to Helix to configure Harper as a default language server for common languages like Markdown, Typst, Latex, etc. If I end up going forward with that, and *if* it gets merged, it'll probably be quite far from now considering Helix is overwhelmed with PRs and few maintainers. So if that ever happens, I'll open a PR to update Harper's documentation accordingly. Until then, these configuration changes are required to use Harper. 
created_at: 2025-03-03T23:16:37Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,15 +1,59 @@
 ---
-title: Helix Support
+title: Helix
 ---
 
-To use Harper in [Helix](https://helix-editor.com/), you'll need to have `harper-ls` installed.
+Our Helix integration is powered by [`harper-ls`](./language-server).
 
-Once you do, add this to you configuration:
+## Installation
 
-```toml
+[Helix supports language servers out-of-the-box](https://docs.helix-editor.com/languages.html#language-server-configuration), so all you have to do is [install `harper-ls` in your system](./language-server#Installation).
+
+## Configuration
+
+This the minimum you need to add to your `languages.toml` to get up and running:
path: packages/web/src/routes/docs/integrations/helix/+page.md
user: login: mcecode
body: > This isn't actually the minimum; you also need to add it to the `language-servers` array for every filetype you want Harper to run on. Here's an example from my `languages.toml`:
> 
> ```toml
> [[language]]
> name = "typst"
> language-servers = ["tinymist", "harper-ls"]
> ```
> 
> Harper will _only_ run for languages that you've explicitly enabled it for in this way. There also isn't a way to "append" a language server to the default `language-servers` array for that language, hence why I'm still including `tinymist` in this config.
> 
> I think this would be very important to add. Otherwise, users may be confused why Harper isn't running even though they've followed the rest of the instructions.

Thanks for pointing this out. My mind totally glossed over

> Harper will need to be manually added to each language you'd like check's language server list.

in the [Helix docs on `harper-ls`](https://github.com/helix-editor/helix/wiki/Language-Server-Configurations#harper-ls).
created_at: 2025-03-04T03:45:20Z
author_association: COLLABORATOR
diff_hunk: @@ -1,15 +1,59 @@
 ---
-title: Helix Support
+title: Helix
 ---
 
-To use Harper in [Helix](https://helix-editor.com/), you'll need to have `harper-ls` installed.
+Our Helix integration is powered by [`harper-ls`](./language-server).
 
-Once you do, add this to you configuration:
+## Installation
 
-```toml
+[Helix supports language servers out-of-the-box](https://docs.helix-editor.com/languages.html#language-server-configuration), so all you have to do is [install `harper-ls` in your system](./language-server#Installation).
+
+## Configuration
+
+This the minimum you need to add to your `languages.toml` to get up and running:
path: packages/web/src/routes/docs/integrations/helix/+page.md
user: login: ficd0
body: No worries! Some sections of that wiki page aren't particularly well written, so I can see why it's misleading. You may consider using Markdown for the example (probably applicable to more people than typst), for which an example config would look like this:

```toml
[[language]]
name = "markdown"
language-servers = ["marksman", "markdown-oxide", "harper-ls"]
```

`marksman` and `markdown-oxide` are the LSPs that are configured by default for Markdown. 
created_at: 2025-03-04T03:50:31Z
author_association: CONTRIBUTOR
diff_hunk: @@ -4,20 +4,38 @@ title: Helix
 
 Our Helix integration is powered by [`harper-ls`](./language-server).
 
-## Installation
+## Required Setup
 
-[Helix supports language servers out-of-the-box](https://docs.helix-editor.com/languages.html#language-server-configuration), so all you have to do is [install `harper-ls` in your system](./language-server#Installation).
+Make sure you have [`harper-ls` installed](./language-server#Installation) in your system and available in your `PATH`.
path: packages/web/src/routes/docs/integrations/helix/+page.md
user: login: ficd0
body: Tiny nitpick, `in your system` should be `on your system`
created_at: 2025-03-04T04:46:21Z
author_association: CONTRIBUTOR
diff_hunk: @@ -2,5 +2,59 @@
 title: Emacs
 ---
 
-Our Emacs support is limited and primarily provided by the community.
-You can see the longer discussion [here](https://github.com/Automattic/harper/discussions/150).
+Our Emacs integration is powered by [`harper-ls`](./language-server).
path: packages/web/src/routes/docs/integrations/emacs/+page.md
user: login: anarcat
body: Now i know what harper-ls is, but as an outsider, i would call it what it is:

```suggestion
Our Emacs integration is powered by the [Harper language server](./language-server).
```
created_at: 2025-03-06T15:56:27Z
author_association: CONTRIBUTOR
diff_hunk: @@ -2,5 +2,59 @@
 title: Emacs
 ---
 
-Our Emacs support is limited and primarily provided by the community.
-You can see the longer discussion [here](https://github.com/Automattic/harper/discussions/150).
+Our Emacs integration is powered by [`harper-ls`](./language-server).
+
+## Required Setup
+
+Make sure you have [`harper-ls` installed](./language-server#Installation) on your system and available in your `PATH`.
+
+Since version 29, Emacs has had native support for the Language Server Protocol through [Eglot](https://www.gnu.org/software/emacs/manual/html_mono/eglot.html), so all you have to do is configure it to use `harper-ls` in your `init.el`:
+
+```elisp title=init.el
+(with-eval-after-load 'eglot
+  (add-to-list 'eglot-server-programs
+               '(major-mode . ("harper-ls" "--stdio"))))
path: packages/web/src/routes/docs/integrations/emacs/+page.md
user: login: anarcat
body: `major-mode` is weird here, just use an actual mode:

```suggestion
               '(text-mode . ("harper-ls" "--stdio"))))
```
created_at: 2025-03-06T15:57:08Z
author_association: CONTRIBUTOR
diff_hunk: @@ -2,5 +2,59 @@
 title: Emacs
 ---
 
-Our Emacs support is limited and primarily provided by the community.
-You can see the longer discussion [here](https://github.com/Automattic/harper/discussions/150).
+Our Emacs integration is powered by [`harper-ls`](./language-server).
+
+## Required Setup
+
+Make sure you have [`harper-ls` installed](./language-server#Installation) on your system and available in your `PATH`.
+
+Since version 29, Emacs has had native support for the Language Server Protocol through [Eglot](https://www.gnu.org/software/emacs/manual/html_mono/eglot.html), so all you have to do is configure it to use `harper-ls` in your `init.el`:
+
+```elisp title=init.el
+(with-eval-after-load 'eglot
+  (add-to-list 'eglot-server-programs
+               '(major-mode . ("harper-ls" "--stdio"))))
+```
+
+where `major-mode` can be set to any, some, or all major modes that correspond to the [languages `harper-ls` supports](./language-server#Supported-Languages). For example, if you want to use `harper-ls` to edit Markdown files and you have [`markdown-mode`](https://jblevins.org/projects/markdown-mode) installed, you can configure it like this:
path: packages/web/src/routes/docs/integrations/emacs/+page.md
user: login: anarcat
body: ```suggestion
where `text-mode` can be set to any, some, or all major modes that correspond to the [languages `harper-ls` supports](./language-server#Supported-Languages). Typically, you may want to use `harper-ls` to edit Markdown files and you have [`markdown-mode`](https://jblevins.org/projects/markdown-mode) installed, you can configure it like this:
```
created_at: 2025-03-06T15:57:47Z
author_association: CONTRIBUTOR
diff_hunk: @@ -2,5 +2,59 @@
 title: Emacs
 ---
 
-Our Emacs support is limited and primarily provided by the community.
-You can see the longer discussion [here](https://github.com/Automattic/harper/discussions/150).
+Our Emacs integration is powered by [`harper-ls`](./language-server).
+
+## Required Setup
+
+Make sure you have [`harper-ls` installed](./language-server#Installation) on your system and available in your `PATH`.
+
+Since version 29, Emacs has had native support for the Language Server Protocol through [Eglot](https://www.gnu.org/software/emacs/manual/html_mono/eglot.html), so all you have to do is configure it to use `harper-ls` in your `init.el`:
+
+```elisp title=init.el
+(with-eval-after-load 'eglot
+  (add-to-list 'eglot-server-programs
+               '(major-mode . ("harper-ls" "--stdio"))))
+```
+
+where `major-mode` can be set to any, some, or all major modes that correspond to the [languages `harper-ls` supports](./language-server#Supported-Languages). For example, if you want to use `harper-ls` to edit Markdown files and you have [`markdown-mode`](https://jblevins.org/projects/markdown-mode) installed, you can configure it like this:
+
+```elisp title=init.el
+(with-eval-after-load 'eglot
+  (add-to-list 'eglot-server-programs
+               '(markdown-mode . ("harper-ls" "--stdio"))))
+```
+
+## Optional Configuration
+
+Additionally, you can also configure things like which linters to use or how you want code actions to appear. Below is an example config where everything is set to their default values:
+
+```elisp title=init.el
+(setq-default eglot-workspace-configuration
+              '(:harper-ls (:userDictPath ""
+                            :fileDictPath ""
+                            :linters (:SpellCheck t
+                                      :SpelledNumbers :json-false
+                                      :AnA t
+                                      :SentenceCapitalization t
+                                      :UnclosedQuotes t
+                                      :WrongQuotes :json-false
+                                      :LongSentences t
+                                      :RepeatedWords t
+                                      :Spaces t
+                                      :Matcher t
+                                      :CorrectNumberSuffix t)
+                            :codeActions (:ForceStable :json-false)
+                            :markdown (:IgnoreLinkTitle :json-false)
+                            :diagnosticSeverity "hint"
+                            :isolateEnglish :json-false)))
path: packages/web/src/routes/docs/integrations/emacs/+page.md
user: login: anarcat
body: isn't this just bound to bit-rot after a while? i would show a subset that covers most useful examples and types, perhaps:

```suggestion
              '(:harper-ls (:userDictPath ""
                            :linters (:SpellCheck t
                                      :SpelledNumbers :json-false)
                            :markdown (:IgnoreLinkTitle :json-false)
                            :diagnosticSeverity "hint")))
```
created_at: 2025-03-06T15:59:50Z
author_association: CONTRIBUTOR
diff_hunk: @@ -2,5 +2,59 @@
 title: Emacs
 ---
 
-Our Emacs support is limited and primarily provided by the community.
-You can see the longer discussion [here](https://github.com/Automattic/harper/discussions/150).
+Our Emacs integration is powered by [`harper-ls`](./language-server).
path: packages/web/src/routes/docs/integrations/emacs/+page.md
user: login: ficd0
body: I'd keep it as `harper-ls` for consistency with the rest of the docs. People can click that link and see that it's an LSP. 
created_at: 2025-03-06T16:25:29Z
author_association: CONTRIBUTOR
diff_hunk: @@ -2,5 +2,59 @@
 title: Emacs
 ---
 
-Our Emacs support is limited and primarily provided by the community.
-You can see the longer discussion [here](https://github.com/Automattic/harper/discussions/150).
+Our Emacs integration is powered by [`harper-ls`](./language-server).
path: packages/web/src/routes/docs/integrations/emacs/+page.md
user: login: ficd0
body: I think it's a good idea to keep that caveat that emacs support is mainly from community. Otherwise people may open lots of issues about Emacs which the maintainers can't really help with. 
created_at: 2025-03-06T16:26:37Z
author_association: CONTRIBUTOR
diff_hunk: @@ -2,5 +2,59 @@
 title: Emacs
 ---
 
-Our Emacs support is limited and primarily provided by the community.
-You can see the longer discussion [here](https://github.com/Automattic/harper/discussions/150).
+Our Emacs integration is powered by [`harper-ls`](./language-server).
+
+## Required Setup
+
+Make sure you have [`harper-ls` installed](./language-server#Installation) on your system and available in your `PATH`.
+
+Since version 29, Emacs has had native support for the Language Server Protocol through [Eglot](https://www.gnu.org/software/emacs/manual/html_mono/eglot.html), so all you have to do is configure it to use `harper-ls` in your `init.el`:
+
+```elisp title=init.el
+(with-eval-after-load 'eglot
+  (add-to-list 'eglot-server-programs
+               '(major-mode . ("harper-ls" "--stdio"))))
+```
+
+where `major-mode` can be set to any, some, or all major modes that correspond to the [languages `harper-ls` supports](./language-server#Supported-Languages). For example, if you want to use `harper-ls` to edit Markdown files and you have [`markdown-mode`](https://jblevins.org/projects/markdown-mode) installed, you can configure it like this:
+
+```elisp title=init.el
+(with-eval-after-load 'eglot
+  (add-to-list 'eglot-server-programs
+               '(markdown-mode . ("harper-ls" "--stdio"))))
+```
+
+## Optional Configuration
+
+Additionally, you can also configure things like which linters to use or how you want code actions to appear. Below is an example config where everything is set to their default values:
+
+```elisp title=init.el
+(setq-default eglot-workspace-configuration
+              '(:harper-ls (:userDictPath ""
+                            :fileDictPath ""
+                            :linters (:SpellCheck t
+                                      :SpelledNumbers :json-false
+                                      :AnA t
+                                      :SentenceCapitalization t
+                                      :UnclosedQuotes t
+                                      :WrongQuotes :json-false
+                                      :LongSentences t
+                                      :RepeatedWords t
+                                      :Spaces t
+                                      :Matcher t
+                                      :CorrectNumberSuffix t)
+                            :codeActions (:ForceStable :json-false)
+                            :markdown (:IgnoreLinkTitle :json-false)
+                            :diagnosticSeverity "hint"
+                            :isolateEnglish :json-false)))
path: packages/web/src/routes/docs/integrations/emacs/+page.md
user: login: elijah-potter
body: It would be dishonest to say there are just two or thee rules. I think the number @mcecode included gives a good sense of quantity without actually including _all_ of 'em.
created_at: 2025-03-06T20:08:01Z
author_association: COLLABORATOR
diff_hunk: @@ -2,5 +2,59 @@
 title: Emacs
 ---
 
-Our Emacs support is limited and primarily provided by the community.
-You can see the longer discussion [here](https://github.com/Automattic/harper/discussions/150).
+Our Emacs integration is powered by [`harper-ls`](./language-server).
+
+## Required Setup
+
+Make sure you have [`harper-ls` installed](./language-server#Installation) on your system and available in your `PATH`.
+
+Since version 29, Emacs has had native support for the Language Server Protocol through [Eglot](https://www.gnu.org/software/emacs/manual/html_mono/eglot.html), so all you have to do is configure it to use `harper-ls` in your `init.el`:
+
+```elisp title=init.el
+(with-eval-after-load 'eglot
+  (add-to-list 'eglot-server-programs
+               '(major-mode . ("harper-ls" "--stdio"))))
+```
+
+where `major-mode` can be set to any, some, or all major modes that correspond to the [languages `harper-ls` supports](./language-server#Supported-Languages). For example, if you want to use `harper-ls` to edit Markdown files and you have [`markdown-mode`](https://jblevins.org/projects/markdown-mode) installed, you can configure it like this:
path: packages/web/src/routes/docs/integrations/emacs/+page.md
user: login: elijah-potter
body: Edited.
created_at: 2025-03-06T20:08:13Z
author_association: COLLABORATOR
diff_hunk: @@ -2,5 +2,59 @@
 title: Emacs
 ---
 
-Our Emacs support is limited and primarily provided by the community.
-You can see the longer discussion [here](https://github.com/Automattic/harper/discussions/150).
+Our Emacs integration is powered by [`harper-ls`](./language-server).
+
+## Required Setup
+
+Make sure you have [`harper-ls` installed](./language-server#Installation) on your system and available in your `PATH`.
+
+Since version 29, Emacs has had native support for the Language Server Protocol through [Eglot](https://www.gnu.org/software/emacs/manual/html_mono/eglot.html), so all you have to do is configure it to use `harper-ls` in your `init.el`:
+
+```elisp title=init.el
+(with-eval-after-load 'eglot
+  (add-to-list 'eglot-server-programs
+               '(major-mode . ("harper-ls" "--stdio"))))
path: packages/web/src/routes/docs/integrations/emacs/+page.md
user: login: elijah-potter
body: Edited.
created_at: 2025-03-06T20:08:21Z
author_association: COLLABORATOR

PR comments:
user: login: elijah-potter
created_at: 2025-02-26T18:31:43Z
body: > Note: I removed the "Copy Default Config to Clipboard" button in the Neovim page for now, but I'll try to bring it back in another PR so this one can focus on the docs' contents rather than functionality.

That button only existed because [SveltePress couldn't render code at runtime.](https://github.com/SveltePress/sveltepress/issues/310) I believe their upcoming release will be able to. If that happens before you're done with this PR, it might be worth swapping the button over to a rendered view.
author_association: COLLABORATOR
user: login: mcecode
created_at: 2025-03-02T13:27:53Z
body: I think this is ready for review. I'd like to get some feedback in case I made a mistake or if there's something I missed.

- @elijah-potter, for everything but especially the `harper-ls` and Neovim pages
- @hippietrail, for the VS Code pages and also for the overall grammar and such
- @ficcdaf, for the Helix page
- @anarcat, for the Emacs page, sorry for the tag out of nowhere but the info you provided in #150 really helped me write this page, so I'd like your feedback, especially when it comes to the example configs I provided since I don't know anything about Emacs or Lisp. You can just view the Markdown [here](https://github.com/mcecode/harper/blob/integration-docs/packages/web/src/routes/docs/integrations/emacs/%2Bpage.md) so you don't have to clone or build anything.
author_association: COLLABORATOR
user: login: elijah-potter
created_at: 2025-03-03T21:26:12Z
body: This is some truly gorgeous work @mcecode. Everything looks good to me. I'll wait until some others have a chance to review it before merging.
author_association: COLLABORATOR
user: login: ficd0
created_at: 2025-03-04T04:47:13Z
body: It looks great! The Helix page is much, much clearer now. Your explanation is very good!
author_association: CONTRIBUTOR
user: login: mcecode
created_at: 2025-03-04T04:50:37Z
body: > It looks great! The Helix page is much, much clearer now. Your explanation is very good!

Thanks for the help @ficcdaf! Your suggestions also helped me improve the Neovim and Emacs pages in using "Required Setup" and "Optional Configuration" sections rather than "Installation" and "Configuration" sections.
author_association: COLLABORATOR
user: login: ficd0
created_at: 2025-03-04T07:14:41Z
body: Glad to help :) I have no more comments, it all looks good from my end. But I've only checked the Helix page. Thanks for the work! I think this will help people a lot in getting started with harper. 
author_association: CONTRIBUTOR
user: login: mcecode
created_at: 2025-03-06T05:53:00Z
body: Hi @elijah-potter, I think this can merged now since some time has passed since I asked for feedback and at least you and Daniel have approved the updates. If needed, we can just add further clarifications in subsequent PRs. It'd also be nice to have the docs updated for the new release yesterday.
author_association: COLLABORATOR
user: login: ficd0
created_at: 2025-03-06T16:28:12Z
body: > lgtm, in general, but since you asked for my advice, i have suggestions :)

I can't comment on the Lisp since I've never used emacs myself, but in general I agree that it's better to include a shorter example that still communicates the gist of how to configure things, with less risk of the example being outdated. My biggest pet peeve is when examples are outdated and I can't copy paste them. So good catch 🙂
author_association: CONTRIBUTOR
user: login: ficd0
created_at: 2025-03-06T16:28:55Z
body: > lgtm, in general, but since you asked for my advice, i have suggestions :)

Sorry what does igtm mean?
author_association: CONTRIBUTOR
user: login: anarcat
created_at: 2025-03-06T17:08:40Z
body: > Sorry what does igtm mean?

oh, sorry for the acronym, it means "Looks Good To Me"
author_association: CONTRIBUTOR
user: login: mcecode
created_at: 2025-03-07T02:57:13Z
body: Sorry I wasn't online when you gave your suggestions @anarcat. Thanks for the review! I'm glad I didn't make many mistakes, especially in my Lisp syntax :)

Just to chime in about the sample config possibly becoming outdated that you and Daniel pointed out, I don't think any of the configs shown there will be removed nor will their defaults change any time soon. Harper has been moving quite fast with new integrations and linters being added often, but those have stayed the way they are since they were added. So I think users will be safe to copy paste it without it bit-rotting for quite a while.

---

**Edit**: I need to correct myself since it totally slipped my mind that we just had a breaking change on config keys last week with 0.23.0. So my statement that "those have stayed the way they are since they were added" is wrong. However, I stand by my statement that they likely won't be changing any time soon because that breaking change was to standardize key casing not to remove anything or change defaults, and since they've been standardized, it's likely these keys will stay the way they are.
author_association: COLLABORATOR
user: login: ficd0
created_at: 2025-03-07T19:49:29Z
body: Funny enough, my PR adding a default Harper configuration to Helix just got merged. However Helix only does a release like a couple times a year so I don't think we need to update these docs anytime soon 😜
author_association: CONTRIBUTOR