{
  lib,
  fetchurl,
  installShellFiles,
  versionCheckHook,
  stdenvNoCC,
  version-channel ? "stable",
}:
let
  inherit (stdenvNoCC.hostPlatform) system;
  sources =
    if "${version-channel}" == "main" then
      lib.importJSON ./sources-main.json
    else
      lib.importJSON ./sources-stable.json;
  arch = sources.archMap.${system};

in
stdenvNoCC.mkDerivation {
  pname = if "${version-channel}" == "main" then "upbound-main" else "upbound";
  version = sources.version;
  srcs = [
    (fetchurl {
      url = sources.fetchurlAttrSet.docker-credential-up.${system}.url;
      sha256 = sources.fetchurlAttrSet.docker-credential-up.${system}.hash;
    })

    (fetchurl {
      url = sources.fetchurlAttrSet.up.${system}.url;
      sha256 = sources.fetchurlAttrSet.up.${system}.hash;
    })
  ];

  sourceRoot = ".";

  nativeBuildInputs = [ installShellFiles ];

  installPhase = ''
    runHook preInstall

    mkdir -p $out/bin

    cp ./${arch}/up $out/bin/up
    chmod +x $out/bin/up

    cp ./${arch}/docker-credential-up $out/bin/docker-credential-up
    chmod +x $out/bin/docker-credential-up

    runHook postInstall
  '';

  postInstall = ''
    installShellCompletion --bash --name up <(echo complete -C up up)
  '';

  # FIXME: error when running `env -i up`:
  # "up: error: $HOME is not defined"
  doInstallCheck = false;
  versionCheckProgram = "${placeholder "out"}/bin/up";
  versionCheckProgramArg = "version";

  nativeInstallCheckInputs = [
    versionCheckHook
  ];

  doCheck = false;

  passthru.updateScript = [
    ./update
    "${version-channel}"
  ];

  meta = {
    description = "CLI for interacting with Upbound Cloud, Upbound Enterprise, and Universal Crossplane (UXP)";
    changelog = "https://docs.upbound.io/reference/release-notes/up-cli";
    homepage = "https://upbound.io";
    license = lib.licenses.unfree;
    maintainers = with lib.maintainers; [
      lucperkins
      jljox
    ];
    mainProgram = "up";
    platforms = sources.platformList;
  };
}
