Erlang/OTP 23.0 has been released

Erlang/OTP 23.0 is released, see
For a deeper dive into some of the highlights you can read our blog

Erlang/OTP team at Ericsson


For me the biggest thing is socket-based gen_tcp implementation as this makes step towards socket activation in Erlang. This will make possible to listen on restricted sockets without giving more permissions to the VM and will allow for lazy starting Erlang applications using launchd and systemd.


Are there not enough unrestricted sockets available?

For some reason on Ubuntu it’s telling me that I need the libwxgtk3.0-dev library installed, but I can’t actually find or install it from anywhere. Any ideas?

Sometimes you want to implement something that has an assigned port, like an SSH server, an HTTP server, FTP, you name it.

If we can do this without having to run the VM as superuser, or without having to rely on a third party program that acts as a “proxy”, we are a huge step forward.

Its not that there are not enough unrestricted ports, its just that the restricted ports have a purpose which we want to fullfil.


Try the following:

# sudo apt -y install libwxgtk3.0-dev

# Ubuntu 20.04 LTS does not have this package for Erlang
# Need to install from source:

sudo apt-add-repository 'deb eoan universe'
sudo apt-key adv --keyserver --recv-keys 6856E1DB1AC82609
sudo apt update -y
sudo apt -y install libwxbase3.1-0-unofficial3 \
                 libwxbase3.1unofficial3-dev \
                 libwxgtk3.1-0-unofficial3 \
                 libwxgtk3.1unofficial3-dev \
                 wx3.1-headers \

Anyone having issues using SSHKit on OTP-23?
(From windows connecting to SUN)

Is there new configuration needed?

This is important too:

CPU quotas are now taken into account when deciding the default number of online schedulers.

This should mean that people using the BEAM in containerised environments (like Kubernetes) get much better performance (with less throttling) out of the box, without having to learn about/tweak the various flags.


This works:

def ssh_test do


      port: @server_ssh_port,

      user: '#{@server_username}',

      password: '#{@server_password}',

      modify_algorithms: [prepend: [kex: [:"diffie-hellman-group1-sha1"]]]



Just had to restore the algo the server was expecting

Why do you think that the way you can listen to restricted sockets (ports as I understand it) will change because of the socket module and the possibility to run gen_tcp with the socket module as backend?

Because you will be able to use socket activation and pass already opened file descriptor to it. So you supervisor (systemd or launchd) will open privileged port for you and then you will just pass it to your web server. The same goes for UNIX socket where you will be able to create sockets in paths that you cannot write to. Currently we need to do some workarounds to make it work with ports.

Yes but that method is practiced already with the inet driver since it is possible to open sockets/Fds which are already bound. You can open and bind a file descriptor with one program and then passing it to the Erlang VM on the command line. See the OTP source tree $OTP_ROOT/etc/unix/setuid_socket_wrap.c

1 Like

Ok, I need to test this out, because last time I tried it was problematic and I have created ERL-1138 to resolve that.

think it is easier to use libwxgtk3.0-gtk3-dev, think they changed the name a bit