{lib, inputs, pkgs, gpu, platform, ...}: {

  # nixpkgs = {
  #   overlays = [
  #     # https://github.com/nix-community/nixpkgs-wayland
  #     inputs.nixpkgs-wayland.overlay
  #   ];
  # };

  services.xserver.videoDrivers = [ ] ++ lib.optional (builtins.isString gpu) gpu;
  
  # tuigreet
  services.greetd = {
    enable = true;
    settings = {
      default_session = {
        command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --cmd Hyprland -g 'Authorized Personnel Only'";
        user = "greeter";
      };
    };
  };

  # Brightness and volume control
  # https://haikarainen.github.io/light/
  programs.light.enable = true;
  # PolKit for the fingerprint reader
  security.polkit.enable = true;
  # https://github.com/NixOS/nixpkgs/issues/143365
  security.pam.services.swaylock = {}; 
  
  # Enabling hyprlnd on NixOS
  programs.hyprland = {
    enable = true;
    # enableNvidiaPatches = true;
    xwayland.enable = true;
  };

  environment.sessionVariables = {
    # If your cursor becomes invisible, set this to 1
    WLR_NO_HARDWARE_CURSORS = "0";
    # Hint electron apps to use wayland
    NIXOS_OZONE_WL = "1";
  };

  # https://www.freedesktop.org/software/systemd/man/logind.conf.html 
  services.logind.extraConfig = ''
    IdleActionSec=900
    IdleAction=suspend-then-hibernate
    HandleLidSwitch=suspend-then-hibernate
    HandleLidSwitchDocked=ignore
    HandleLidSwitchExternalPower=suspend
  '';

  # https://www.systutorials.com/docs/linux/man/5-systemd-sleep.conf/ 
  # HibernateDelaySec is the amount of time the
  # system sleeps before entering hibernate when
  # using suspend-then-hibernate
  systemd.sleep.extraConfig = ''
    AllowSuspend = yes
    AllowHibernate = yes
    AllowSuspendThenhibernate = yes
    AllowHybridSleep = yes

    HibernateDelaySec = 600
  '';

  # XDG portal
  xdg.portal.enable = true;
  xdg.portal.extraPortals = [ pkgs.xdg-desktop-portal-gtk ];

  # system packages
  environment.systemPackages = [
    # waybar
    (pkgs.waybar.overrideAttrs (oldAttrs: {
        mesonFlags = oldAttrs.mesonFlags ++ [ "-Dexperimental=true" ];
      })
    )
    pkgs.libnotify            # Notification libraries
    pkgs.mako                 # Notification daemon
    pkgs.swww                 # Wallpaper daemon
    pkgs.kitty                # Terminal emulator
    pkgs.rofi-wayland         # App Launcher
    pkgs.grim                 # Screenshots
    pkgs.slurp                # Screenshots
    pkgs.wl-clipboard         # Clipboard
    pkgs.font-awesome         # Fonts
    pkgs.libinput-gestures    # Gesture Control
    pkgs.playerctl            # Control sublime-music from waybar?
    pkgs.pavucontrol          # Pulse Audio Volume CONTROL
    pkgs.glib                 # Set GTK theme settings
    pkgs.greetd.tuigreet      # Greeter
    pkgs.swayidle             # Idle management daemon - Automatic lock screen
    pkgs.swayosd              # used for on-screen notifications for things like adjusting backlight, volume, etc
    pkgs.wlogout              # Logout/shutdown/hibernate/lock screen modal UI
    pkgs.ranger               # TUI file manager
    pkgs.xdg-utils            # Utilities for better X/Wayland integration
    pkgs.bitwarden-cli        # Bitwarden for rofi
    pkgs.bitwarden-menu       # Bitwarden for rofi
    pkgs.pulsemixer           # TUI Pipewire  / volume management
    pkgs.calcurse             # TUI Calendar app
    pkgs.udiskie              # Automatic device mounting

    # Themes
    pkgs.gruvbox-gtk-theme    # Gruvbox Theme
    pkgs.papirus-icon-theme   # Papirus Icons

    # wayland-packages
    inputs.nixpkgs-wayland.packages.${platform}.wayprompt  # from nixpkgs-wayland exclusively - pinentry UI
  ];

  # Enable sound with pipewire.
  sound.enable = true;
  security.rtkit.enable = true;
  services.pipewire = {
    enable = true;
    alsa.enable = true;
    alsa.support32Bit = true;
    pulse.enable = true;
    jack.enable = true;
  };
}