ReleaseKit

ReleaseKit builds deployment-neutral artifacts from Mix OTP releases.

It produces two files:

Deployment tools such as HostKit can consume the manifest, but ReleaseKit does not know about systemd, users, Caddy, hosts, or filesystem layouts.

Installation

def deps do
[
{:release_kit, "~> 0.1", only: [:dev], runtime: false}
]
end

Usage

Build a production release artifact:

MIX_ENV=prod mix release_kit.artifact --out-dir _build/prod/artifacts

For a web service, include health-check metadata:

MIX_ENV=prod mix release_kit.artifact \
--out-dir _build/prod/artifacts \
--port 4000 \
--health-path /

The output names are stable for deployment tooling:

_build/prod/artifacts/my_app-20260620-abcdef0.tar.gz
_build/prod/artifacts/my_app.etf

The manifest is an ETF-encoded map:

%{
tool: "release_kit",
format: :beam_release_artifact,
format_version: 1,
app: "my_app",
release: "my_app",
version: "20260620-abcdef0",
mix_env: "prod",
tarball: "/absolute/path/to/my_app-20260620-abcdef0.tar.gz",
runtime: %{command: ["bin/my_app", "start"]},
env: %{clear: %{}, secret: []},
health_check: %{path: "/", port: 4000, url: "http://127.0.0.1:4000/"}
}

Application aliases

Projects can add their own shorter alias or prebuild steps:

defp aliases do
[
"release.artifact": ["assets.deploy", "release_kit.artifact"]
]
end

ReleaseKit deliberately does not run asset builders or delete generated files on its own. Keep those choices in the consuming application.