{
  pkgs,
  ...
}:
let
  startupScript = pkgs.pkgs.writeShellScriptBin "hyprland-start" ''
    ${pkgs.waybar}/bin/waybar &
    ${pkgs.swww}/bin/swww init &

    sleep 1

    ${pkgs.swww}/bin/swww img /home/mrflos/Nextcloud/Images/Wallpapers/chihiro014.jpg &
  '';
in
{
  imports = [ <home-manager/nixos> ];

  home-manager.users.mrflos =
    { pkgs, ... }:
    {
      home.stateVersion = "23.05";
      home.packages = with pkgs; [
        swww
        grimblast
        swaylock
        waybar
        yarn
      ];
      programs = {
        wayland.windowManager.hyprland.enable = true;
        wayland.windowManager.hyprland.settings = {
          exec-once = ''${startupScript}/bin/hyprland-start'';
          "$mod" = "SUPER";

          # assign apps
          "$term" = "kitty";
          "$editor" = "nvim";
          "$file" = "dolphin";
          "$browser" = "zen";

          bind =
            [
              ", Print, exec, grimblast copy area"
              # Window/Session actions
              "$mod, Q, killactive"
              "ALT, F4, killactive"
              "$mod, delete, exit" # kill hyperland session
              "$mod, W, togglefloating" # toggle the window on focus to float
              "$mod, G, togglegroup" # toggle the window on focus to float
              "ALT, return, fullscreen" # toggle the window on focus to fullscreen
              "$mod, L, exec, swaylock" # lock screen
              #  "$mod, backspace, exec, wlogout-launcher-hyprland 1" # logout menu
              "$CONTROL, ESCAPE, exec, systemctl-toggle --user waybar.service"

              # Application shortcuts
              "$mod, T, exec, $term" # open terminal
              "$mod, E, exec, $file" # open file manager
              "$mod, C, exec, $editor" # open vscode
              "$mod, F, exec, $browser" # open browser

              # Move focus with mainMod + arrow keys
              "$mod, left, movefocus, l"
              "$mod, right, movefocus, r"
              "$mod, up, movefocus, u"
              "$mod, down, movefocus, d"
              "ALT, Tab, movefocus, d"

              # Switch workspaces relative to the active workspace with mainMod + CTRL + [←→]
              "$mod CTRL, right, workspace, r+1"
              "$mod CTRL, left, workspace, r-1"

              # move to the first empty workspace instantly with mainMod + CTRL + [↓]
              "$mod CTRL, down, workspace, empty"

              # Move active window to a relative workspace with mainMod + CTRL + ALT + [←→]
              "$mod CTRL ALT, right, movetoworkspace, r+1"
              "$mod CTRL ALT, left, movetoworkspace, r-1"

              # Move active window around current workspace with mainMod + SHIFT + CTRL [←→↑↓]
              "$mod SHIFT $CONTROL, left, movewindow, l"
              "$mod SHIFT $CONTROL, right, movewindow, r"
              "$mod SHIFT $CONTROL, up, movewindow, u"
              "$mod SHIFT $CONTROL, down, movewindow, d"

              # Scroll through existing workspaces with mainMod + scroll
              "$mod, mouse_down, workspace, e+1"
              "$mod, mouse_up, workspace, e-1"

              # Special workspaces (scratchpad)
              "$mod ALT, S, movetoworkspacesilent, special"
              "$mod, S, togglespecialworkspace,"

              # Toggle Layout
              "$mod, J, togglesplit," # dwindle
            ]
            ++ (
              # workspaces
              # binds $mod + [shift +] {1..10} to [move to] workspace {1..10}
              builtins.concatLists (
                builtins.genList (
                  x:
                  let
                    ws =
                      let
                        c = (x + 1) / 10;
                      in
                      builtins.toString (x + 1 - (c * 10));
                  in
                  [
                    "$mod, ${ws}, workspace, ${toString (x + 1)}"
                    "$mod SHIFT, ${ws}, movetoworkspace, ${toString (x + 1)}"
                    "$mod ALT, ${ws}, movetoworkspacesilent, ${toString (x + 1)}" # Move window silently to workspace Super + Alt + [0-9]
                  ]
                ) 10
              )
            );

          # Move/Resize windows with mainMod + LMB/RMB and dragging
          bindm = [
            "$mod, mouse:272, movewindow"
            "$mod, mouse:273, resizewindow"
          ];

          # Resize windows
          binde = [
            "$mod SHIFT, right, resizeactive, 30 0"
            "$mod SHIFT, left, resizeactive, -30 0"
            "$mod SHIFT, up, resizeactive, 0 -30"
            "$mod SHIFT, down, resizeactive, 0 30"
          ];
        };

      };
    };
}