{
  lib,
  pkgs,
  stdenv,
  fetchFromGitHub,
  libusb1,
  pkg-config,
}:

let
  dediprogVersion = "1.14.20.x";
  dediprogHash = "sha256-hQvBZIwaWEC41vj2flaekIUP9Fwtj/JPi3XwRxfUbD0=";
in
stdenv.mkDerivation (finalAttrs: {
  pname = "dediprog-sf100-linux";
  version = finalAttrs.dediprogVersion;

  inherit dediprogVersion dediprogHash;

  src = fetchFromGitHub {
    owner = "DediProgSW";
    repo = "SF100Linux";
    rev = "V${finalAttrs.dediprogVersion}";
    hash = finalAttrs.dediprogHash;
  };

  buildInputs = [ libusb1 ];
  nativeBuildInputs = [ pkg-config ];

  udevRules = pkgs.writeText "dediprog.rules" ''
    ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="dada", MODE="660", GROUP="plugdev"
  '';

  installPhase = ''
    runHook preInstall

    install -Dm0755 ./dpcmd -t $out/bin
    install -Dm0644 ./ChipInfoDb.dedicfg -t $out/share/DediProg
    install -Dm0644 ${finalAttrs.udevRules} -D $out/lib/udev/rules.d/60-dediprog.rules

    runHook postInstall
  '';

  meta = {
    homepage = "https://github.com/DediProgSW/SF100Linux";
    description = "Linux software for DediProg SF100/SF600 programmers";
    license = lib.licenses.gpl2;
    platforms = lib.platforms.linux;
    maintainers = with lib.maintainers; [ thillux ];
  };
})
