{
  config,
  lib,
  pkgs,
  ...
}: {
  options = {
    ezServices = with lib;
      mkOption {
        type = with types; attrsOf str;
        default = {};
      };

    ezOneShots = with lib;
      mkOption {
        type = with types; attrsOf str;
        default = {};
      };
    ezConf = with lib;
      mkOption {
        type = with types; attrsOf path;
        default = {};
      };

    # for specifying an additional systemd target
    extraTarget = with lib;
      mkOption {
        type = with types; listOf str;
        default = [];
      };
  };

  config = rec {
    systemd.user.services = with pkgs;
      builtins.mapAttrs (name: cmd: {
        Unit = {
          Description = "${name}";
          Requires = ["graphical-session.target"] ++ config.extraTarget;
          After = ["graphical-session.target"] ++ config.extraTarget;
        };
        Service = {
          ExecStart = cmd;
        };
        Install = {
          WantedBy = ["graphical-session.target"] ++ config.extraTarget;
        };
      })
      config.ezServices
      // builtins.mapAttrs (name: cmd: {
        Unit = {
          Description = "${name}";
          After = ["graphical-session.target"] ++ config.extraTarget;
        };
        Service = {
          ExecStart = cmd;
          Type = "oneshot";
        };
        Install = {
          WantedBy = ["graphical-session.target"] ++ config.extraTarget;
        };
      })
      config.ezOneShots;

    xdg.configFile =
      builtins.mapAttrs (name: value: {
        enable = true;
        source = value;
      })
      config.ezConf;
  };
}
