self: {
  config,
  pkgs,
  ...
}: {
  config = let
    cfg = config.roles.desktop;
    agsCfg = hmCfg.programs.ags;
    hmCfg = config.home-manager.users.${cfg.user};

    hyprland = hmCfg.wayland.windowManager.hyprland.finalPackage;

    agsConfig = let
      homeFiles = config.home-manager.users.${cfg.user}.home.file;

      nodeModules = homeFiles."${agsCfg.configDir}/node_modules".source;
      tsconfig = homeFiles."${agsCfg.configDir}/tsconfig.json".source;
      varsTs = homeFiles."${agsCfg.configDir}/widgets/lockscreen/vars.ts".source;
    in
      pkgs.runCommandLocal "agsConfig" {} ''
        cp -ar ${tsconfig} ./tsconfig.json
        cp -ar ${../../ags/config}/* ./.
        chmod +w -R ./.
        cp -ar ${varsTs} ./widgets/lockscreen/vars.ts
        cp -ar ${nodeModules} ./node_modules
        ${agsCfg.package}/bin/ags bundle ./app.ts $out
      '';
  in {
    assertions = [
      {
        assertion = cfg.ags.enable;
        message = ''
          The Display Manager requires AGS to be enabled.
        '';
      }
    ];

    # Add home folder for home-manager to work
    users.users.greeter = {
      home = "/var/lib/greeter";
      createHome = true;
    };

    home-manager.users.greeter = {
      home.packages = [
        hyprland

        (pkgs.writeShellApplication {
          name = "agsGreeter";

          runtimeInputs = [
            agsCfg.package
            hyprland
          ];

          text = ''
            exec ags run ${agsConfig} -a greeter
          '';
        })
      ];
    };
  };

  # For accurate stack trace
  _file = ./default.nix;
}