Elixir

Detected from mix.exs. Builds a Mix release. Erlang and Elixir stay out of the run image.

See Buildpacksfor how detection and version policy work.

Detects

mix.exs in the base directory.

Versions

Default is Elixir 1.20 on Erlang/OTP 28. Published Elixir lines as of September 2026: 1.15-1.20. Published OTP lines: 26-29. You get the latest patch of the requested line.

Pin Elixir with, in this order:

  • An elixir entry in .tool-versions (asdf style 1.18.2-otp-27 uses the part before the hyphen)
  • .elixir-version

The elixir: requirement in mix.exs is a range, not a pin. Nodion does not use it. An old ~> 1.17 still runs on a newer default.

Pin Erlang with an erlang entry in .tool-versions.

Install and build

mix local.hex, mix local.rebar, mix deps.get --only prod. If mix assets.deploy exists, that runs next. Then mix release --overwrite.

The app must be set up for Mix releases. The release bundles ERTS, so the run image is the release only.

Launch sets PHX_SERVER=true so a Phoenix endpoint starts. Harmless on non-Phoenix releases.

Start command

<release>/bin/<app> start, preferring the OTP app name from mix.exs. Override with a Procfile. Listen on PORT (Phoenix reads PORT when the release is generated that way).