{ pkgs, ... }:
{
  config = {
    services = {
      xserver = {
        # Enable the GNOME Desktop Environment.
        desktopManager.gnome = {
          enable = true;
          extraGSettingsOverridePackages = [ pkgs.mutter ];
          extraGSettingsOverrides = ''
            [org.gnome.mutter]
            experimental-features=['scale-monitor-framebuffer']
          '';
        };
        displayManager.gdm.enable = true;
        excludePackages = with pkgs; [ xterm ];
      };

      displayManager.defaultSession = "gnome";

      gnome = {
        tinysparql.enable = false;
        localsearch.enable = false;
        sushi.enable = true;
        gnome-remote-desktop.enable = true;
      };
    };

    programs = {
      dconf.enable = true;
      gpaste.enable = true;
      kdeconnect.package = pkgs.gnomeExtensions.gsconnect;
    };

    # remove some gnome default apps
    environment.gnome.excludePackages = with pkgs; [
      cheese # photo booth
      epiphany # web browser
      evince # document viewer
      geary # email client
      gnome-maps
      gnome-weather
      gnome-tour
      gnome-contacts
      sysprof
      orca # screen reader
      gnome-disk-utility
      gnome-system-monitor
      gnome-weather
      gnome-backgrounds
      gnome-user-docs
      gnome-calendar
      yelp # help app
      # gnome-music
      # totem # video player
      # snapshot # camera
      # baobab # disk usage
    ];

    environment.systemPackages = with pkgs; [
      ghex
      impression
    ];

    # RDP connections
    networking.firewall.allowedTCPPorts = [ 3389 ];

    home-manager.sharedModules = [
      {
        home.packages =
          with pkgs;
          [
            gitg
            meld
            simple-scan
            pinta
            dconf-editor
            gpaste

            # graphical installer for flatpak apps
            gnome-software
          ]
          ++ (with gnomeExtensions; [
            caffeine
            appindicator
          ]);

        dconf.settings = import ./gnome-shared-dconf.nix;

        gtk = {
          enable = true;
          iconTheme.name = "Adwaita";
          cursorTheme.name = "Adwaita";
          theme = {
            name = "adw-gtk3-dark";
            package = pkgs.adw-gtk3;
          };
        };
      }

      {
        home.packages = with pkgs; [ trayscale ] ++ (with gnomeExtensions; [ tailscale-qs ]);
        dconf.settings."org/gnome/shell".enabled-extensions = [ "tailscale@joaophi.github.com" ];
      }
    ];
  };
}