Dexter is a lightning fast, full-featured Elixir language server optimized for speed on large codebases.
- Go-to-definition, find references, rename, and more!
- Autocompletion with snippet support across aliases, imports, and
useinjections - Hover documentation for
@doc,@moduledoc,@typedoc, and@spec - Near-instant format on save, including support for any formatter plugins your project has configured, like Styler
- Syntax highlighting for Elixir, EEx, HEEx, and Livebook
- Monorepo-aware with automatic reindexing on git branch switches
See the Dexter repo for the full feature list.
- Install this extension from the VS Code or Cursor marketplace
- Either set
dexter.binaryto the Dexter binary you want to use, or let the extension set Dexter up for you - Open any Elixir file — the index builds automatically on first startup
When dexter.binary is left at its default, the extension first looks for Dexter on your PATH. If it
cannot find one, it downloads a checksum-verified binary into VS Code's extension storage. This does not
modify your system installation. Extension-managed binaries can also be updated automatically.
If automatic installation is unavailable, follow Dexter's manual installation instructions.
Native Windows support is best effort and automatic installation is unavailable. Configure a compatible
Dexter executable with dexter.binary, or use the extension from a WSL workspace.
Dexter stores its project index in .dexter/. The directory manages its own .gitignore, so no project
.gitignore entry is needed.
| Setting | Default | Description |
|---|---|---|
dexter.binary |
"dexter" |
Path to the dexter binary, or a command name to find on PATH. Accepts ~ and workspace-relative paths |
dexter.autoInstall |
true |
Download Dexter into extension storage when it is not installed |
dexter.autoUpdate |
true |
Keep the extension-managed Dexter binary up to date |
dexter.followDelegates |
true |
Follow defdelegate to the target function definition |
dexter.maxTransientDocuments |
50 |
Buffers the server keeps for files the editor never opened. 0 disables caching |
dexter.stdlibPath |
"" |
Path to the Elixir stdlib lib/ directory. Auto-detected if not set |
dexter.debug |
false |
Enable verbose LSP logging (view with Output → Dexter) |
The extension does not change your format-on-save settings. To turn format on save on globally:
{
"editor.formatOnSave": true
}Or turn it on only for the languages Dexter supports:
{
"[elixir][phoenix-heex]": { "editor.formatOnSave": true }
}If another Elixir extension is installed, set Dexter as the default formatter. The extension ID is different in each editor:
// VS Code
{
"[elixir]": { "editor.defaultFormatter": "remoteoss.dexter-lsp" }
}
// Cursor
{
"[elixir]": { "editor.defaultFormatter": "remote-com-oss.dexter-lsp" }
}Dexter settings are read when the language server starts. After you change one, the extension offers to restart the server. You can also restart it yourself from the Command Palette.
| Command | Description |
|---|---|
| Dexter: Restart Language Server | Restarts the language server and applies the current settings. Use it after an update, or if the server stops responding |
git clone https://github.com/remoteoss/dexter-vscode.git
cd dexter-vscode
make install # installs to Cursor by default, or: make install-vscode
make test # runs the unit testsThe tests cover binary resolution, checksum verification, and the release asset
mapping. They stub the vscode module, so they run under plain Node and need no
editor. GitHub Actions runs them on every pull request.
GitHub Actions builds and packages the extension, but the two marketplaces are published by hand. The marketplaces use different publisher namespaces, so each one needs its own package:
| Editor | Marketplace | Extension ID |
|---|---|---|
| VS Code | Visual Studio Marketplace | remoteoss.dexter-lsp |
| Cursor | Open VSX | remote-com-oss.dexter-lsp |
- Create a release branch. Bump the version in
package.jsonand add aCHANGELOG.mdentry with a## v<version>heading. - Merge the branch into
main, then check outmain. - Tag and push. The tag must match the version in
package.json:Themake release VERSION=0.3.0
Releaseworkflow then builds both packages and creates the GitHub release, using that version'sCHANGELOG.mdsection as the release notes. It fails if the tag andpackage.jsondisagree, or if the changelog section is missing. - Publish to both marketplaces:
Or publish to one at a time with
export VSCE_PAT=... # Visual Studio Marketplace token export OVSX_PAT=... # Open VSX token make publish
make publish-vscodeandmake publish-openvsx.
To build the packages without publishing, run make package and make package-openvsx.
make package-openvsx sets the Open VSX publisher, builds the package, then restores
package.json.