Skip to content
CAI
Software that uses CAICheck a score

elixir-lsp/elixir-ls

66.8

Adequate · 23 September 2026

33.1k

lines of production code

Elixir

primary language

5

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is the Elixir Language Server, a tool that provides IDE-like code intelligence for Elixir projects. It implements the Language Server Protocol to offer features such as code completion, navigation, diagnostics, and formatting, while also supporting debugging via the Debug Adapter Protocol. Additionally, it includes an embedded Model Context Protocol server to expose code analysis capabilities to large language models.

How it got here

2017 — gen\_lsp migration and architecture rewrite

21 changes.

The project underwent a major architectural overhaul, migrating the language server to the gen\_lsp library and restructuring the codebase into a new umbrella layout. This period involved removing legacy components like the debugger and io\_handler, rewriting the server's startup logic, and introducing new features such as incremental Dialyzer analysis and call hierarchy providers.

2018–2022 — Language server feature expansion and test coverage

22 changes.

This period focused on significantly expanding the language server's capabilities by implementing LSP features such as folding ranges, location protocols, and code lenses for test execution and type spec suggestions. It also introduced custom commands for LLM integration and code manipulation, while simultaneously building comprehensive test suites and fixtures to validate these new functionalities and ensure cross-platform compatibility.

2023–2024 — Debug Adapter and Language Server Refactoring

28 changes.

This period focused on restructuring the project into a standalone Debug Adapter application with full DAP support and refactoring the language server's provider architecture into modular, testable components. Significant work included implementing context-aware completion plugins for Ecto and Phoenix, enhancing navigation accuracy for complex Elixir syntax, and expanding the test suite to cover these new features and infrastructure changes.

2025–2026 — LSP, DAP, and MCP protocol integration

9 changes.

This period focused on establishing foundational protocol schemas for the Language Server Protocol (LSP) and Debug Adapter Protocol (DAP), alongside implementing core navigation features like declaration and call hierarchy providers. The work also introduced an embedded Model Context Protocol (MCP) server to expose language server capabilities to AI tools, supported by comprehensive test coverage for these new components.

Features

Add LSP Location protocol struct and conversion logic

Introduces a new \ElixirLS.LanguageServer.Protocol.Location\ module that implements the LSP Location interface. This module provides a \to\_gen\_lsp\ function to convert internal ElixirLS location data into the GenLSP structure, handling URI resolution relative to the project directory and converting Elixir positions to LSP-compliant line and column coordinates.

_apps/language\_server/lib/language\server/protocol · high confidence

Add call hierarchy provider for navigating function calls

The language server now supports call hierarchy, allowing users to navigate to callers (incoming calls) and callees (outgoing calls) of a function. This feature is implemented via a new \CallHierarchy\ provider and its associated \Locator\ module, which parses function names and arities to identify call relationships within the current file and across traced remote files. The implementation routes through the \SurroundContext.Toxic\ seam to determine the context at the cursor position, handling cases such as function definitions and local variable contexts to build accurate hierarchy items.

_apps/language\_server/lib/language\_server/providers/call\hierarchy · high confidence

Added DAP protocol schema definitions for events and requests

The debug adapter's protocol layer now includes generated schema definitions for Debug Adapter Protocol (DAP) events and requests. This adds validation structures for all standard DAP events (such as breakpoint, capabilities, continued, exited, initialized, invalidated, loadedSource, memory, module, output, process, progress, stopped, terminated, and thread) and requests (including attach, breakpointLocations, cancel, completions, configurationDone, continue, dataBreakpointInfo, disassemble, disconnect, evaluate, exceptionInfo, goto, gotoTargets, initialize, launch, loadedSources, locations, modules, next, pause, readMemory, restart, restartFrame, reverseContinue, runInTerminal, scopes, setBreakpoints, setDataBreakpoints, setExceptionBreakpoints, setExpression, setFunctionBreakpoints, setInstructionBreakpoints, setVariable, source, stackTrace, startDebugging, stepBack, stepIn, stepInTargets, stepOut, terminate, terminateThreads, threads, variables, and writeMemory). Additionally, it introduces enumerations for breakpoint mode applicability, checksum algorithms, completion item types, data breakpoint access types, exception break modes, invalidated areas, and stepping granularity to support these interactions.

_apps/debug\adapter/lib/protocol · high confidence

Added declaration provider for callback and protocol definitions

A new declaration provider has been introduced in the language server, allowing users to navigate from an implementation of a callback or protocol function directly to its definition in the behaviour or protocol module. This feature, implemented in the new \Locator\ module, effectively serves as the reverse of 'go to implementations' by resolving the source of the contract being fulfilled.

_apps/language\_server/lib/language\server/providers/declaration · high confidence

Embedded MCP server with tool support and telemetry

The language server now includes an embedded Model Context Protocol (MCP) server, exposing tools such as LLM documentation aggregation, type information, definition lookup, implementation finding, module dependencies, and environment details. This new component introduces a dedicated TCP server and request handler that support the MCP protocol version 2024-11-05, handle initialization and tool calls, and emit telemetry events for request timing and errors.

_apps/language\_server/lib/language\server/mcp · high confidence

Initial GenLSP protocol schema definitions added

The language server now includes the foundational type definitions and enumerations for the Language Server Protocol (LSP) via the new \GenLSP\ module. This change adds generated schema files for base types, error codes, and various LSP enumerations (such as \CodeActionKind\, \CompletionItemKind\, \DiagnosticSeverity\, and \SymbolKind\), alongside the core notification structures (e.g., \textDocument/didChange\, \initialized\). These files provide the structural basis for the server's LSP communication layer.

_apps/language\_server/lib/language\server/lsp · high confidence

Inline test execution and Dialyzer @spec suggestions

The language server now provides code lenses for running tests directly from the editor, supporting execution of individual test blocks, describe blocks, and entire test modules via the 'elixir.lens.test.run' command. Additionally, it offers inline @spec suggestions inferred by Dialyzer, translating success typings into Elixir syntax to help developers add type specifications to their functions.

_apps/language\_server/lib/language\_server/providers/code\lens · high confidence

Introduce dedicated Debug Adapter app with comprehensive DAP implementation

The \debugger\ application has been renamed to \debug\_adapter\ and restructured into a standalone OTP application (\apps/debug\_adapter\) that fully implements the Debug Adapter Protocol (DAP). This change introduces a new server architecture (\ElixirLS.DebugAdapter.Server\) that manages breakpoints, thread/variable registries, and stack traces, replacing the previous \IEx.Broker\-based debugging mechanism with a GenServer-driven model. The new adapter supports advanced debugging features including conditional breakpoints, hit counts, log points, and remote node attachment. It also provides detailed test execution events via a custom ExUnit formatter and generates per-file code coverage reports (lines, functions, and branches) from \:cover\ analysis. Additionally, the implementation includes robust error handling with a dedicated error dictionary, safe UTF-16 cursor position parsing to prevent crashes on surrogate pairs, and improved shutdown behavior using \System.halt\.

_apps/debug\_adapter/lib/debug\adapter · high confidence

New Ecto and Phoenix completion plugins for the language server

The language server now includes dedicated plugins to provide context-aware completions for Ecto and Phoenix code. The new Ecto plugin offers suggestions for schema fields, associations, and query bindings, while the Phoenix plugin suggests controllers and route actions within the router scope. These plugins rely on a new ModuleStore that caches loaded modules by behavior, replacing the previous \Code.ensure\_compiled\ approach with \Code.ensure\_loaded?\ to avoid locking issues during concurrent compilation.

_apps/language\_server/lib/language\server/providers/plugins · high confidence

New ElixirLS Utils library for core language server infrastructure

This change introduces the \elixir\_ls\_utils\ application, providing foundational components for the language server. It includes a new completion engine that delegates cursor parsing to the host compiler (supporting Elixir 1.18+ block keywords and OTP 28 nominal types), a fuzzy module matcher, and a field type resolver. It also adds a launch module to manage Mix startup and environment configuration, a wire protocol handler for JSON-RPC packet streaming, and an IO output interceptor to forward logs to the IDE.

_apps/elixir\_ls\utils/lib · high confidence

New code actions for replacing undefined remote functions and unused variables

The language server now provides two new quick-fix code actions. The 'Replace Remote Function' action suggests renaming undefined function calls to similar existing functions within the same module, correctly handling Erlang module aliases, \\_\MODULE\\_\ self-references, and diagnostic messages formatted as \MarkupContent\. The 'Replace with Underscore' action automatically prefixes unused variables with an underscore to suppress compiler warnings. Both actions rely on new helper modules for AST manipulation and text editing.

_apps/language\_server/lib/language\_server/providers/code\action · high confidence

New code-modification provider for generating text edits

Added a new provider module under \apps/language\_server/lib/language\_server/providers/code\_mod\ that enables the language server to generate precise text edits for code modifications. This includes AST parsing utilities to convert source code to and from abstract syntax trees, a Myers diff algorithm implementation to calculate differences between source versions, and helper functions to extract leading indentation and trailing comments while correctly handling \\#\ characters inside string literals.

_apps/language\_server/lib/language\_server/providers/code\mod · high confidence

New custom commands for LLM integration and code manipulation

The language server now exposes several new custom commands to enhance developer workflows, particularly for AI-assisted coding and code refactoring. A suite of LLM-optimized commands has been added to provide structured data for large language models: \llmDefinition\ retrieves source code for symbols, \llmDocsAggregator\ fetches comprehensive documentation for modules and functions, \llmEnvironment\ provides context-aware environment details (aliases, imports, variables) at a specific cursor position, \llmImplementationFinder\ locates behavior and protocol implementations, \llmModuleDependencies\ maps direct and transitive module dependencies, and \llmTypeInfo\ extracts type specs and dialyzer contracts. Additionally, new commands allow users to expand macros (\expandMacro\), insert dialyzer-suggested function specs (\applySpec\), retrieve ExUnit tests within a file (\getExUnitTestsInFile\), and convert between pipe operators and function calls (\manipulatePipes\).

_apps/language\_server/lib/language\_server/providers/execute\command · high confidence

New providers for call hierarchy, code actions, and on-type formatting

The language server now includes dedicated providers for call hierarchy (incoming and outgoing function calls), code actions (specifically replacing remote functions and using underscores), and on-type formatting (smart insertion of 'end' after 'do' or '-\>'). These new modules in the providers directory expand the server's capabilities for navigating code structure, applying quick fixes, and maintaining formatting during typing.

_apps/language\_server/lib/language\server/providers · high confidence

Support for code folding ranges in the language server

The language server now implements the textDocument/foldingRange capability, allowing editors to collapse sections of code. This is achieved through new providers that identify folding regions based on indentation levels (e.g., function bodies, modules) and contiguous comment blocks. The implementation includes helper modules for parsing line metadata and grouping comments, enabling users to navigate large files more efficiently by hiding irrelevant code sections.

_apps/language\_server/lib/language\_server/providers/folding\range · high confidence

Removals

Debugger application module removed

The \ElixirLS.Debugger\ application module, which previously defined the OTP application behavior and supervised child processes (including the output device and server), has been deleted from the codebase. This change removes the explicit application start/stop logic and supervisor tree definition for the debugger component.

apps/debugger/lib · high confidence

Debugger core implementation removed

The core debugger implementation files in \apps/debugger/lib/debugger\ have been deleted. This includes the main server logic (\server.ex\), output handling (\output.ex\, \output\_device.ex\), protocol definitions (\protocol.basic.ex\), stacktrace retrieval (\stacktrace.ex\), and variable inspection (\variables.ex\).

apps/debugger/lib/debugger · high confidence

Removal of the io\_handler application

The io\_handler application, which previously managed reading and writing packets via the Language Server Protocol's wire protocol, has been removed from the codebase. This deletion eliminates the ElixirLS.IOHandler module and its PacketStream implementation, meaning the system no longer uses this specific component for stdin/stdout packet processing.

_apps/io\handler · high confidence

Architecture

Extracted path handling logic into a dedicated SourceFile.Path module

Path manipulation utilities previously embedded within the SourceFile module have been moved to a new dedicated module, SourceFile.Path. This change centralizes logic for converting between file system paths and URIs, handling Windows-specific path separators and drive letters, and validating whether a file resides within a specific directory, improving code organization and maintainability.

_apps/language\_server/lib/language\_server/source\file · high confidence

Language server architecture migrated to gen\_lsp with new core components

The language server has been re-architected to use the gen\_lsp library, introducing a new application supervision tree and dedicated modules for handling client capabilities, build processes, diagnostics, and incremental dialyzer analysis. This change replaces the previous implementation with a more robust foundation, including a new JSON-RPC logger backend for improved log visibility and a restructured ExUnit test tracer, fundamentally changing how the server initializes and manages its internal state.

_apps/language\_server/lib/language\server · high confidence

Behavioural changes

Added formatter configuration and relocated gitignore

The elixir\_ls\_utils app now includes a .formatter.exs file that configures code formatting for source files in lib, config, and test directories. Additionally, the .gitignore file has been moved from the io\_handler app to this location.

_apps/elixir\_ls\utils · high confidence

Completion engine refactored into modular reducers

The completion subsystem has been restructured from a monolithic implementation into a pipeline of specialized reducers located in the \completion/reducers\ directory. This change introduces distinct modules for handling specific completion types—such as \Callbacks\, \CompleteEngine\, \DocsSnippets\, \Overridable\, \Params\, \Protocol\, \Record\, \Returns\, and \TypeSpecs\—allowing the language server to generate suggestions for callbacks, record fields, protocol functions, and type specs through a more organized and maintainable architecture.

_apps/language\_server/lib/language\server/providers/completion/reducers · high confidence

Completion provider refactored with generic reducer behavior and improved error resilience

The completion subsystem has been restructured to use a new \GenericReducer\ behavior, allowing completion suggestions to be customized based on the cursor's position within function calls. This change introduces a more robust error-handling mechanism that prevents the language server from crashing if internal error reporting (specifically \Exception.blame\) fails during suggestion generation. Additionally, the provider now supports plugin-based reducers via the \ModuleStore\, enabling external plugins to inject or decorate completion suggestions, while maintaining a core set of built-in reducers for variables, modules, functions, and structs.

_apps/language\_server/lib/language\server/providers/completion · high confidence

Debug adapter now enforces minimum Elixir and OTP version requirements

The debug adapter application now explicitly checks the running Elixir and OTP versions against supported minimums at startup. If the environment does not meet the required versions, the adapter displays an important warning and halts execution, preventing operation on unsupported configurations. This change also renames the application from 'debugger' to 'debug\_adapter' and ensures the OTP debugger modules are available in the code path without starting the app.

_apps/debug\adapter/lib · high confidence

Ecto query and schema completion support for ElixirLS 1.20

The Ecto provider in the language server has been updated to support ElixirLS 1.20, introducing new modules for query, schema, and type completion. Users now receive intelligent code completion for Ecto query clauses (such as joins and filters), schema field options (like \:default\, \:source\, and association behaviors), and both built-in and custom Ecto data types. This enhancement improves the developer experience by providing context-aware suggestions and documentation directly within the editor when writing Ecto queries and schemas.

_apps/language\_server/lib/language\server/providers/plugins/ecto · high confidence

ElixirLS v0.31.1 release with Elixir 1.20 support and legacy dialyzer removal

This release updates the language server to version 0.31.1, adding official support for Elixir 1.20 and OTP 29 while dropping support for Elixir 1.15 and OTP versions below 26. A key breaking change is the removal of legacy dialyzer support, making OTP's incremental Dialyzer the only engine and removing the \elixirLS.incrementalDialyzer\ configuration setting. The update also ports the completion subsystem to the 1.20 engine for more accurate block keyword completions, improves go-to-definition resolution for functions inside \\_\using\\_\ macros, and eradicates \Code.ensure\_compiled\ calls to reduce compilation-related hangs. Additionally, the project now includes a MkDocs-based documentation website, a Code of Conduct, and standardized configuration files (\.editorconfig\, \.formatter.exs\, \.dialyzer\_ignore.exs\) to improve development consistency.

(repo-wide) · high confidence

Enable ElixirSense native type inference by default

The configuration now enables ElixirSense's native Module.Types backend (set-theoretic type inference) by default, which powers improved inlay hints, hover information, and code completion. This feature requires Elixir 1.19+ and will automatically fall back to the custom engine on older versions. Users can disable this behavior by setting the environment variable ELIXIR\_LS\_TYPE\_INFERENCE to false or 0, which is useful for A/B testing or troubleshooting. The configuration also notes that log-flood issues on Elixir 1.18/1.19 are handled via test-level logger adjustments rather than global config changes.

config · high confidence

Hover provider now returns documentation for specs, callbacks, and multialias syntax

The hover provider in the language server has been updated to provide richer context for users. It now returns hover information for function specs and callbacks, which were previously omitted. Additionally, the provider correctly handles multialias syntax (e.g., \Module.{}Function\), allowing users to get documentation for functions accessed via this shorthand. The implementation has been moved from the external \elixir\_sense\ library into the \ElixirLS.LanguageServer.Providers.Hover.Docs\ module, integrating with the new \SurroundContext.Toxic\ seam for better context resolution.

_apps/language\_server/lib/language\server/providers/hover · high confidence

Implementation provider now returns location ranges

The implementation provider has been refactored to return precise location ranges for symbol implementations rather than just module or function names. This change, part of the migration from elixir\_sense, improves the accuracy of navigation features by providing exact line and column information for where behaviors, protocols, and delegates are implemented.

_apps/language\_server/lib/language\server/providers/implementation · high confidence

Improved definition provider with multialias and spec support

The definition provider in the language server has been updated to handle more complex navigation scenarios. It now supports resolving definitions for multialias syntax (e.g., \Module.{}Function\) by correctly expanding outer aliases and \\_\MODULE\\_\ contexts. Additionally, the provider can now return definitions when the cursor is positioned on a function spec or callback, and it includes fixes for crashes related to invalid multialias usage. These changes improve the accuracy of 'Go to Definition' for advanced Elixir patterns.

_apps/language\_server/lib/language\server/providers/definition · high confidence

Improved scope resolution for Phoenix router aliases

The Phoenix language server provider now includes a new \Scope\ module that correctly resolves module aliases within Phoenix router \scope\ blocks. This change ensures that code completion and navigation accurately reflect the nested module structure defined by router scopes, handling various alias configurations and versioned variables.

_apps/language\_server/lib/language\server/providers/plugins/phoenix · high confidence

Improved type spec suggestions for protocols and implementations

The language server now provides more accurate type spec suggestions for \defprotocol\ and \defimpl\ definitions. This change extracts the contract translation logic into a dedicated module (\ContractTranslator\) and adds specific handling to correctly infer types for protocol callbacks (e.g., ensuring the first argument is typed as \t\) and implementations, while avoiding incorrect modifications to \\_\deriving\\_\ macros and handling default arguments gracefully.

_apps/language\_server/lib/language\_server/providers/code\_lens/type\spec · high confidence

Language server project structure and configuration updates

The language server app has undergone structural changes, including the removal of the legacy README and the introduction of a new .formatter.exs that configures code formatting with specific exclusions for test fixtures and protocol DSL definitions. Additionally, a .dialyzer\_ignore.exs file was added to suppress dialyzer warnings for the new restart command implementation, reflecting internal refactoring of the server's provider and state management components.

_apps/language\server · medium confidence

Major rewrite of the language server startup and initialization logic

The language server's entry point has been completely rewritten from a standard OTP Application behavior to a new \main\ function that manages its own lifecycle. This change replaces the previous supervisor-based startup with explicit initialization steps, including intercepting standard output/error streams to send them via JSON-RPC, replacing the default console logger with a JSON-RPC backend, and dynamically applying runtime configuration (such as type inference toggles) that was previously only possible at build time. The new flow also includes detailed version reporting, environment checks for OTP documentation chunks and source availability, and specific error handling for incomplete Erlang installations, providing users with clearer feedback during startup failures.

_apps/language\server/lib · high confidence

Migration to Elixir 1.9+ config syntax in elixir\_ls\_utils

The configuration file for the elixir\_ls\_utils application has been updated to use the modern \import Config\ syntax instead of the deprecated \use Mix.Config\. This change, which also includes renaming the application context from \io\_handler\ to \elixir\_ls\_utils\ in comments and examples, ensures compatibility with current Elixir standards and resolves associated compiler warnings.

_apps/elixir\_ls\utils/config · high confidence

New incremental Dialyzer analysis with success-typing code lenses

The language server now uses a new incremental Dialyzer backend (DialyzerIncremental) instead of the legacy one, supporting OTP 26 through 28 with corresponding warning options. This change introduces a new feature that suggests function specifications based on Dialyzer's success typings via code lenses, and improves warning handling by defaulting to the dialyxir\_long format while properly managing PLT transfers and manifest race conditions.

_apps/language\_server/lib/language\server/dialyzer · high confidence

Prevent formatter from accidentally compiling code

The language server's formatting task now avoids triggering accidental compilation and code path modifications. This change ensures that formatting operations remain lightweight and do not have side effects on the project's build state, addressing issues where the formatter might inadvertently compile code or alter the environment.

_apps/language\_server/lib/language\_server/mix\tasks · high confidence

Redesigned launch infrastructure with shell-specific exec scripts and quiet installer

The scripts directory has been restructured to improve reliability and shell compatibility. A new POSIX launcher (launch.sh) now detects the user's preferred shell (bash, zsh, or fish) and relaunches itself using the appropriate shell-specific script (exec.bash, exec.zsh, or launch.fish) to ensure correct environment handling and signal propagation. Shell-specific exec scripts (exec.bash, exec.zsh) are introduced to properly parse ELS\_ELIXIR\_OPTS into arrays before launching the Elixir runtime. The installer logic has been refactored into a dedicated installer.exs module and a quiet\_install.exs wrapper that suppresses stdout noise to prevent LSP protocol corruption. Additionally, new helper scripts (debug\_adapter.sh, elixir\_check.sh, language\_server.sh) standardize the launch modes, and a new tcp\_to\_stdio\_bridge.exs provides an MCP bridge for LLM integration.

scripts · high confidence

References provider now uses SurroundContext for improved accuracy

The references provider has been refactored to utilize the new SurroundContext API, replacing the previous method of determining the cursor's semantic context. This change improves the accuracy of reference lookups by better handling variable scopes and module environments, ensuring that references are resolved correctly even in complex nested structures or when dealing with versioned variables.

_apps/language\_server/lib/language\server/providers/references · high confidence

Removal of custom language server logger configuration

The custom configuration for the Elixir Language Server's logging backend has been removed. Users will no longer have the \ElixirLS.LanguageServer.LoggerBackend\ configured via \config :logger\ in this file, meaning the specific LSP logging behavior previously enabled here is no longer applied by default.

_apps/language\server/config · high confidence

Signature help now renders metadata and handles protocol callbacks

The signature help provider has been refactored to integrate with updated ElixirSense APIs, specifically adopting the \actual\_mod\_fun\ interface for more accurate function resolution. This change enables the display of additional metadata in signature hints and introduces specific handling for protocol callbacks, ensuring that documentation and specs from behavior implementations are correctly merged and presented to the user.

_apps/language\_server/lib/language\_server/providers/signature\help · high confidence

Test coverage

Added Ecto test support stubs for the language server plugin; Added benchmark for document line retrieval performance; Added comprehensive test suite for the debug adapter; Added comprehensive test suites for language server providers; Added dialyzer test fixtures for type analysis; Added fixture tests for custom test path and pattern support; Added test coverage for LLM-focused execute commands and pipe manipulation; Added test coverage for describe and test block parsing logic; Added test fixtures for Phoenix plugin and Elixir string analysis; Added test fixtures for language server capabilities; Added test fixtures for mix clean custom command; Added test fixtures for protocol definitions and implementations; Added test fixtures for the debug adapter; Added test fixtures for umbrella Dialyzer warnings; Added test fixtures for umbrella app code lens prefix handling; Added test fixtures for wire protocol message validation; Added test suite for ElixirLS Utils; Added test support macros for Debug Adapter Protocol requests; Added test support modules and refactored packet capture for reliability; Added tests for CodeLens test provider; Added tests for CodeMod diff logic; Added tests for Ecto and Phoenix plugin completions; Added tests for Ecto query binding extraction with join associations; Added tests for MCP request handler and tool integration; Added tests for Phoenix scope parsing logic; Added tests for SourceFile path conversion functions; Added tests for code action providers; Added tests for completion suggestion filtering; Added tests for hover documentation retrieval; Added tests for signature help provider; Added tests for the Call Hierarchy Locator; Added tests for the ContractTranslator module; Added tests for the references locator provider; Added workspace symbols fixture module; Expanded test coverage for language server core components; Expanded test fixtures for language server analysis; Removed debugger integration tests and fixtures; Updated build error test fixture module name.

Dependencies

Umbrella restructuring and dependency modernization

The project has been restructured into a new umbrella layout, introducing dedicated apps for the language server, utilities, and a renamed debug adapter (replacing the old debugger and io\_handler apps). This change raises the minimum supported Elixir version to 1.16.0 and modernizes the dependency graph by vendoring core libraries—including Jason, Dialyxir, Schematic, and PathGlob—while switching the primary code-analysis dependency to the elixir-lsp fork of elixir\_sense.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 62 → 67 (+4.4)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 83 → 87 (+4.5)
  • Architecture 99 → 99 (+0.4)
  • Maturity 52 → 52 (+0.2)
  • Readiness 83 → 83 (+0.0)
  • Security 59 → 74 (+15.0)

Resolved (99)

  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — no supported dependency manifest was read
  • Duplicated block (10 lines × 2) (apps/debug_adapter/lib/debug_adapter/exunit_formatter.ex)
  • Duplicated block (10 lines × 2) (apps/debug_adapter/lib/protocol/dap/requests/set_expression.ex)
  • Duplicated block (10 lines × 2) (apps/language_server/lib/language_server/build.ex)
  • Duplicated block (10 lines × 2) (apps/language_server/lib/language_server/location.ex)
  • Duplicated block (10 lines × 3) (apps/language_server/lib/language_server/providers/definition/locator.ex)
  • Duplicated block (11 lines × 2) (apps/language_server/lib/language_server/lsp/protocol/structures/notebook_document_sync_options.ex)
  • Duplicated block (11 lines × 2) (apps/language_server/lib/language_server/lsp/protocol/structures/related_full_document_diagnostic_report.ex)
  • Duplicated block (11 lines × 2) (apps/language_server/lib/language_server/providers/call_hierarchy/locator.ex)
  • Duplicated block (11 lines × 2) (apps/language_server/lib/language_server/providers/call_hierarchy/locator.ex)
  • Duplicated block (11 lines × 2) (apps/language_server/lib/language_server/providers/completion.ex)
  • Duplicated block (11 lines × 2) (apps/language_server/lib/language_server/providers/declaration/locator.ex)
  • Duplicated block (11 lines × 2) (apps/language_server/lib/language_server/providers/implementation/locator.ex)
  • Duplicated block (11 lines × 2) (apps/language_server/lib/language_server/providers/inlay_hints.ex)
  • Duplicated block (11 lines × 2) (apps/language_server/lib/language_server/providers/references/locator.ex)
  • Duplicated block (13 lines × 2) (apps/debug_adapter/lib/debug_adapter/server.ex)
  • Duplicated block (13 lines × 2) (apps/language_server/lib/language_server/providers/declaration/locator.ex)
  • Duplicated block (14 lines × 2) (apps/language_server/lib/language_server/providers/execute_command/llm_module_dependencies.ex)
  • Duplicated block (14 lines × 2) (apps/language_server/lib/language_server/providers/execute_command/manipulate_pipes.ex)
  • …and 79 more

New (166)

  • Change coupling: test.ex ↔ server.ex (apps/language_server/lib/language_server/providers/code_lens/test.ex)
  • Dependency hygiene PARTLY measured — Mix pinning read, dependency currency not (Hex registry unreachable)
  • Documentation: no installation or build instructions (README.md)
  • Documentation: written for insiders (docs/getting-started/emacs.md)
  • Duplicated block (10 lines × 2) (apps/language_server/lib/language_server/build.ex)
  • Duplicated block (10 lines × 2) (apps/language_server/lib/language_server/providers/call_hierarchy/locator.ex)
  • Duplicated block (10 lines × 2) (apps/language_server/lib/language_server/providers/execute_command/llm_docs_aggregator.ex)
  • Duplicated block (10 lines × 2) (apps/language_server/lib/language_server/providers/hover/docs.ex)
  • Duplicated block (10–14 lines × 2) (apps/language_server/lib/language_server/providers/call_hierarchy/locator.ex)
  • Duplicated block (11 lines × 2) (apps/language_server/lib/language_server/providers/references/locator.ex)
  • Duplicated block (11–17 lines × 2) (apps/language_server/lib/language_server/providers/call_hierarchy/locator.ex)
  • Duplicated block (12 lines × 2) (apps/debug_adapter/lib/debug_adapter/server.ex)
  • Duplicated block (12 lines × 3) (apps/language_server/lib/language_server/server.ex)
  • Duplicated block (13 lines × 2) (apps/language_server/lib/language_server/providers/declaration/locator.ex)
  • Duplicated block (13 lines × 3) (apps/language_server/lib/language_server/providers/completion.ex)
  • Duplicated block (14 lines × 2) (apps/language_server/lib/language_server/providers/call_hierarchy.ex)
  • Duplicated block (14 lines × 2) (apps/language_server/lib/language_server/providers/execute_command/manipulate_pipes.ex)
  • Duplicated block (16 lines × 2) (apps/language_server/lib/language_server/providers/completion.ex)
  • Duplicated block (17 lines × 3) (apps/language_server/lib/language_server/providers/definition/locator.ex)
  • Duplicated block (17 lines × 4) (apps/language_server/lib/language_server/providers/execute_command/llm_module_dependencies.ex)
  • …and 146 more

Changes since last survey

  • 6 commits — 4 feature/other, 2 fixes

By area

  • (repo) — 2 commits
  • apps/language_server — 2 commits
  • apps/debug_adapter — 1 commit
  • apps/elixir_ls_utils — 1 commit

Notable commits

  • fix: Merge pull request #1274 from elixir-lsp/fix-evaluator-registry-wiped-on-continue
  • fix: fix(dap): keep evaluator registry when continuing all processes
  • change: Don't crash on unrecognized cursor contexts
  • change: Drop redundant is_struct/1 check in parser rescue
  • change: Merge pull request #1273 from elixir-lsp/completion-engine-unknown-cursor-context
  • change: add new liveview error to known

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

elixir-lsp/elixir-ls was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 23 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 68df44b681ee0dbef91b8008b0354003a9a451fa — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-955b9cee9818.