{ lib, config, pkgs, hostname, gpu, ... }: {
  # Enable sound with pipewire.
  sound.enable = true;
  hardware.pulseaudio.enable = false;
  security.rtkit.enable = true;
  services.pipewire = {
    enable = true;
    alsa.enable = true;
    alsa.support32Bit = true;
    pulse.enable = true;
  };

  # Configure keymap in X11
  services.xserver = {
    enable = true;
    layout = "us";
    xkbVariant = "";
    autorun = true;
    videoDrivers = [ ] ++ lib.optional (builtins.isString gpu) gpu;
  };

  ##### disable nvidia, very nice battery life.
  # hardware.nvidiaOptimus.disable = lib.mkDefault true;

  services.xserver = {
    # https://nixos.org/manual/nixos/stable/index.html#chap-gnome
    # Enable the GNOME Desktop Environment.
    displayManager.gdm.enable = true;
    desktopManager.gnome.enable = true;
    desktopManager.gnome.extraGSettingsOverrides = ''
      [org.gnome.login-screen]
      banner-message-enable=true
      banner-message-text='Test';
    '';
  };

  # Set Gnome settings:
  services.gnome = {
    games.enable = false; 
    core-utilities.enable = true;
    gnome-remote-desktop.enable = true;
  };

  # Set the firewall ports for gnome-remote-desktop:
  networking.firewall.interfaces.tailscale0.allowedTCPPorts = [ 3389 ];


  # https://nixos.wiki/wiki/GNOME
  # Remove unwanted packages
  environment.gnome.excludePackages = (with pkgs; [
    gnome.cheese
    gnome.gnome-music
    gnome.epiphany
    gnome.geary
    gnome.totem
    gnome.gnome-characters
    gnome-tour
    gnome-photos
    gnome.yelp
    gnome.gnome-font-viewer
    gnome-connections
    gnome.gnome-contacts
    gnome.gnome-logs
    gnome.gnome-maps
    gnome.simple-scan
  ]);

  environment.systemPackages = with pkgs; [
    # Gnome Extensions
    gnomeExtensions.tiling-assistant
    gnomeExtensions.dash-to-dock
    gnomeExtensions.blur-my-shell
    gnomeExtensions.vitals
    gnomeExtensions.user-themes
    gnomeExtensions.caffeine
    gnomeExtensions.hibernate-status-button
    gnomeExtensions.night-theme-switcher
    gnomeExtensions.allow-locked-remote-desktop

    # Gnome relevant packages
    gnome3.gnome-tweaks
    papirus-icon-theme
    dconf2nix # https://github.com/gvolpe/dconf2nix
    # Tweak libadwaita themes
    gradience
    adw-gtk3

    gnome.gnome-session
  ];

  imports = [ 
    # Gnome Themes
    ./themes/gruvbox.nix
    ./themes/tokyo-night.nix
    ./themes/nordic.nix
    ./themes/vimix.nix
    ./themes/fluent.nix
    # You may need to edit which theme you're using in dconf.nix if you remove themes
   ];
}