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
29stable releases since Jan 2024
18days between stable releases, median
4in Aug 2026, the busiest month
132days, the longest wait (9 Jan 2026 to 21 May 2026)
1.15
1.15.8, 20 May 2024
1
1.16
1.16.1, 31 Jan 2024
1.16.2, 10 Mar 2024
1.16.3, 20 May 2024
3
1.17
1.17.0-rc.0, 24 May 2024
1.17.0-rc.1, 3 Jun 2024
1.17.0, 12 Jun 2024
1.17.1, 18 Jun 2024
1.17.2, 6 Jul 2024
1.17.3, 18 Sep 2024
4
1.18
1.18.0-rc.0, 10 Dec 2024
1.18.0, 19 Dec 2024
1.18.1, 24 Dec 2024
1.18.2, 22 Jan 2025
1.18.3, 6 Mar 2025
1.18.4, 21 May 2025
1.18.5, 28 Aug 2026
6
1.19
1.19.0-rc.0, 9 Jun 2025
1.19.0-rc.1, 5 Oct 2025
1.19.0-rc.2, 7 Oct 2025
1.19.0, 16 Oct 2025
1.19.1, 20 Oct 2025
1.19.2, 2 Nov 2025
1.19.3, 13 Nov 2025
1.19.4, 27 Nov 2025
1.19.5, 9 Jan 2026
1.19.6, 28 Aug 2026
7
1.20
1.20.0-rc.0, 9 Jan 2026
1.20.0-rc.1, 13 Jan 2026
1.20.0-rc.2, 4 Mar 2026
1.20.0-rc.3, 9 Mar 2026
1.20.0-rc.4, 31 Mar 2026
1.20.0-rc.5, 13 May 2026
1.20.0-rc.6, 21 May 2026
1.20.0, 3 Jun 2026
1.20.1, 9 Jun 2026
1.20.2, 23 Jun 2026
1.20.3, 4 Aug 2026
1.20.4, 28 Aug 2026
5
202420252026
CVE-2026-75758
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.
Lexical, ElixirLS and Next LS were merged into one project called Expert. Its changelog lists 0.1.0 on 27 March 2026, about 19 months after the announcement, and 0.2.0 on 20 October 2026.
The type work went into three releases: 1.18 in December 2024, 1.19 in October 2025 and 1.20 in June 2026. 1.20 infers types for every language construct, guards included, still without user-written signatures.
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
Elixir
24
25
26
27
28
29
1.20
no
no
no
supported
supported
supported
1.19
no
no
supported
supported
supported
no
1.18
no
supported
supported
supported
no
no
1.17
no
supported
supported
supported
no
no
1.16
supported
supported
supported
no
no
no
1.15
supported
supported
supported
no
no
no
Lit cells: OTP majors each Elixir minor supports. Columns are OTP releases.
Install script for macOS, Ubuntu or Windows with bash. It installs Erlang and Elixir side by side, and you put both on your PATH:
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:
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.20bug fixes and securitylast release 1.20.4, 28 Aug 2026fixed
1.19security onlylast release 1.19.6, 28 Aug 2026fixed
1.18security onlylast release 1.18.5, 28 Aug 2026fixed
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.
Check which Elixir and Erlang/OTP you run:
elixir --version
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.
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.
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.17First release with the type system in the compiler4 hard deprecations
1.18Infers patterns and return types, checks function calls7 hard deprecations
1.19Checks protocol dispatch and anonymous functions4 hard deprecations
1.20Infers every construct, guards included, reports verified bugs5 hard deprecations
Type checker milestones and the number of hard deprecations each minor added.
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
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
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.
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.
Compile dependencies in parallel. Expect more memory use, which matters on CI runners:
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.
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+CCtrl+Cquit
Ctrl+CqEnterquit 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.
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.