{
  lib,
  symlinkJoin,
  rofi,
  gnused,
  pass,
  writeTextFile,
  writeShellScriptBin,
  xdotool,
}:

let

  name = "otpmenu";

  desktopFile = writeTextFile {
    name = "${name}.desktop";
    destination = "/share/applications/${name}.desktop";
    text = ''
      [Desktop Entry]
      Categories=Application;Utility;
      Comment=Enter MFA number with password otp plugins otp
      Encoding=UTF-8
      Exec=${bin}/bin/${name}
      Icon=gnome-lockscreen
      Name=${name}
      Terminal=false
      Type=Application
    '';
  };

  bin =
    writeShellScriptBin name # sh
      ''
        set -efu

        x=$(
          ${pass.withExtensions (ext: [ ext.pass-otp ])}/bin/pass git ls-files '*/otp.gpg' \
            | ${gnused}/bin/sed 's:/otp\.gpg$::' \
            | ${rofi}/bin/rofi -dmenu -f -p OTP
        )

        otp=$(${pass.withExtensions (ext: [ ext.pass-otp ])}/bin/pass otp code "$x/otp")

        printf %s "$otp" | ${xdotool}/bin/xdotool type -f -
      '';

in
symlinkJoin rec {
  version = "1.0.0";
  name = "otpMenu-${version}";
  paths = [
    bin
    desktopFile
  ];
  meta = with lib; {
    description = "similar to passmenu shows and prints otp";
    homepage = "https://your.mama";
    license = licenses.gpl3;
    platforms = platforms.linux;
    maintainers = with maintainers; [ mrVanDalo ];
  };
}