{
  lib,
  pkgs,
  config,
  ...
}:
with lib; let
  scripts = config.programs.scripts;

  hotkeyType = types.submodule ({...}: {
    options = {
      key = mkOption {
        description = "the key";
      };
      modifier = mkOption {
        description = "modifiers for the key";
        default = "SUPER";
        example = "SUPER_SHIFT";
      };
      args = mkOption {
        description = "args for the script when use this key";
        default = "";
      };
    };
  });

  scriptType = types.submodule ({...}: {
    options = {
      name = mkOption {
        description = "name of the executable";
      };
      text = mkOption {
        description = "the text of the script";
      };
      hotkeys = mkOption {
        type = types.listOf hotkeyType;
        description = "keys that run this script";
        default = [];
      };
      install = mkOption {
        type = types.bool;
        default = true;
      };
    };
  });

  scriptToPackage = script:
    pkgs.writeShellScriptBin script.name script.text;

  scriptExec = {
    script,
    hotkey,
  }: "${scriptToPackage script}/bin/${script.name} ${hotkey.args}";

  installScripts = scripts: (map scriptToPackage (filter (s: s.install) scripts));

  bindScript = script: (
    map
    (
      hotkey: "${hotkey.modifier}, ${hotkey.key}, exec, ${scriptExec {inherit script hotkey;}}"
    )
    script.hotkeys
  );
in {
  options.programs = {
    scripts = mkOption {
      type = types.listOf scriptType;
      default = [];
    };
  };

  config = {
    home.packages = installScripts scripts;
    wayland.windowManager.hyprland.settings.bind = builtins.concatMap bindScript scripts;
  };
}
