Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It supports a slew of LSP features like go-to-definition, go-to-references, hover docs, near instant formatting, renaming of modules, functions, and variables across the codebase, and more.
Remote’s Elixir codebase is enormous (over 57k files) so we have run into every bottleneck you can imagine with the existing LSPs. Expert works great on smaller codebases, but it can’t yet handle codebases of our size. On our codebase, we’re usually not even able to get it to finish indexing.
Dexter started as a CLI tool I wrote for myself to improve my search keybindings for jumping around files due to not having a working LSP. I quickly realized that I had built the foundations for an LSP without the server. So I added an LSP server in front and Dexter was born. I released Dexter internally at Remote last week and the feedback has been very positive, so I wanted to open source it to help others with similar issues and give back to the community.
Dexter takes a different approach than the other Elixir LSPs. Rather than attempting to compile the codebase and glean info from the compiled code and parsed AST, Dexter simply parses the code of your project and dependencies directly. I was surprised by how fast and accurate this approach can be.
Everything in Dexter is built for speed without sacrificing correctness. There are limitations to the pure text-based approach, but we’re able to work around those with clever parsing and deferring any complicated macro/import injection tracing to runtime.
I know that the Elixir community has consolidated around Expert, which I think has been a great move. Dexter takes a different approach to the compilation-based LSPs to solve the specific pains we’ve had at Remote with such a large Elixir codebase, so I imagine it will be very helpful for those working on large codebases (although it works great on small codebases too!). While not everything is applicable, I’d imagine that there are some optimizations that we did in Dexter that could be similarly considered in Expert. But that being said, we’re really enjoying using Dexter at Remote and plan to continue maintaining and improving it into the future.
Give it a try and let me know what you think!
To install (assuming you have SQLite installed, if not install it first):
mise plugin add dexter https://github.com/remoteoss/dexter.git && mise use -g dexter@latest
And then just configure your editor, either with the VS Code/Cursor extension, NeoVim, or your other favorite editor.
If you have any thoughts, feature requests, or bug reports, I’d love to hear them. Likewise, contributions are absolutely welcome to the project.
Features
- Fast indexing — cold index completes in ~11s on a 57k-file Elixir monorepo, ~100ms on Oban, ~300ms on the Elixir standard library (measured on an M1 MacBook Pro). After your first index, incremental indexing makes sure that you never have to reindex the whole codebase again.
- Go-to-definition — jump to any module, function, type, or variable definition. Resolves aliases, imports,
defdelegatechains,useinjections, and the Elixir stdlib. Handles all definition forms:def,defp,defmacro,defprotocol,defimpl,defstruct, and more. - Go-to-references — find all usages of a function or module across the codebase, including through
import,usechains, anddefdelegate. - Hover documentation —
@doc,@moduledoc,@typedoc, and@specannotations rendered as Markdown when you hover over a symbol. - Autocompletion — modules, functions, types, and variables with full snippet support. Resolves through aliases, imports,
useinjections, and the Elixir stdlib. Works for qualified calls (MyApp.Repo.|), bare function calls, and module prefixes. - Rename — rename modules, functions, and variables with automatic file renaming when the convention is followed.
- No compilation required — the index is built by parsing source files directly, not by compiling your project. Dexter works immediately on any codebase, even ones that don’t compile.
- Monorepo and umbrella support — a single index at the repository root covers all apps and shared libraries. Go-to-definition, find references, and rename work cross-project out of the box.
- Format on save — formats
.ex,.exs, and.heexfiles on save via a persistent Elixir process. Near-instant after the first save. Formatter plugins (Styler, Phoenix.LiveView.HTMLFormatter) are loaded from your project’s_build— no install needed. Syntax errors are surfaced as diagnostics. - Elixir stdlib indexing — jump to
Enum,String,Mix, and other bundled modules by indexing your local Elixir installation sources. - Signature help — parameter hints as you type function calls.
- Workspace symbols — search for any module or function across the entire codebase.
- Call hierarchy — navigate incoming and outgoing calls.
- Code actions — add missing aliases with a single action.
- Document symbols — outline view of all functions and modules in the current file.
- Document highlight — highlight all occurrences of the symbol under the cursor.
- Variable support — go-to-definition, rename, and completion for local variables via tree-sitter, with correct scoping across
case,with,for, and other block constructs. - Git branch switch detection — automatically reindexes when you switch branches.
Checkout the GitHub Repo for more details:






















