OTP 23 has been released

OTP 23.0 Readme File

OTP 23.0 Source File (248)

OTP 23.0 Windows 32-bit Binary File (248)

OTP 23.0 Windows 64-bit Binary File (248)

OTP 23.0 HTML Documentation File (248)

OTP 23.0 Man Pages File (248)

OTP 23

Erlang/OTP 23 is a new major release with new features, improvements as well as a few incompatibilities.

Potential Incompatibilities

  • SSL:
    • Support for SSL 3.0 is completely removed.
    • TLS 1.3 is added to the list of default supported versions.
  • erl_interface: Removed the deprecated parts of erl_interface (erl_interface.h and essentially all C functions with prefix erl_).
  • The deprecated erlang:get_stacktrace/0 BIF now returns an empty list instead of a stacktrace. erlang:get_stacktrace/0 is scheduled for removal in OTP 24.

Improvements and new features

  • ssh:

    • OpenSSH 6.5 introduced a new file representation of keys called openssh-key-v1. This is now supported with the exception of handling encrypted keys.
    • Algorithm configuration could now be done in a .config file. This is useful for example to enable an algorithm that is disabled by default without need to change the code.
  • SSL:

    • Support for the middlebox compatibility mode makes the TLS 1.3 handshake look more like a TLS 1.2 handshake and increases the chance of successfully establishing TLS 1.3 connections through legacy middleboxes.
    • Add support for key exchange with Edward curves and PSS-RSA padding in signature verification
  • The possibility to run Erlang distribution without relying on EPMD has been extended. To achieve this a couple of new options to the inet distribution has been added.

    • -dist_listen false Setup the distribution channel, but do not listen for incoming connection.
    • -erl_epmd_port Port Configure a default port that the built-in EPMD client should return.
  • A first EXPERIMENTAL socket backend to
    gen_tcp and inet has been implemented. gen_udp and gen_sctp will follow.
    Putting {inet_backend, socket} as first option to listen() or connect() makes it easy to try this for existing code

  • A new module erpc in kernel which implements an enhanced subset of the operations provided by the rpc module. Enhanced in the sense that it makes it possible to distinguish between returned value, raised exceptions and other errors. erpc also has better performance and scalability than the original rpc implementation. This by utilizing the newly introduced spawn_request() BIF. Also the rpc module benefits from these improvements by utilizing erpc when possible.

  • Scalability and performance Improvements plus new functionality regarding distributed spawn operations.

  • In binary matching, the size of the segment to be matched is now allowed to be a guard expression (EEP-52)

  • When matching with maps the keys can now be guard expressions (EEP-52).

  • ssh: support for TCP/IP port forwarding, a.k.a tunnelling a.k.a as tcp-forward/direct-tcp is implemented. In the OpenSSH client, this corresponds to the options -L and -R.

  • Allow underscores in numeric literals to improve readability. Examples: 123_456_789, 16#1234_ABCD.

  • New functions in the shell for displaying documentation for Erlang modules, functions and types. The
    functions are:

    • h/1,2,3 -- Print the documentation for a Module:Function/Arity.
    • ht/1,2,3 -- Print the type documentation for a Module:Type/Arity.
      The embedded documentation is created as docchunks (EEP 48) when building the Erlang/OTP documentation.
  • kernel: The module pg with a new implementation of distributed named process groups is introduced. The old module pg2 is deprecated and scheduled for removal in OTP 24.

  • Our tool chain for building the Windows packages is upgraded with new C++ compiler, Java compiler, OpenSSL libraries and wxWidgets versions. We are now using WSL (the Linux Subsystem for Windows when building) which makes it easier to handle the build environment.

For more details see

Pre built versions for Windows with the new compiler can be fetched here:

Online documentation can be browsed here:
The Erlang/OTP source can also be found at GitHub on the official Erlang repository,

Compiling Erlang from source

You can build Erlang from source on your own, following the building and installation instructions. Or use the Kerl script. Kerl is a script that lets you easily build Erlang with a few commands. Follow the instructions to build.

Source Versions and Windows Binaries for Patches

Information about all released OTP versions since OTP 17.0 can be found at the OTP Versions Tree page. This information includes a link to the GitHub source tag, and a link to the README. As of OTP 23, Windows binaries can also be downloaded from here for all patches.

Pre-built Binary Packages

Most OS package managers provide pre-built binary packages. You can also download the latest stable releases from Erlang Solutions. Erlang Solutions provides pre-built binary packages for OS X, Windows, Ubuntu, Debian, Fedora, CentOS, Raspbian and other operating systems. 

  • For Homebrew on OS X: brew install erlang
  • For MacPorts on OS X: port install erlang
  • For Ubuntu and Debianapt-get install erlang
  • For Fedorayum install erlang
  • For FreeBSDpkg install erlang


Since OTP 18.0, Erlang/OTP is released under Apache License 2.0. The older releases prior to 18.0 were released under Erlang Public License (EPL), a derivative work of the Mozilla Public License (MPL).