{ theme, ... }: {
  home.file = {
    ".config/hypr/hyprland.conf" = {
      enable = true;
      text = ''
      layerrule = blur, waybar

      # Laptop specific:
      monitor=,highrr,auto,1.25

      # https://wiki.hyprland.org/Configuring/Variables/
      env = GDK_SCALE,1
      env = XCURSOR_SIZE,22

      # unscale XWayland
      xwayland {
        force_zero_scaling = true
      }

      # nVidia Speficic Settings:
      # https://wiki.hyprland.org/Nvidia/
      # env = LIBVA_DRIVER_NAME,nvidia
      # env = XDG_SESSION_TYPE,wayland
      # env = GBM_BACKEND,nvidia-drm
      # env = __GLX_VENDOR_LIBRARY_NAME,nvidia
      env = WLR_NO_HARDWARE_CURSORS,1

      general {
          gaps_in = 10
          gaps_out = 20
          border_size = 3
          # First six are color, last 2 are opacity
          col.active_border = rgba(d5c4a1bb)  # Gruvbox fg2, opacity bb
          col.inactive_border = rgba(504945dd) # Gruvbox bg2, opacity aa
          resize_on_border = true
          extend_border_grab_area = 15
          layout = dwindle
      }
      input {
          kb_layout = us
          follow_mouse = 1
          touchpad {
              natural_scroll = true
              disable_while_typing = true
              tap-to-click = true
              clickfinger_behavior = true
              drag_lock = true
          }
          sensitivity = 0
      }
      gestures {
        # https://wiki.hyprland.org/0.24.1/Configuring/Keywords/#gestures
        workspace_swipe = true
        workspace_swipe_fingers = 3
        workspace_swipe_numbered = false
      }
      misc {
        disable_hyprland_logo = true
        mouse_move_enables_dpms = true
        key_press_enables_dpms = true
      }
      decoration {
          rounding = 5
          active_opacity = 0.9
          inactive_opacity = 0.7
          fullscreen_opacity = 0.9
          drop_shadow = true
          shadow_range = 4
          shadow_render_power = 3
          col.shadow = rgba(1a1a1aee)
          blur {
            size = 8
            passes = 3
            ignore_opacity = true
          }

      }
      animations {
          # https://wiki.hyprland.org/Configuring/Animations/ 
          enabled = true
          bezier = myBezier, 0.05, 0.9, 0.1, 1.05
          animation = windows, 1, 7, myBezier
          animation = windowsOut, 1, 7, default, popin 80%
          animation = border, 1, 10, default
          animation = borderangle, 1, 8, default
          animation = fade, 1, 7, default
          animation = workspaces, 1, 6, default
      }
      dwindle {
          # See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
          pseudotile = true # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
          preserve_split = true # you probably want this
          no_gaps_when_only = 1

      }
      master {
          # See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
          new_is_master = true
      }

      # See https://wiki.hyprland.org/Configuring/Keywords/ for more
      $mainMod = SUPER

      # Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
      bind = $mainMod, Q, exec, kitty
      bind = $mainMod, C, killactive,
      bind = $mainMod, M, exit,
      bind = $mainMod, V, togglefloating,
      bind = $mainMod, R, exec, wofi --show drun
      bind = $mainMod, P, pseudo, # dwindle
      bind = $mainMod, J, togglesplit, # dwindle

      # Move focus with mainMod + arrow keys
      # bind = $mainMod, left, movefocus, l
      # bind = $mainMod, right, movefocus, r
      # bind = $mainMod, up, movefocus, u
      # bind = $mainMod, down, movefocus, d

      # Switch workspaces with mainMod + [0-9]
      bind = $mainMod, 1, workspace, 1
      bind = $mainMod, 2, workspace, 2
      bind = $mainMod, 3, workspace, 3
      bind = $mainMod, 4, workspace, 4
      bind = $mainMod, 5, workspace, 5
      bind = $mainMod, 6, workspace, 6
      bind = $mainMod, 7, workspace, 7
      bind = $mainMod, 8, workspace, 8
      bind = $mainMod, 9, workspace, 9
      bind = $mainMod, 0, workspace, 10

      # Move active window to a workspace with mainMod + SHIFT + [0-9]
      bind = $mainMod SHIFT, 1, movetoworkspace, 1
      bind = $mainMod SHIFT, 2, movetoworkspace, 2
      bind = $mainMod SHIFT, 3, movetoworkspace, 3
      bind = $mainMod SHIFT, 4, movetoworkspace, 4
      bind = $mainMod SHIFT, 5, movetoworkspace, 5
      bind = $mainMod SHIFT, 6, movetoworkspace, 6
      bind = $mainMod SHIFT, 7, movetoworkspace, 7
      bind = $mainMod SHIFT, 8, movetoworkspace, 8
      bind = $mainMod SHIFT, 9, movetoworkspace, 9
      bind = $mainMod SHIFT, 0, movetoworkspace, 10

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

      # Move/resize windows with mainMod + LMB/RMB and dragging
      bindm = $mainMod, mouse:272, movewindow
      bindm = $mainMod, mouse:273, resizewindow

      #############################################################################
      # Custom keybinds
      # Show Rofi on SUPER-SPACE
      bind = $mainMod, space, exec, rofi -show drun -show-icons
      # Take a screenshot with the Print key
      bind = , Print, exec, grim -g "$(slurp)" | wl-copy -t image/png

      # Move to the previous / next workspace with SUPER-LEFT and SUPER-RIGHT
      bind = $mainMod      , right, workspace, e+1
      bind = $mainMod      , left , workspace, e-1
      bind = $mainMod SHIFT, right, movetoworkspace, e+1
      bind = $mainMod SHIFT, left , movetoworkspace, e-1

      # Launch various applications
      bind = $mainMod, R, exec, ranger
      bind = $mainMod, S, exec, steam

      # Lock the screen, send to swaylock and pause music
      bind = $mainMod, L, exec, swaylock && playerctl pause

      # Lid closure:
      # trigger when the switch is toggled
      # bindl=,switch:[switch name],exec,swaylock
      # trigger when the switch is turning on
      bindl=,switch:on:1241ec0,exec,hyprctl keyword monitor "eDP-1, 2560x1600, 0x0, 1"
      # trigger when the switch is turning off
      bindl=,switch:off:1241ec0,exec,hyprctl keyword monitor "eDP-1, disable"

      # Laptop specific config
      # Set up the FN keys:
      
      # F1 - Mute
      # bind = , XF86AudioMute, exec, amixer set Master toggle && swayosd --output-volume=mute-toggle
      bind = , XF86AudioMute, exec, swayosd --output-volume=mute-toggle
      
      # F2 - Volume Down
      # binde = , XF86AudioLowerVolume, exec, amixer set Master 3%-
      binde = , XF86AudioLowerVolume, exec, swayosd --output-volume=lower
      
      # F3 - Volume Up
      # binde = , XF86AudioRaiseVolume, exec, amixer set Master 3%+
      binde = , XF86AudioRaiseVolume, exec, swayosd --output-volume=raise
      
      # F4 - Mute Microphone
      # bind = , XF86AudioMicMute, exec, amixer set Capture toggle
      bind = , XF86AudioMicMute, exec, swayosd --input-volume=mute-toggle
      
      # F5 - Brightness Down
      # binde = , XF86MonBrightnessDown, exec, light -U 5
      binde = , XF86MonBrightnessDown, exec, swayosd --brightness=lower
      
      # F6 - Brightness Up
      # binde = , XF86MonBrightnessUp, exec, light -A 5
      binde = , XF86MonBrightnessUp, exec, swayosd --brightness=raise
      
      # F7 - External Displays
      # bind = , XF86
      
      # F8 - Airplane Mode
      # bind = , XF86
      
      # F9 - Notifications?
      # bind = , XF86
      
      # F10 - Call Answer?
      # bind = , XF86
      
      # F11 - Call Hang Up?
      # bind = , XF86
      
      # F12 - Favorites?
      # bind = , XF86
      
      # Use rofi as an alt-tab switcher
      # bind = ALT, TAB, exec, rofi -show window

      # Resize
      bind = $mainMod, R, exec, notify-send "Entered resize mode.  Press ESC to quit."
      bind = $mainMod, R, submap, resize
      submap = resize
      binde = , H, resizeactive,-50 0
      binde = , L, resizeactive,50 0
      binde = , K, resizeactive,0 -50
      binde = , J, resizeactive,0 50
      binde = , left, resizeactive,-50 0
      binde = , right, resizeactive,50 0
      binde = , up, resizeactive,0 -50
      binde = , down, resizeactive,0 50
      bind  = , escape, submap, reset
      submap = reset

      # Start the config:
      exec-once=bash ~/.config/hypr/start.sh
    '';
    };
    # Set the custom launcher script
    ".config/hypr/start.sh" = {
        enable = true;
        executable = true;
        text = ''
          #!/usr/bin/env bash
          # https://wiki.hyprland.org/FAQ/#some-of-my-apps-take-a-really-long-time-to-open
          dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP &

          # Set the wallpaper
          swww init

          # Waybar
          waybar &

          # Set up the idle management daemon
          swayidle -w \
              timeout 120       'swaylock -f && playerctl pause' \
              timeout 180       'hyprctl dispatch dpms off' \
              timeout 300       'systemctl suspend-then-hibernate' \
                   resume       'hyprctl dispatch dpms on' \
                   before-sleep 'swaylock -f' \
                   before-sleep 'playerctl pause' &

          # Automatic device mounting 
          udiskie &

          DIR=/etc/nixos/git/wallpapers/${theme}
          IMG=`ls $DIR | shuf -n 1`
          swww img $DIR/$IMG -t random &

          # Notification listener
          mako 
      '';
    };
  };
}