{ lib, stdenv, nodejs, pnpm, fetchFromGitHub, makeWrapper, vips, pkg-config, python3 }:

stdenv.mkDerivation (finalAttrs: {
  pname = "bsky-pds";
  version = "0.4.59";

  src = fetchFromGitHub {
    owner = "bluesky-social";
    repo = "pds";
    rev = "v${finalAttrs.version}";
    hash = "sha256-E4SoaLvDaHqOtZ2yExjyK6Z7Bkah6BsCFJd7cvxSwM4=";
  };

  buildInputs = [
    vips
  ];
  nativeBuildInputs = [
    python3
    pkg-config
    makeWrapper
    nodejs
    pnpm.configHook
    nodejs.pkgs.node-gyp-build
  ];
  sourceRoot = "${finalAttrs.src.name}/service";

  pnpmDeps = pnpm.fetchDeps {
    inherit (finalAttrs) pname version src sourceRoot;
    hash = "sha256-puUVL1v372Tko8IlFM+uspuUEJgQuV49+jITTvO4OH0=";
  };

  env.SHARP_FORCE_GLOBAL_LIBVIPS = 1;
  env.npm_config_nodedir = nodejs;

  postBuild = ''
    pnpm rebuild --reporter=append-only
  '';

  postInstall = ''
    mkdir -p $out/bin $out/lib $out/lib

    cp -R . $out/lib/bsky-pds

    makeWrapper ${nodejs}/bin/node $out/bin/bsky-pds \
      --set-default PDS_PORT 3000 \
      --set-default NODE_ENV production \
      --add-flags --enable-source-maps \
      --add-flags $out/lib/bsky-pds/index.js
      #--prefix NODE_PATH ':' $out/lib/node_modules \
  '';

  meta = {
    description = "Bluesky Personal Data Server";
    mainProgram = "bsky-pds";
    homepage = "https://github.com/bluesky-social/pds";
    license = with lib.licenses; [
      mit
      asl20
    ];
    maintainers = with lib.maintainers; [
      lukegb
    ];
  };
})