Skip to content
CAI
Software that uses CAICheck a score

bitwalker/distillery

58.1

Adequate · 23 September 2026

6.7k

lines of production code

Elixir

primary language

5

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a release management tool for Elixir applications, responsible for building, packaging, and deploying software releases. It provides a comprehensive suite of commands for generating release artifacts, managing hot-upgrade instructions (appups), and controlling running nodes via CLI. The codebase has evolved from a legacy bundler to a more robust architecture that supports cross-platform execution on Unix and Windows, alongside extensive integration testing for all release lifecycle stages.

How it got here

2016 — Distillery 2.1 release and test refactoring

11 changes.

This period focused on upgrading the project to Distillery 2.1.1, which introduced new Mix tasks for cleaning releases and generating appup files. The codebase was restructured to remove legacy release task implementations and obsolete test fixtures, while adding new test fixtures to support the updated release and configuration systems.

2017–2019 — Release management and testing infrastructure

14 changes.

This period focused on refactoring the release management system by replacing shell scripts with a new CLI tooling and PowerShell implementations for Windows. Significant effort was also dedicated to expanding test coverage, introducing numerous test fixtures and support modules to verify release assembly, configuration handling, and cross-platform behavior.

Features

Added new Distillery tasks for cleaning releases and generating appup files

Users can now run \mix distillery.release.clean\ to remove release artifacts and \mix distillery.gen.appup\ to generate hot upgrade/downgrade appup files. The \init\ task now creates a \rel/plugins\ directory with a \.gitignore\ file, and the \release\ task provides improved success messaging and executable handling for Windows and Unix systems.

lib/distillery/tasks · high confidence

Added script to start Erlang's epmd daemon on AppVeyor

A new PowerShell script, start-epmd.ps1, has been added to the AppVeyor build environment. This script locates the Erlang installation directory, finds the epmd executable, and starts it as a daemon, ensuring the Erlang Port Mapper Daemon is running before subsequent build steps that depend on it.

bin/appveyor · high confidence

New release assembly, validation, and packaging components

This change introduces several new modules to the \lib/distillery/releases\ directory, including \Archiver\, \Assembler\, \Checks\, and \Appup\ handling. The \Archiver\ module is responsible for packaging the release into a tarball, while the \Assembler\ module handles the creation of the release directory, copying of applications, and generation of release-specific files. The \Checks\ module orchestrates static analysis checks at release time, such as validating the distribution cookie and ERTS configuration. Additionally, the \Appup\ module and its associated utilities and transforms are added to manage application upgrade instructions. These components collectively enable the building, validating, and archiving of releases.

lib/distillery/releases · high confidence

Replaces legacy shell-based boot scripts with new rc entry points and Windows PowerShell support

The legacy \boot.eex\ and \boot\_loader.eex\ shell scripts have been removed and replaced with a new \release\_rc\ entry point system. On Unix, this is handled by \release\_rc\_entry.eex\ and \release\_rc\_exec.eex\ (bash), while Windows now uses \release\_rc\_win\_exec.eex\ and \release\_rc\_win\_main.ps1.eex\ (PowerShell). The new architecture introduces an \executable\_header.eex\ template for creating self-extracting executables. Additionally, the \example\_config.eex\ has been updated to use the new \Distillery.Releases.Config\ DSL, and \vm.args.eex\ now defaults to \-smp auto\.

priv/templates · high confidence

Removals

Removed legacy release generation modules

The \Mix.Releases.Appup\, \Mix.Releases.Archiver\, \Mix.Releases.Assembler\, \Mix.Releases.Config\, \Mix.Releases.Overlays\, and \Mix.Releases.Utils\ modules have been removed from the codebase. This change eliminates the previous implementation of the release system, likely in favor of a new architecture or refactored components elsewhere in the project.

lib/mix · high confidence

Behavioural changes

Add helper scripts for testing and CI in the bin directory

New executable scripts are added to the bin directory to streamline testing and CI workflows. The alpine and ubuntu scripts provide Docker-based environments for running tests, while the travis script implements logic to skip CI runs when only documentation-related files change. The docs script sets up a Python environment for building documentation.

bin · high confidence

Distillery is deprecated in favor of Mix Releases

The README now includes a deprecation notice stating that Distillery's functionality has been integrated into Mix as part of Elixir 1.9, and the project is no longer actively maintained. The installation instructions have been updated to reflect the current version (2.1) and the \mix release\ command has been changed to \mix distillery.release\.

(repo-wide) · high confidence

Refactored boot and configuration scripts

The boot process has been restructured with new shell scripts in priv/libexec to handle configuration provisioning, environment setup, and ERTS invocation. This includes a new config.sh script that manages vm.args and sys.config paths, supports environment variable replacement, and runs pre/post configure hooks. The erl and erlexec helpers now correctly handle bundled versus host ERTS code paths and pass -config explicitly. Environment variables for hooks and mutable directories are standardized in env.sh, while helper functions for node naming and logging are consolidated in helpers.sh and logger.sh.

priv/libexec · high confidence

Removed legacy release task implementations

The \lib/bundler\ directory no longer contains the \Mix.Tasks.Release\, \Mix.Tasks.Release.Clean\, and \Mix.Tasks.Release.Init\ task files, nor the \Bundler.Utils.Logger\ module. These components have been removed from this location, indicating a structural change where release management logic has been migrated or refactored elsewhere.

lib/bundler · high confidence

Replace shell scripts with new CLI tooling for release management

The release management scripts in priv/libexec/commands have been rewritten in Bash to use the new release\_ctl and erlexec primitives, replacing the previous escript-based approach. This change introduces a consistent CLI interface for commands like attach, console, eval, and rpc, while also fixing several bugs related to signal handling, argument passing, and error messages. The scripts now properly handle foreground tasks, config reloading, and remote console connections using the updated tooling.

priv/libexec/commands · high confidence

Windows service management and release commands now use native PowerShell scripts

The Windows-specific commands for managing a release (start, stop, install, uninstall, restart, reboot, etc.) have been rewritten as new PowerShell (.ps1) scripts. This replaces the previous implementation, ensuring that arguments to erlsrv.exe are properly quoted and that the -data flag points to a mutable start\_erl.data file. Users on Windows will now interact with these lifecycle commands through these new scripts, which also handle pre/post start/stop hooks and service name formatting.

priv/libexec/commands/win · high confidence

Windows startup scripts replaced with PowerShell

The Windows startup scripts in priv/libexec/win have been replaced with new PowerShell implementations (config.ps1, erts.ps1, helpers.ps1, logger.ps1). These scripts handle release configuration, ERTS path resolution, node name generation, and logging. The changes ensure that configuration files (sys.config, vm.args) are properly generated and that environment variable replacements are performed during startup on Windows.

priv/libexec/win · high confidence

Test coverage

Add test fixture for CtrlApp application; Add test fixture for umbrella app; Add test support helpers and language extensions; Add tests for release.init mix task; Added comprehensive test coverage for release management features; Added test fixture for ordered application structure; Added test fixtures for appup generation and upgrade scenarios; Added test fixtures for file evaluation and configuration; Added test fixtures for the mock application; Added web app scaffolding and configuration files; Removed obsolete config and test helper files; Updated standard\_app test fixture with new GenServer implementations and Distillery release configuration.

Dependencies

Upgrade to Distillery 2.1.1 and update dependencies

The project has been renamed from 'Bundler' to 'Distillery' and upgraded to version 2.1.1, requiring Elixir 1.6 or higher. This update includes bumping several dependencies, including ex\_doc, excoveralls, and the Erlang-based libraries like hackney and certifi, alongside adding new dev/test dependencies such as dialyxir and eqc\_ex. Additionally, new test fixtures for standard, init, and umbrella applications have been added to support testing the release process.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 63 → 58 (-4.8)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 94 → 96 (+2.5)
  • Architecture 100 → 94 (-5.8)
  • Maturity 50 → 43 (-7.7)
  • Readiness 52 → 55 (+3.1)
  • Security 96 → 82 (-13.8)

Resolved (16)

  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • Duplicated block (14 lines × 2) (lib/distillery/releases/runtime/control.ex)
  • Duplicated block (14 lines × 2) (lib/distillery/tasks/gen.appup.ex)
  • Duplicated block (19 lines × 2) (lib/distillery/releases/runtime/control.ex)
  • Duplicated block (8 lines × 2) (lib/distillery/releases/assembler.ex)
  • High CVE: [GHSA redacted] (mix.lock)
  • Medium IaC: CKV_DOCKER_3 (Dockerfile.ubuntu)
  • Medium IaC: CKV_DOCKER_7 (Dockerfile.alpine)
  • No exposed public API
  • Test reliability not included
  • The 'Coming from other languages' section is stubbed out ('TODO'), leaving readers unsure whether Distillery's documentation compares with or contrasts with Erlang/OTP docs. (docs/introduction/comparison.md)
  • The Prerequisites list mentions publishing to Docker Hub but does not state how to do so, leaving this prerequisite unverifiable from the text alone. (docs/guides/deploying_to_digital_ocean.md)
  • TooManyMethods: Assembler (lib/distillery/releases/assembler.ex)
  • TooManyMethods: Control (lib/distillery/releases/runtime/control.ex)
  • dormant codebase — no living knowledge left to concentrate

New (21)

  • Coverage not measured — no coverage collector is wired up
  • Dependency source pinned to a moving git ref
  • Duplicated block (19–20 lines × 2) (lib/distillery/releases/runtime/control.ex)
  • Duplicated block (20 lines × 2) (lib/distillery/releases/runtime/control.ex)
  • Duplicated block (21 lines × 2) (lib/distillery/tasks/gen.appup.ex)
  • Duplicated block (8–11 lines × 2) (lib/distillery/releases/assembler.ex)
  • High CVE: [GHSA redacted] (mix.lock)
  • High IaC: WD-DOCKER-0013 (Dockerfile.ubuntu)
  • Medium IaC: WD-DOCKER-0003 (Dockerfile.ubuntu)
  • Medium IaC: WD-DOCKER-0005 (Dockerfile.alpine)
  • Medium IaC: WD-DOCKER-0005 (Dockerfile.ubuntu)
  • No SBOM
  • No artifact signing
  • No build provenance
  • No dependency advisory monitoring
  • Outdated: artificery
  • Outdated: dialyzex
  • Outdated: ex_doc
  • Outdated: ex_unit_clustered_case
  • Outdated: excoveralls
  • …and 1 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

bitwalker/distillery was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 23 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 3ab4d6146c7bc18139ed75d330e4fbb0fceb7591 — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-955b9cee9818.