{ pkgs, self, flavour ? "cooperation" }:
let
  beamPackages = with pkgs; beam.packagesWith beam.interpreters.erlang;
in
beamPackages.mixRelease rec {
  pname = "bonfire";
  version = "1.0.0";
  mixEnv = "dev";

  src = self;

  # TODO make these configurable
  BONFIRE_FLAVOUR = "flavours/${flavour}";
  FLAVOUR = flavour;

  mixFodDeps = beamPackages.fetchMixDeps {
    pname = "mix-deps-${pname}";
    inherit src mixEnv version;
    LANG = "en_US.UTF-8";
    inherit BONFIRE_FLAVOUR FLAVOUR;
    # override needed here since bonfire dependencies rely on git
    installPhase = ''
      runHook preInstall
      mix deps.get --only ${mixEnv}
      cp -r --no-preserve=mode,ownership,timestamps $TEMPDIR/deps $out
      runHook postInstall
    '';
    # TODO add sha256
    # since I didn't know exactly what dependencies where being pulled
    # I went for the quick hack of not checking for dependency integrity
    # This has the downside of triggering a rebuild on every deployment
    sha256 = null;
  };

  frontendAssets = with pkgs; stdenvNoCC.mkDerivation {
    pname = "frontend-assets-${pname}";
    nativeBuildInputs = [ nodejs cacert git elixir nodePackages.pnpm beamPackages.hex ];

    inherit version src;

    configurePhase = ''
      export HOME=$(mktemp -d)
      cp -r ${mixFodDeps} ./deps
      chmod +w -R deps
      make js.deps.get
    '';

    buildPhase = ''
      mix assets.release
    '';

    installPhase = ''
      cp -r priv/static $out
    '';

    outputHashAlgo = "sha256";
    outputHashMode = "recursive";
    # TODO add sha256
    # since I didn't know exactly what dependencies where being pulled
    # I went for the quick hack of not checking for dependency integrity
    # This has the downside of triggering a rebuild on every deployment
    outputHash = null;

    impureEnvVars = lib.fetchers.proxyImpureEnvVars;
  };

  nativeBuildInputs = with pkgs; [ rustc cargo gcc ]; # for NIFs

  postBuild = ''
    mkdir -p priv/static
    cp -r ${frontendAssets} priv/static
    # digest needs to write files
    chmod -R u+w priv/static
    mix do deps.loadpaths --no-deps-check, phx.digest
  '';
}
