Erlang/OTP 29.0

pyinstallwoes1 pts0 comments

Erlang/OTP 29.0 - Erlang/OTP

Erlang/OTP 29.0

May 13, 2026<br>· by Henrik Nord

OTP 29.0 #

Erlang/OTP 29 is a new major release with new features, improvements<br>as well as a few incompatibilities. Some of the new features are<br>highlighted below.

Many thanks to all contributors!

Highlights #

Added support for -unsafe attributes for marking<br>functions as unsafe to use. The compiler will by default now<br>generate warnings for calls to functions in Erlang/OTP known to be<br>always unsafe. Furthermore, xref can now be used to find calls to<br>unsafe functions and functions that lack documentation.

The SSH daemon now defaults to disabled for shell and exec services,<br>implementing the “secure by default” principle. This prevents<br>authenticated users from executing arbitrary Erlang code unless<br>explicitly configured.

The SFTP subsystem is no longer enabled by default when starting an<br>SSH daemon.

In SSL, the post quantum hybrid algorithm x25519mlkem768 is now the<br>most preferred key exchange group in the default configuration.

The module io_ansi allows the user to emit Virtual Terminal<br>Sequences (also known as ANSI sequences) to the terminal in order to<br>add colors/styling to text or to create fully fledged terminal<br>applications.

The new ct_doctest module allows the user to test<br>documentation examples in Erlang module docs and documentation files.

The ignore_xref attribute has been handled as a post-analysis<br>filter by build tools such as Rebar3. In this release, [xref]<br>itself does the filtering, ensuring that all tooling that calls<br>xref for any purpose can rely on these declarations to just work.

General #

In the default code path for the Erlang system, the current working<br>directory (.) is now in the last position instead of the first.

There is no longer a 32-bit Erlang/OTP build for Windows.

New language features #

Native records as described in<br>EEP-79 has been<br>implemented. A native record is a data structure similar to the<br>traditional tuple-based records, except that is a true data type.<br>Native records are considered experimental in Erlang/OTP 29 and<br>possibly also in Erlang/OTP 30.

The new is_integer/3 guard BIF makes it possible to easily verify<br>that a value is both an integer and within a certain range. For<br>example: is_integer(I, 0, 100)

Multi-valued comprehensions according to EEP 78<br>are now supported. For example, [-I, I || I will produce<br>[-1,1,-2,2,-3,3].

By enabling the compr_assign feature, it is now possible to bind variables<br>in a comprehensions. For example:<br>[H || E

Compiler and JIT improvements #

In the documentation for the [compile] module, there is now a section<br>with recommendations for implementors of languages running on<br>the BEAM.

The JIT now generates better code for matching or creating binaries with<br>multiple little-endian segments.

The compiler will generate more efficient code for map<br>comprehensions with constant values that don’t depend on the<br>generator. Example: #{K => 42 || K

Compiler warnings #

There are several new compiler warnings enabled by default. For each<br>such warning, there is an option to disable it.

There will now be a warning when using the catch operator, which<br>has been deprecated for a long time. It is recommended to instead<br>use try…catch but is also possible to disable the warning<br>by using the nowarn_deprecated_catch option.

There will now be a warning when exporting variables out of a<br>subexpression. For example: file:open(File, AllOpts = [write,<br>{encoding,utf8}]). This warning can be disabled using the<br>nowarn_export_var_subexpr compiler option.

The compiler will now warn for uses of the and and or<br>operators. This warning can be disabled using the<br>nowarn_obsolete_bool_op compiler option.

The compiler will now warn for matches such as {a,B} = {X,Y},<br>which is better written as {a=X,B=Y}. This warning can be disabled<br>using the nowarn_match_alias_pats option.

For a long time, there has been a warning for using the obsolete guard<br>tests (such as list(L) instead of is_list(L). In Erlang/OTP 30, the<br>old guards will be removed from the language.

STDLIB #

There are new functions for randomly permutating a list: rand:shuffle/1 and<br>rand:shuffle_s/2.

SSH #

The default key exchange algorithm is now mlkem768x25519-sha256, a hybrid<br>quantum-resistant algorithm combining ML-KEM-768 with X25519. This provides<br>protection against both classical and quantum computer attacks while<br>maintaining backward compatibility through automatic fallback to other<br>algorithms when peers don’t support it.

For a full list and more details about new features and potential incompatibilities see the README.

erlang compiler warning default using functions

Related Articles