dev-newsElixir logoelixir-lang.org

Latest stable Elixir: 1.20.4, released (release notes). 29 stable releases since 31 Jan 2024.

Elixir

Six release branches since January 2024. The policy covers five with security fixes, and the August fix reached three.

3 branches patched on 28 Aug 2026

1.15
  1. 1.15.8, 20 May 2024
1
1.16
  1. 1.16.1, 31 Jan 2024
  2. 1.16.2, 10 Mar 2024
  3. 1.16.3, 20 May 2024
3
1.17
  1. 1.17.0-rc.0, 24 May 2024
  2. 1.17.0-rc.1, 3 Jun 2024
  3. 1.17.0, 12 Jun 2024
  4. 1.17.1, 18 Jun 2024
  5. 1.17.2, 6 Jul 2024
  6. 1.17.3, 18 Sep 2024
4
1.18
  1. 1.18.0-rc.0, 10 Dec 2024
  2. 1.18.0, 19 Dec 2024
  3. 1.18.1, 24 Dec 2024
  4. 1.18.2, 22 Jan 2025
  5. 1.18.3, 6 Mar 2025
  6. 1.18.4, 21 May 2025
  7. 1.18.5, 28 Aug 2026
6
1.19
  1. 1.19.0-rc.0, 9 Jun 2025
  2. 1.19.0-rc.1, 5 Oct 2025
  3. 1.19.0-rc.2, 7 Oct 2025
  4. 1.19.0, 16 Oct 2025
  5. 1.19.1, 20 Oct 2025
  6. 1.19.2, 2 Nov 2025
  7. 1.19.3, 13 Nov 2025
  8. 1.19.4, 27 Nov 2025
  9. 1.19.5, 9 Jan 2026
  10. 1.19.6, 28 Aug 2026
7
1.20
  1. 1.20.0-rc.0, 9 Jan 2026
  2. 1.20.0-rc.1, 13 Jan 2026
  3. 1.20.0-rc.2, 4 Mar 2026
  4. 1.20.0-rc.3, 9 Mar 2026
  5. 1.20.0-rc.4, 31 Mar 2026
  6. 1.20.0-rc.5, 13 May 2026
  7. 1.20.0-rc.6, 21 May 2026
  8. 1.20.0, 3 Jun 2026
  9. 1.20.1, 9 Jun 2026
  10. 1.20.2, 23 Jun 2026
  11. 1.20.3, 4 Aug 2026
  12. 1.20.4, 28 Aug 2026
5

releaserelease candidateThe number on the right counts final releases per branch.

Elixir 1.20 came out on 3 June 2026 after seven release candidates and 145 days. The announcement calls Elixir "now a gradually typed language". It finds bugs without type annotations, and there is still no syntax for writing a type down.

The latest release is 1.20.4 from 28 August 2026, a security fix for CVE-2026-75758. The advisory marks every release since 1.15.0 as affected. The compatibility page promises security patches for five branches, 1.16 to 1.20, but only three got a fixed release that day. The newest 1.17 release is still 1.17.3, from September 2024.

As of 25 October 2026.

What we wrote then, and what happened next

Latest releases

  1. 1.18.5Security fix for CVE-2026-75758.
  2. 1.19.6Security fix for CVE-2026-75758.
  3. 1.20.4Security fix for CVE-2026-75758.
  4. 1.20.3Bug fixes.
  5. 1.20.2Bug fixes.
  6. 1.20.1Security fix for CVE-2026-49762.
  7. 1.20.0New minor release.
  8. 1.19.5Bug fixes.

Recent posts on the Elixir blog

Installing Elixir with the right Erlang/OTP

Elixir 1.20.4 needs Erlang/OTP 27 or later, and the 1.20 line is supported on OTP 27 to 29. The quickest route is the install script from elixir-lang.org, which sets up a matching Erlang as well. For projects pinned to different versions, the install page lists asdf and mise as version managers.

Erlang/OTP support per Elixir minor
Elixir242526272829
1.20nononosupportedsupportedsupported
1.19nonosupportedsupportedsupportedno
1.18nosupportedsupportedsupportednono
1.17nosupportedsupportedsupportednono
1.16supportedsupportedsupportednonono
1.15supportedsupportedsupportednonono
Lit cells: OTP majors each Elixir minor supports. Columns are OTP releases.
  1. Install script for macOS, Ubuntu or Windows with bash. It installs Erlang and Elixir side by side, and you put both on your PATH:
    curl -fsSO https://elixir-lang.org/install.sh
    sh install.sh [email protected] [email protected]
    installs_dir=$HOME/.elixir-install/installs
    export PATH=$installs_dir/otp/28.4/bin:$PATH
    export PATH=$installs_dir/elixir/1.20.4-otp-28/bin:$PATH
  2. With mise, pin Erlang and an Elixir build compiled for the same OTP major, which is the -otp-29 suffix:
    mise use erlang@29 [email protected]
    mise exec -- elixir --version
  3. On Windows the official installer comes in one build per OTP major (27, 28, 29), so run erl first to see which Erlang you have. Scoop and Chocolatey work too:
    scoop install erlang
    scoop install elixir
    # or
    choco install elixir
  4. In GitHub Actions, erlef/setup-beam reads the same pins from .tool-versions or mise.toml. With a version file it insists on version-type: strict:
    - uses: actions/checkout@v4
    - uses: erlef/setup-beam@v1
      with:
        version-file: .tool-versions
        version-type: strict

The table is a support promise per minor: 1.19 is supported on OTP 26 to 28. Moving a machine to OTP 29 means moving to Elixir 1.20 with it.

Install Elixir Compatibility and deprecations mise: Elixir erlef/setup-beam

Which Elixir versions still get security fixes

Bug fixes go to the newest minor only, which is 1.20. Security patches are promised for the last five minors, 1.16 to 1.20. For CVE-2026-75758 the record is shorter: the advisory lists every release from 1.15.0 up to the fixes as affected, and fixed releases exist for 1.18, 1.19 and 1.20 only.

  1. 1.20bug fixes and securitylast release 1.20.4, 28 Aug 2026fixed
  2. 1.19security onlylast release 1.19.6, 28 Aug 2026fixed
  3. 1.18security onlylast release 1.18.5, 28 Aug 2026fixed
  4. 1.17security onlylast release 1.17.3, 18 Sep 2024no fix
  5. 1.16security onlylast release 1.16.3, 20 May 2024no fix
Branches with security support on the compatibility page and whether each got a CVE-2026-75758 release.
  1. Check which Elixir and Erlang/OTP you run:
    elixir --version
  2. Move to the fixed release on your branch: 1.18.5, 1.19.6 or 1.20.4. On 1.16 or 1.17 there is no fixed release, so the fix is an upgrade to 1.18.5 or later.
  3. New releases go to the read-only announcements mailing list, and security releases are tagged [security] there.

The bug: inspect/1 checks only the first 4,096 elements of a list before treating it as text. A longer printable list with one invalid element at the end fails the conversion, and the error path recurses until the process hits its heap limit or the node runs out of memory. The advisory rates it moderate.

GHSA-jf5q-v438-665c Compatibility and deprecations 1.20.4 notes 1.18.5 notes

What the type checker catches, 1.17 to 1.20

Since 1.17 the compiler runs a set-theoretic type checker over code that has no type annotations. Each minor taught it more. 1.20 infers types for every construct and reports what the announcement calls verified bugs: typing violations that are guaranteed to fail at runtime.

  1. 1.17First release with the type system in the compiler4 hard deprecations
  2. 1.18Infers patterns and return types, checks function calls7 hard deprecations
  3. 1.19Checks protocol dispatch and anonymous functions4 hard deprecations
  4. 1.20Infers every construct, guards included, reports verified bugs5 hard deprecations
Type checker milestones and the number of hard deprecations each minor added.
  1. A verified bug, from the 1.20 announcement. data.a narrows data to a map with an a field, so using data itself as a number is a violation and the compiler warns:
    def add_a_and_b(data) do
      data.a + data
    end
  2. New releases add new warnings, and the compatibility page warns that these fail builds that run with --warnings-as-errors. Upgrade the compiler on a branch first:
    mix compile --warnings-as-errors
  3. 1.20 hard-deprecated five things. One of them: a size from a variable in a binary pattern now needs the pin operator, which works since 1.15:
    <<x::size(^y)>> = bin

Type signatures have no date. The 1.20 announcement sets four conditions first: good checker performance, plus efficient recursive types, parametric types and traversal of map key-value pairs.

1.17 announcement 1.18 announcement 1.19 announcement 1.20 announcement Deprecations table

Faster compiles on 1.19 and 1.20

Two settings are worth trying. On 1.19 and later, MIX_OS_DEPS_COMPILE_PARTITION_COUNT compiles dependencies in parallel OS processes, and the 1.19 notes say half your cores is enough. On 1.20, module_definition: :interpreted runs module bodies in the interpreter. The notes say it may cut compile time in large projects and leaves the .beam files unchanged.

  1. Compile dependencies in parallel. Expect more memory use, which matters on CI runners:
    MIX_OS_DEPS_COMPILE_PARTITION_COUNT=4 mix deps.compile
  2. Interpret module bodies, in def project of mix.exs:
    elixirc_options: [module_definition: :interpreted]
  3. If a build broke on 1.19: modules now load lazily. Code that spawns processes at compile time and calls other modules of the same project needs Kernel.ParallelCompiler.pmap/2 or Code.ensure_compiled!/1. An @on_load callback that calls project modules needs @compile {:autoload, true} in the module it calls.

The 1.19 announcement cites reports of more than 2x faster builds from lazy loading and up to 4x with parallel dependencies, both on large projects.

1.19 announcement 1.20 announcement

How to exit IEx

Press Ctrl+C twice. The IEx docs list two more ways: Ctrl+C opens the BREAK menu, where q and Enter quits, and Ctrl+\ quits as well. A remote shell keeps running after you disconnect.

  • Ctrl+C Ctrl+Cquit
  • Ctrl+C q Enterquit from the BREAK menu
  • Ctrl+\quit
Three ways out of IEx.

IEx forgets its history between sessions unless the VM is told to keep it:

iex --erl "-kernel shell_history enabled", or set ERL_AFLAGS="-kernel shell_history enabled" in your shell profile.

IEx docs: exiting the shell IEx docs: shell history

Questions people search for

What is the latest version of Elixir?

Elixir 1.20.4, released 28 August 2026. It is supported on Erlang/OTP 27 to 29.

How often does Elixir release a new version?

The policy is a new minor version every six months, with patch releases in between. The gaps since 1.17 were longer: 1.17 to 1.18: 190 days, 1.18 to 1.19: 301 days, 1.19 to 1.20: 230 days.

Is Elixir statically typed?

It is gradually typed since 1.20 (3 June 2026). The compiler infers and checks types without annotations and reports only violations that are guaranteed to fail at runtime. There is no syntax for type signatures yet.