Skip to content
CAI
Software that uses CAICheck a score

elixir-lang/elixir

72.7

Strong · 23 September 2026

141k

lines of production code

Elixir

with Erlang

5

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is the Elixir programming language runtime and its associated standard tooling, encompassing the core language implementation, the Mix build tool, the IEx interactive shell, and the ExUnit testing framework. It provides capabilities for compiling and running Elixir code, managing project dependencies and releases, formatting source code, and executing unit tests with detailed reporting. The system also includes utilities for logging, template rendering, and interactive debugging, all integrated with Erlang/OTP infrastructure.

How it got here

2011–2012 — Core infrastructure and tooling modernization

38 changes.

This period focused on modernizing Elixir's core infrastructure by introducing standardized project configuration, enforcing stricter encapsulation in the compiler, and requiring Erlang/OTP 24. Significant architectural shifts included extracting IEx into a standalone OTP application, restructuring ExUnit for better maintainability, and implementing Mix.install for runtime dependency management. These changes were accompanied by extensive test coverage expansion and the addition of developer-friendly features like EEx indentation support and IEx pry debugging.

2013–2014 — Core library refactoring and Erlang/OTP 21 integration

37 changes.

This period focused on modernizing Elixir's core libraries by integrating with Erlang/OTP 21's native :logger, replacing gen\_event with GenServer-based agents, and introducing protocols like String.Chars. Significant architectural overhauls were applied to Mix's compiler and dependency management systems to improve performance and maintainability, while extensive test coverage was added to support these structural changes.

2015–2023 — Type system rewrite and tooling expansion

30 changes.

This period focused on a major architectural overhaul of the compiler's type checking system, replacing the previous implementation with a set-theoretic approach using Binary Decision Diagrams for improved precision and performance. Concurrently, the project expanded its developer tooling by introducing dedicated modules for code formatting and normalization, unifying installation logic in Mix, and adding comprehensive manual pages and documentation generation scripts. These core changes were supported by extensive test coverage additions and infrastructure improvements, such as parallel verification and release configuration providers.

2024–2025 — inter-process synchronization and compliance

5 changes.

This period focused on establishing a new cross-process concurrency locking and pub/sub infrastructure within Mix to support coordinated operations across multiple OS processes. Concurrently, the project introduced initial OSS Review Toolkit configuration to enforce license compliance and generate Software Bill of Materials, while expanding test coverage for macro environment functions and registry key modes.

Features

Add comprehensive manual pages for Elixir tools

This change introduces new manual pages (man pages) for the core Elixir command-line tools: \elixir\, \iex\, \mix\, and \elixirc\, along with a shared \common\ options file. Users can now consult these pages to understand command-line options, environment variables (such as \MIX\_ENV\, \MIX\_DEBUG\, and \ELIXIR\_ERL\_OPTIONS\), and file structures for each tool. The documentation covers common flags like \-eval\ and \-rpc-eval\, specific compiler options for \elixirc\, and project management features for \mix\.

man · high confidence

ExUnit framework initialization and configuration schema

The ExUnit testing framework is now available in the \lib/ex\_unit/lib\ directory, providing the core module for unit testing in Elixir. This change introduces the main \ExUnit\ module which defines the configuration options (\configure\_opts/0\), test states, and result structures. Users can now start the test runner via \ExUnit.start/0\ and configure behaviors such as test timeouts, color output, filtering, and formatter selection through the defined configuration schema.

_lib/ex\unit/lib · high confidence

IEx now supports dbg integration with pry breakpoints

IEx now integrates with Kernel.dbg/2, allowing developers to pause code execution and inspect variables, imports, and aliases at runtime. To use this feature, start IEx with the --dbg pry flag (e.g., iex --dbg pry -S mix). When dbg is encountered, IEx will ask for permission to enter a pry session, enabling interactive inspection without modifying the running code or accessing private functions. This provides a powerful debugging workflow directly within the interactive shell.

lib/iex/lib · high confidence

Initial OSS Review Toolkit (ORT) configuration for license compliance and SBoM generation

This change introduces the initial configuration for the OSS Review Toolkit (ORT) to enforce open-source policy and generate Software Bill of Materials (SBoM). It adds ORT configuration files that enable repository package curations and configurations, configure the scanner to include files without findings, and set up the analyzer to process SPDX documents. The entry includes evaluator rules that define whitelisted licenses (such as Apache-2.0 and specific Elixir trademark policies) and establish rules to flag unhandled or unmapped licenses. Additionally, it provides package-specific configurations for core components like \elixir\, \eex\, \ex\_unit\, \logger\, and \mix\ to exclude test files, documentation, and build tools from license scanning, and to curate license findings for logos, test fixtures, and unicode files.

.ort · high confidence

Introduce Config.Provider and Config.Reader modules for release configuration

Elixir now includes the \Config.Provider\ behaviour and \Config.Reader\ implementation, enabling users to load external configuration files during the system boot process in releases. This allows for flexible runtime configuration strategies, such as loading settings from JSON files or other external sources, by defining custom providers or using the built-in reader to merge additional config files into the application's environment.

lib/elixir/lib/config · high confidence

Introduce standardized project configuration and tooling files

The project now includes a set of standardized configuration files to manage formatting, linting, and build metadata. A new \.formatter.exs\ defines the Elixir code formatter inputs and local function rules, while \.markdownlint-cli2.jsonc\ configures markdown linting rules for documentation. Build and repository metadata are standardized with \.gitattributes\ for line endings and diff drivers, a comprehensive \.gitignore\ for build artifacts, and \.ort.yml\ for Open Source Toolkit license scanning and curation.

(repo-wide) · high confidence

Introduction of List.Chars protocol for charlist conversion

The \List.Chars\ protocol has been added to standardize the conversion of various data types into charlists. This new protocol defines the \to\_charlist/1\ function and provides default implementations for core Elixir types including Atoms, BitStrings, Lists, Integers, and Floats, allowing these structures to be seamlessly converted to charlists via the \Kernel.to\_charlist/1\ function.

lib/elixir/lib/list · high confidence

Introduction of Mix.install/2 for runtime dependency management

The Mix module now includes the \Mix.install/2\ function, allowing users to install and load dependencies at runtime without needing a pre-existing project structure or \mix.exs\ file. This feature enables scripting and interactive usage of external libraries directly from the command line or IEx, supporting options for configuration, environment variables, and protocol consolidation. It also introduces \Mix.installed?/0\ to check if dependencies have been installed and provides mechanisms to manage the installation directory and force reinstallation.

lib/mix/lib · high confidence

New Enum and Set-theoretic Types cheatsheets added

Added two new documentation cheatsheets to the Elixir docs: a comprehensive reference for the \Enum\ module covering predicates, filtering, mapping, and comprehensions, and a guide to set-theoretic type syntax including operators, data types, and map key specifications.

lib/elixir/pages/cheatsheets · high confidence

New ExUnit example scripts for testing failure output

Added two new example scripts, \lib/ex\_unit/examples/difference.exs\ and \lib/ex\_unit/examples/one\_of\_each.exs\, to demonstrate ExUnit's failure reporting capabilities. The \difference.exs\ script contains failing assertions for various data types (integers, floats, strings, lists, maps, structs, etc.) to showcase the new difference highlighting features, including whitespace visualization and inner-diff support. The \one\_of\_each.exs\ script provides a comprehensive catalog of all ExUnit assertion and refute variants (including \assert\_receive\, \assert\_raise\, \assert\_in\_delta\, and linked/trapped exit handling) to document the specific output style for each failure mode.

_lib/ex\unit/examples · high confidence

New IO.ANSI and IO.Stream modules for terminal formatting and streaming

This change introduces two new modules to the IO library. IO.ANSI provides functionality to render ANSI escape sequences for controlling terminal formatting, color, and output options, including support for 256-color and RGB color modes, various text attributes (bold, italic, underline, etc.), and a high-level format/1 API that automatically handles ANSI enablement checks. IO.Stream defines a struct and implementations for the Enumerable and Collectable protocols, allowing IO devices to be treated as streams for reading lines or bytes and writing data, with support for both raw binary and character modes.

lib/elixir/lib/io · high confidence

New IO.ANSI.Docs module for formatted documentation rendering

The \IO.ANSI.Docs\ module has been introduced to handle the formatting and display of documentation within the IEx shell. This new component provides structured rendering for Markdown content, including support for headings, code blocks, quotes, and metadata (such as deprecation notices and guard clauses). It allows users to view richer, color-coded documentation directly in the interactive shell, replacing previous ad-hoc or less structured printing methods.

lib/elixir/lib/io/ansi · high confidence

New Mix.Shell.Quiet shell implementation

A new Mix.Shell.Quiet module has been added to suppress informational output when the MIX\_QUIET environment variable is set. It delegates most operations to Mix.Shell.IO but overrides info/1 to print nothing and cmd/2 to execute commands without streaming output, allowing users to run Mix tasks with significantly reduced console noise.

lib/mix/lib/mix/shell · high confidence

New Record.Extractor module for parsing Erlang records

The \lib/elixir/lib/record/extractor.ex\ module has been added to provide programmatic extraction of Erlang record definitions. It exposes \extract/2\ and \extract\_all/1\ functions that parse Erlang source files (supporting both \:from\ and \:from\_lib\ options) to retrieve record names and their field default values. This implementation leverages Erlang's \:epp\ for macro expansion and \:erl\_expand\_records\ for parsing, allowing Elixir code to introspect Erlang record structures directly.

lib/elixir/lib/record · high confidence

New cross-process concurrency locking and pub/sub infrastructure

Mix now includes a new synchronization layer in \lib/mix/sync\ that enables coordination across multiple OS processes. This introduces a filesystem-based lock implementation (\Mix.Sync.Lock\) using TCP sockets and hard links, which can be disabled via the \MIX\_OS\_CONCURRENCY\_LOCK\ environment variable. It also adds a TCP-based pub/sub system (\Mix.Sync.PubSub\) for inter-process communication and a \Mix.PubSub.Subscriber\ GenServer to accumulate and flush messages. These components provide the foundation for listening to concurrent mix compilations and improving user detection in lock and pub/sub operations.

lib/mix/lib/mix/sync · high confidence

New internal scripts for test coverage, build artifact comparison, and documentation generation

The \lib/elixir/scripts\ directory now contains several new internal tooling scripts that change how the Elixir project is tested, built, and documented. \cover.exs\ and \cover\_record.exs\ implement a new test coverage reporting mechanism that collects and combines coverage data from ExUnit suites, allowing developers to generate coverage reports. \diff.exs\ adds utilities for comparing build artifacts, specifically providing human-friendly diffs for BEAM files to aid in verifying deterministic builds. Additionally, \docs\_config.exs\, \elixir\_docs.exs\, and \mix\_docs.exs\ configure and generate documentation, introducing support for Markdown and ePUB formats, integrating Mermaid diagrams for visualizations, and setting up version-specific documentation hosting via HexDocs.

lib/elixir/scripts · high confidence

New module-level type checking and parallel verification infrastructure

Elixir introduces a new type checking system and parallel verification engine to improve compile-time diagnostics. A new \Module.Behaviour\ module handles validation of \@behaviour\ and \@impl\ attributes, ensuring callbacks are correctly defined and implemented. The \Module.ParallelChecker\ module provides a concurrent verification process that checks modules in parallel, optimizing compilation performance and handling cache lookups for BEAM files. Additionally, \Module.Types\ implements type inference and signature generation, allowing the compiler to automatically infer return types for functions and detect unused private definitions. These changes shift type-related logic from the core compiler into dedicated modules, enabling more precise error reporting and faster compilation through parallelization.

lib/elixir/lib/module · high confidence

New offline Windows installer with Erlang/OTP verification and PATH management

Elixir now provides an offline Windows installer that verifies the presence and version of Erlang/OTP before proceeding, guiding users to download the correct Erlang version if missing or mismatched. The installer allows users to optionally add both the Elixir and Erlang/OTP binary directories to their system PATH via a dedicated Erlang script that updates the Windows registry, and it includes a build script to generate the installer from precompiled archives.

_lib/elixir/scripts/windows\installer · high confidence

Architecture

ExUnit test framework codebase restructured into new module files

The ExUnit test framework implementation has been reorganized into distinct, dedicated module files (such as assertions.ex, callbacks.ex, and capture\_io.ex) replacing the previous monolithic structure. This change improves code maintainability and clarity by separating assertion logic, lifecycle callbacks, and IO capture functionality into their own modules, while preserving the existing public API and behavior for users writing tests.

_lib/ex\_unit/lib/ex\unit · high confidence

IEx is extracted into its own application with a new supervision tree

The IEx interactive shell has been restructured into a standalone OTP application (lib/iex/lib/iex). It now includes a dedicated application module (IEx.App) that starts a supervisor tree containing the configuration agent (IEx.Config), the broker for managing shell takeovers (IEx.Broker), and the pry infrastructure (IEx.Pry). This change decouples the shell's lifecycle and internal components—such as the evaluator, history, and autocomplete logic—from the main Elixir application, providing a more robust and modular foundation for the interactive shell.

lib/iex/lib/iex · high confidence

Behavioural changes

Agent implementation refactored into a dedicated GenServer module

The internal implementation of Agent has been restructured by introducing a new Agent.Server module that explicitly uses GenServer. This change centralizes the agent's state management and message handling logic within a dedicated server process, replacing previous inline or less structured implementations. Users interacting with Agent will see no functional change, but the underlying architecture now leverages GenServer's standard lifecycle and error handling mechanisms more directly.

lib/elixir/lib/agent · high confidence

Deprecate legacy Logger.Backends.Console in favor of new handler system

The \Logger.Backends.Console\ module is now deprecated and emits a warning at startup, directing users to migrate to the new \:console\ handler via \:default\_handler\ and \:default\_formatter\ configuration. The \lib/logger/lib/logger/backends\ directory now contains the internal implementation of this new handler-based architecture (including \Handler\, \Config\, \Internal\, \Supervisor\, and \Watcher\ modules) which replaces the old \:gen\_event\-based backend model. While the legacy \Logger.Backends.Console\ remains available for backwards compatibility, it is scheduled for removal in Elixir v1.20.

lib/logger/lib/logger/backends · high confidence

Deprecation of Supervisor.Spec module

The \Supervisor.Spec\ module is now deprecated and marked as outdated. Its functions for building child specifications do not work with the module-based child specs introduced in Elixir v1.5. Users should migrate to the new child specifications outlined in the \Supervisor\ module documentation instead.

lib/elixir/lib/supervisor · high confidence

EEx adds indentation support and detailed syntax error reporting

EEx now includes an \:indentation\ option (since v1.11.0) that allows users to specify an integer added to the column number after every newline, improving alignment in generated code. Additionally, syntax errors (\EEx.SyntaxError\) now include a \:column\ field and a \:snippet\ of the source code, providing more precise and helpful error messages for debugging templates.

lib/eex/lib · high confidence

Elixir 1.20 deprecations introduced

The standard library now includes deprecation warnings for features scheduled for removal in Elixir v1.20, alerting users to upcoming breaking changes in the API.

lib/elixir/lib · high confidence

Elixir compiler warnings are no longer treated as errors

The Elixir build configuration has been updated to stop treating compiler warnings as fatal errors. The \Emakefile\ now includes a comprehensive list of warning flags (such as \warn\_unused\_vars\ and \warn\_export\_all\) to identify potential issues, but the \warnings\_as\_errors\ option is explicitly commented out. This change allows the build to succeed even when warnings are present, shifting the focus from strict error enforcement to warning visibility.

lib/elixir · high confidence

GenEvent.Stream is deprecated and no longer supported

The GenEvent.Stream module, which allowed event managers to be consumed as enumerables, has been marked as deprecated with a clear notice that this functionality is no longer supported. The implementation remains in the codebase but is explicitly disabled for new usage, signaling that users should migrate away from streaming GenEvent notifications.

_lib/elixir/lib/gen\event · high confidence

Integration with Erlang/OTP 21 Logger

The Logger module is now a wrapper around Erlang's native :logger functionality, providing message translation and formatting for Elixir terms. This change introduces support for all 8 syslog levels, structured logging via reports (keyword lists and maps), and integration with Erlang's logging handlers, filters, and overload protection mechanisms.

lib/logger/lib · high confidence

Introduce EEx.Engine as the base for custom engines

EEx now provides a new \EEx.Engine\ module that defines the standard callbacks (\init\, \handle\_body\, \handle\_begin\, \handle\_end\, \handle\_text\, \handle\_expr\) for building custom template engines. The existing \EEx.SmartEngine\ has been refactored to delegate to this new base, and the old \use EEx.Engine\ macro is deprecated in favor of explicit delegation. This change establishes a cleaner, more consistent API for developers creating custom EEx engines.

lib/eex/lib/eex · high confidence

Introduce File.Stat struct and refactor File.Stream implementation

The \File.Stat\ module is introduced as a dedicated struct to hold file information, providing explicit conversion functions (\to\_record\/\from\_record\) between the Elixir struct and Erlang's \:file\_info\ record, with updated typespecs allowing integer types for time fields. Concurrently, \File.Stream\ is refactored to support distributed file reading via the \node\ field, add a \:read\_offset\ option for seeking within files, and optimize the \Enumerable.count/1\ implementation for accurate line and byte counting.

lib/elixir/lib/file · high confidence

Introduce Inspect.Opts struct and Inspect.Error exception

The Inspect module now uses a dedicated \Inspect.Opts\ struct to manage inspection configuration, replacing previous keyword-list handling. This struct supports options such as \:base\, \:binaries\, \:charlists\, \:custom\_options\, \:inspect\_fun\, \:limit\, \:pretty\, \:printable\_limit\, \:safe\, \:structs\, \:syntax\_colors\, and \:width\. A new \Inspect.Error\ exception has been added to wrap inspection failures, preserving the original exception, message, stacktrace, and the struct being inspected, which improves debugging when custom \Inspect\ implementations fail.

lib/elixir/lib/inspect · high confidence

Introduce Kernel.LexicalTracker for scope-aware dependency tracking

Elixir now uses a dedicated \Kernel.LexicalTracker\ GenServer to track module references, aliases, imports, and requires within lexical scopes. This replaces the previous table-based approach, allowing the compiler to accurately warn about unused aliases, imports, and requires, and to distinguish between compile-time and runtime dependencies more precisely. This change improves the accuracy of compiler diagnostics and supports better handling of lexical scoping in macros and quoted code.

lib/elixir/lib/kernel · high confidence

Introduce Mix.AppLoader for optimized application loading

Mix now uses a new \Mix.AppLoader\ module to read and traverse application dependencies in an optimized format, caching the results in a manifest file to speed up startup and compilation. This change improves build performance by reducing the overhead of loading application specifications and managing dependency paths during the Mix CLI execution.

lib/mix/lib/mix · high confidence

Introduce Mix.SCM.Git and Mix.SCM.Path implementations

This change introduces the concrete implementations for Mix's Source Control Management (SCM) system: Mix.SCM.Git handles fetching and managing Git repositories, while Mix.SCM.Path handles local path dependencies. The Git implementation supports modern Git features such as sparse checkouts, shallow clones via the :depth option, and subdirectory extraction via the :subdir option. It also improves security by redacting credentials in URIs and validates Git options to prevent conflicts. The Path implementation ensures proper resolution of in-umbrella dependencies and local paths, raising clear errors if checkout is attempted on path dependencies.

lib/mix/lib/mix/scm · high confidence

Introduce Task.Supervised and refactor Task.Supervisor internals

The Task module now includes a new Task.Supervised module that handles the low-level process spawning and monitoring logic for supervised tasks, separating it from the public Task.Supervisor API. This change refactors how tasks are started and monitored, introducing a dedicated process for handling async operations and ensuring that monitor references are only set up when awaited, which reduces overhead and prevents potential race conditions during node disconnections. The Task.Supervisor module itself has been updated to delegate to this new supervised implementation, maintaining the same public interface for starting and managing tasks while improving internal stability and performance.

lib/elixir/lib/task · high confidence

Introduce dedicated Code.Formatter, Code.Normalizer, and Code.Fragment modules

The code formatting, AST normalization, and code fragment analysis capabilities are now organized into new dedicated modules: \Code.Formatter\, \Code.Normalizer\, and \Code.Fragment\. \Code.Formatter\ exposes functions like \to\_algebra/2\ and \locals\_without\_parens/0\ to handle the conversion of quoted expressions into formatted documents, while \Code.Normalizer\ provides the \normalize/2\ function to standardize AST structures before formatting. \Code.Fragment\ introduces experimental utilities for analyzing code snippets, including \cursor\_context/1\ for autocompletion support and \container\_cursor\_to\_quoted/2\ for context-aware parsing. These changes refactor the internal implementation of the \Code\ module to improve modularity and maintainability without altering the public API surface for existing users.

lib/elixir/lib/code · high confidence

Introduce shared Stream.Reducers module for optimized chunking and zipping

A new \Stream.Reducers\ module has been added to centralize and optimize core reduction logic shared between \Enum\ and \Stream\. This change introduces efficient implementations for \zip\_with\ (handling both list and enumerable zipping) and \chunk\_every\/\chunk\_by\, allowing these operations to be performed with reduced overhead. Users benefit from improved performance and consistent behavior when using chunking and zipping functions across both modules, as the underlying logic is now unified rather than duplicated.

lib/elixir/lib/stream · high confidence

Introduces Mix.Local.Installer to unify archive and escript installation logic

A new \Mix.Local.Installer\ module has been added to consolidate the shared functionality between archive and escript installation tasks. This change introduces a unified interface for installing artifacts from local paths, URLs, or remote dependencies (via a fetcher), supporting options such as \--force\, \--sha512\, \--sparse\, and \--organization\. Users benefit from consistent behavior and error handling across both \mix archive.install\ and \mix escript.install\ commands, with improved validation of installation sources and clearer guidance when local file paths are invalid.

lib/mix/lib/mix/local · high confidence

Introduction of String.Chars protocol for string conversion

The String.Chars protocol has been introduced to standardize how various data types are converted to strings. This new protocol defines the \to\_string/1\ function, which is automatically imported by Kernel and invoked during string interpolation (e.g., \"foo\#{bar}"\). Implementations are provided for Atom, BitString, List, Integer, and Float, delegating to their respective module functions (such as \Atom.to\_string/1\, \List.to\_string/1\, \Integer.to\_string/1\, and \Float.to\_string/1\). This change establishes a consistent mechanism for string representation across different types, replacing ad-hoc conversion logic.

lib/elixir/lib/string · high confidence

Logger now uses Erlang's :logger as the primary implementation

The Logger application has been rewritten to integrate directly with Erlang's native :logger, replacing the previous gen\_event-based backend. This change introduces a new startup flow in Logger.App that configures :logger primary filters for translation and process-level logging, and registers the default handler via :logger.add\_handler. Users will see deprecation warnings if they still use the legacy :backends configuration key, which should be replaced with :default\_handler or the new LoggerBackends library. The Logger.Formatter module now provides conveniences for the new :logger formatter API, and the Logger.Translator handles the conversion of Erlang OTP reports into Elixir-compatible log messages.

lib/logger/lib/logger · high confidence

Macro.Env converted to a struct with private fields

The compile-time environment representation in \Macro.Env\ has been refactored from a map to a struct. Public access is now restricted to specific fields (context, context\_modules, file, function, line, module), while internal state such as aliases, functions, macros, lexical\_tracker, and versioned\_vars is marked as private. This change enforces stricter encapsulation, requiring users to interact with the environment via the provided public API functions rather than direct map manipulation, which improves stability for tools like language servers and embedded languages.

lib/elixir/lib/macro · high confidence

Major overhaul of Mix compiler architecture and manifest system

The Elixir and Erlang compilers have been significantly refactored to improve compilation speed, reliability, and diagnostic accuracy. The compiler now uses a new manifest format (v37 for Elixir, v1 for Erlang) that tracks file digests, modification times, and detailed dependency graphs (compile-time, runtime, and export references) to minimize unnecessary recompilations. Key behavioral changes include parallelizing Erlang compilation, separating protocol consolidation into its own compiler module with its own manifest, and introducing a \\_\_mix\recompile\\_/0\ callback for custom recompilation logic. The compiler now returns structured diagnostics with source spans and columns, tracks external resources via \@external\_resource\, and handles stale local dependencies more robustly. Additionally, the test compiler now supports \--stale\ and \--dry-run\ modes, and protocol consolidation is optimized to only recompile changed protocols and implementations.

lib/mix/lib/mix/compilers · high confidence

Mix tasks now use maps instead of records

The internal data structures for Mix tasks and dependency management have been migrated from Erlang records to Elixir maps. This change improves code maintainability and aligns with modern Elixir conventions, but may require updates to any custom code that directly accessed record fields via pattern matching or record selectors.

lib/mix/lib/mix/tasks · high confidence

New set-theoretic type checker implementation

The type checking system has been completely rewritten to use a set-theoretic approach based on Binary Decision Diagrams (BDDs) for representing types, replacing the previous implementation. This new architecture introduces a modular structure with dedicated modules for handling expressions (Expr), patterns (Pattern), function application (Apply), and type descriptors (Descr). Users benefit from more precise type inference, improved error messages, and better performance in type checking, particularly for complex map and tuple operations.

lib/elixir/lib/module/types · high confidence

Refactored dependency management into modular components

The dependency resolution logic in Mix has been reorganized into distinct, private modules to improve maintainability and separation of concerns. The \Mix.Dep.Converger\ module now handles the recursive convergence of dependencies and topological sorting, including cycle detection. \Mix.Dep.Loader\ is responsible for loading dependency definitions, determining managers (Mix, Rebar, Make), and handling environment/target filtering. \Mix.Dep.Fetcher\ manages the actual fetching and updating of dependencies from their sources, while \Mix.Dep.Lock\ handles reading and writing the lockfile, including merge conflict detection. \Mix.Dep.Umbrella\ manages umbrella project child dependencies, and \Mix.Dep.ElixirSCM\ manages the Elixir/OTP version manifest. This refactoring isolates specific responsibilities, making the dependency system easier to understand and extend.

lib/mix/lib/mix/dep · high confidence

Reorganized calendar modules and introduced Duration struct

The calendar library has been refactored by splitting the monolithic implementation into separate modules for Date, Date.Range, DateTime, NaiveDateTime, Time, and the ISO calendar logic, improving code organization and maintainability. A new Duration struct has been added to represent time spans with support for year, month, week, day, hour, minute, second, and microsecond units, enabling more precise duration calculations and shifting operations across calendar types.

lib/elixir/lib/calendar · high confidence

Require Erlang/OTP 24 and remove support for older versions

Elixir now requires Erlang/OTP 24 or later, dropping support for previous OTP releases. This change removes compatibility code and workarounds for older Erlang versions, simplifying the codebase and allowing the use of newer Erlang features.

lib/elixir/src · high confidence

Revamped command-line executables with unified CLI and Windows support

The bin scripts (elixir, iex, elixirc, mix) have been rewritten to provide a consistent, POSIX-compliant shell interface on Unix and robust support for Windows via new .bat and .ps1 wrappers. The elixir script now handles a comprehensive set of command-line options including distribution flags (--cookie, --name, --rpc-eval), release configuration (--boot, --vm-args), and logging controls (--logger-otp-reports), while iex delegates to elixir with specific IEx flags like --dbg pry and --dot-iex. The mix executable is now a lightweight Elixir script that invokes Mix.CLI.main, ensuring it works correctly when invoked from any directory or via symlinks. Windows users benefit from batch files that properly handle paths with spaces, quote arguments, and support the same core options as their Unix counterparts, with PowerShell scripts added to handle argument parsing nuances in that environment.

bin · high confidence

Test coverage

Add comprehensive test suite for EEx template engine; Add test fixture for verifying release environment variables; Added Dialyzer test fixtures for Elixir language constructs; Added EEx template fixtures for testing; Added Erlang EUnit test suite for Elixir's parser and tokenizer; Added ExUnit integration tests; Added comprehensive test coverage for Elixir Calendar modules; Added comprehensive test suite for IEx components; Added comprehensive test suite for the code formatter; Added comprehensive test suite for the new type checker; Added escript test fixture module; Added test coverage for Logger backends; Added test coverage for Mix core modules; Added test coverage for Registry duplicate and unique key modes; Added test fixture for compile listener notifications; Added test fixture for escript configuration; Added test fixture for handling files in umbrella apps; Added test fixture for missing mix.exs handling; Added test fixture for raw dependencies; Added test fixture for rebar config script evaluation; Added test fixture for rebar dependency resolution; Added test fixtures for Elixir config system features; Added test fixtures for Erlang compilation behavior; Added test fixtures for Mix and rebar3 integration tests; Added test fixtures for \mix test --failed\; Added test fixtures for archive installation scenarios; Added test fixtures for dependency status edge cases; Added test fixtures for dependency status scenarios; Added test fixtures for file handling and exit behavior; Added test fixtures for leex and yecc compilation; Added test fixtures for modules without a mix file; Added test fixtures for protocol consolidation scenarios; Added test fixtures for release configuration and encoding; Added test fixtures for stale test detection; Added test fixtures for the 'bar' umbrella app; Added test fixtures for umbrella project apps; Added test suite for Logger backends, formatter, translator, and utilities; Added test suite for Logger configuration and metadata APIs; Added test suite for Mix.install/2 and Mix test infrastructure; Added tests for Code.Normalizer AST formatting; Added tests for EEx tokenizer and SmartEngine; Added tests for IO.ANSI.Docs formatting; Added tests for Inspect.Algebra and Inspect.Opts; Added tests for List.Chars.to\_charlist implementations; Added tests for Macro.Env macro environment functions; Added tests for Mix sync primitives and app lifecycle tasks; Added tests for Mix.Local.Installer argument parsing; Added tests for Mix.SCM.Git validation and formatting; Added tests for Mix.Shell.IO and Mix.Shell.Quiet; Added tests for String.Chars protocol implementations; Added tests for Task.Supervisor behavior and integration; Added tests for config providers and reader; Added tests for dependency convergence, lock file formatting, and conflict detection; Added tests for protocol consolidation behavior; Expanded test coverage for Elixir core libraries; Expanded test coverage for Elixir kernel and compiler diagnostics; Initial test suite for ExUnit core components; Introduce IEx test framework and helper utilities; Tests for File.Stream distributed execution and offset support; Tests for IO.ANSI formatting, colors, and escape sequences.

Dependencies

Standardize core library project definitions to MixProject

The core Elixir libraries (EEx, Elixir, ExUnit, IEx, Logger, and Mix) now use the \MixProject\ module name in their \mix.exs\ files, aligning with the modern project definition style. This change also standardizes the versioning of these core applications to use \System.version()\ and explicitly sets \build\_per\_environment: false\ to ensure consistent build behavior across environments.

(dependencies) · high confidence

Update Unicode database to version 17.0.0

The Unicode character data files in lib/elixir/unicode have been updated to version 17.0.0. This includes new or refreshed data files such as IdentifierType.txt, PropList.txt, PropertyValueAliases.txt, ScriptExtensions.txt, and Scripts.txt, ensuring that Elixir's string processing, identifier validation, and normalization logic align with the latest Unicode standards.

lib/elixir/unicode · 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 73 → 73 (+0.1)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 81 → 82 (+0.1)
  • Architecture 98 → 98 (+0.6)
  • Maturity 56 → 57 (+0.1)
  • Readiness 83 → 83 (+0.0)
  • Security 100 → 100 (+0.0)
  • Event Sourcing 100 → 100 (+0.0)

Resolved (97)

  • Change coupling: app.tree.ex ↔ deps.tree.ex (lib/mix/lib/mix/tasks/app.tree.ex)
  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — no supported dependency manifest was read
  • Duplicated block (10 lines × 4) (lib/elixir/lib/module/types/helpers.ex)
  • Duplicated block (11 lines × 2) (lib/mix/lib/mix/tasks/compile.ex)
  • Duplicated block (12 lines × 2) (lib/elixir/lib/calendar/datetime.ex)
  • Duplicated block (12 lines × 2) (lib/elixir/lib/calendar/naive_datetime.ex)
  • Duplicated block (14 lines × 2) (lib/logger/lib/logger/translator.ex)
  • Duplicated block (18 lines × 2) (lib/elixir/lib/calendar/datetime.ex)
  • Duplicated block (19 lines × 2) (lib/elixir/lib/calendar/datetime.ex)
  • Duplicated block (5 lines × 2) (lib/eex/lib/eex/compiler.ex)
  • Duplicated block (5 lines × 2) (lib/elixir/lib/module/types/apply.ex)
  • Duplicated block (5 lines × 2) (lib/elixir/lib/module/types/apply.ex)
  • Duplicated block (5 lines × 2) (lib/elixir/lib/module/types/apply.ex)
  • Duplicated block (5 lines × 2) (lib/elixir/lib/module/types/descr.ex)
  • Duplicated block (5 lines × 3) (lib/elixir/lib/registry.ex)
  • Duplicated block (6 lines × 2) (lib/elixir/lib/code.ex)
  • Duplicated block (6 lines × 2) (lib/elixir/lib/code/formatter.ex)
  • Duplicated block (6 lines × 2) (lib/elixir/lib/module/types/helpers.ex)
  • Duplicated block (7 lines × 2) (lib/elixir/lib/access.ex)
  • …and 77 more

New (249)

  • Coverage not measured — no coverage collector is wired up
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • Duplicated block (10 lines × 2) (lib/elixir/lib/enum.ex)
  • Duplicated block (10 lines × 3) (lib/mix/lib/mix/tasks/clean.ex)
  • Duplicated block (10 lines × 4) (lib/elixir/lib/module/types/helpers.ex)
  • Duplicated block (11 lines × 2) (lib/mix/lib/mix/tasks/compile.ex)
  • Duplicated block (12 lines × 11) (lib/elixir/lib/module/types/expr.ex)
  • Duplicated block (12 lines × 2) (lib/elixir/lib/calendar/datetime.ex)
  • Duplicated block (12 lines × 2) (lib/elixir/lib/calendar/naive_datetime.ex)
  • Duplicated block (12 lines × 2) (lib/elixir/lib/version.ex)
  • Duplicated block (12 lines × 3) (lib/logger/lib/logger/translator.ex)
  • Duplicated block (13 lines × 2) (lib/logger/lib/logger/translator.ex)
  • Duplicated block (13 lines × 2) (lib/logger/lib/logger/translator.ex)
  • Duplicated block (14 lines × 2) (lib/elixir/lib/enum.ex)
  • Duplicated block (14 lines × 2) (lib/mix/lib/mix/tasks/profile.cprof.ex)
  • Duplicated block (18 lines × 2) (lib/elixir/lib/calendar/datetime.ex)
  • Duplicated block (4–6 lines × 4) (lib/elixir/lib/module/types/helpers.ex)
  • Duplicated block (5 lines × 2) (lib/eex/lib/eex/compiler.ex)
  • Duplicated block (5 lines × 2) (lib/elixir/lib/hash_dict.ex)
  • …and 229 more

Changes since last survey

  • 175 commits — 141 feature/other, 34 fixes

By area

  • lib/elixir — 136 commits
  • lib/mix — 14 commits
  • lib/ex_unit — 9 commits
  • .github/workflows — 8 commits
  • (root) — 5 commits
  • lib/iex — 2 commits
  • lib/eex — 1 commit

Notable commits

  • fix: Fix Date.to_iso8601/2 loses :format with custom calendar (#15740)
  • fix: Fix DateTime convert/2 and truncate/2 ignoring custom calendar from map (#15814)
  • fix: Fix IEx incomplete codepoint autocomplete crash (#15864)
  • fix: Fix IEx.h/1 macro spec introspection (#15863)
  • fix: Fix Kernel.SpecialForms ::/2 doc example (#15818)
  • fix: Fix OptionParser wrong errors for list switch types (#15881)
  • fix: Fix Task.yield_many/2 waits too long or forever when :limit exceeds task count (#15737)
  • fix: Fix CALLER.macro_aliases type (#15853)
  • fix: Fix File.open/2 and variants specs to accept :directory option (#15890)
  • fix: Fix base64 swar singleton false positive (#15773)
  • fix: Fix constant retrigger of protocol consolidations in umbrellas
  • fix: Fix dark-mode logo in README (#15915)
  • fix: Fix escaping of literal interpolated strings, closes #15718
  • fix: Fix final sigma handling in :greek (#15791)
  • fix: Fix float round/2, floor/2, ceil/2 raises wrong exception for invalid precision (#15872)
  • fix: Fix functions with impossible clauses typecheck crash (#15794)
  • fix: Fix inferred type of :erlang.split_binary/2 result when arg is bitstring (#15790)
  • fix: Fix kernel defstruct doc example (#15867)
  • fix: Fix macro dbg/3 ignores ANSI color setting (#15842)
  • fix: Fix macro unescape_string/2 spec and doc (#15841)
  • …and 155 more

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-lang/elixir 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 2ea693db95e0f400238ae021a7fa43c0e7cb08f2 — 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.