{
  stdenv,
  runtimeShell,
  fetchFromGitHub,
  jdk,
  jre,
  gradle,
  perl,
  writeText,
  callPackage,
}: let
  meta = builtins.fromJSON (builtins.readFile ../meta.json);

  deps =
    callPackage ./deps.nix {inherit stdenv fetchFromGitHub jdk gradle perl;};

  gradleInit = writeText "init.gradle" ''
    logger.lifecycle 'Replacing Maven repositories with ${deps}...'
    gradle.projectsLoaded {
      rootProject.allprojects {
        buildscript {
          repositories {
            clear()
            maven { url '${deps}' }
          }
        }
        repositories {
          clear()
          maven { url '${deps}' }
        }
      }
    }
    settingsEvaluated { settings ->
      settings.pluginManagement {
        repositories {
          maven { url '${deps}' }
        }
      }
    }
  '';
in
  stdenv.mkDerivation rec {
    pname = "piped-backend";
    version = "latest-${meta.backend.rev}";

    src = fetchFromGitHub {
      owner = "TeamPiped";
      repo = "Piped-Backend";
      rev = "${meta.backend.rev}";
      sha256 = "${meta.backend.sha256}";
    };

    nativeBuildInputs = [gradle jdk];

    buildPhase = ''
      runHook preBuild

      export GRADLE_USER_HOME=$(mktemp -d)

      gradle --offline --init-script ${gradleInit} shadowJar

      runHook postBuild
    '';

    installPhase = ''
      runHook preInstall

      ls -R build

      mkdir -p "$out/share/piped-backend"
      cp build/libs/piped-1.0-all.jar "$out/share/piped-backend"

      mkdir -p "$out/bin"
      cat  <<EOF >$out/bin/piped-backend
      #!${runtimeShell}
      export JAVA_HOME=${jre}
      exec ${jre}/bin/java -jar "$out/share/piped-backend/piped-1.0-all.jar" "\$@"
      EOF
      chmod a+x "$out/bin/piped-backend"

      runHook postInstall
    '';
  }