{
  config,
  pkgs,
  username,
  ...
}:
{
  nixpkgs.config.chromium.commandLineArgs = "--password-store='gnome-libsecret' --enable-features=UseOzonePlatform --ozone-platform=wayland";
  hardware.bluetooth.enable = true;
  networking.networkmanager.enable = true;
  environment = {
    sessionVariables = {
      NIXOS_OZONE_WL = "1";
      MOZ_ENABLE_WAYLAND = "1";
      WEBKIT_DISABLE_COMPOSITING_MODE = "1";
      MPLBACKEND = "TkAgg";
      GDK_BACKEND = "wayland,x11";
      XDG_SESSION_TYPE = "wayland";
      QT_QPA_PLATFORM = "wayland";
      QT_AUTO_SCREEN_SCALE_FACTOR = "1";
      QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
    };
    systemPackages = with pkgs; [
      libsecret
      libnotify
      xdg-utils
      hunspell
      hunspellDicts.en_GB-large
      wl-clipboard
      hyprpicker
      grim
      slurp
      swappy
      cameractrls-gtk4
      nautilus
      libreoffice
      evince
      image-roll
      imagemagick
      clapper
      g4music
      ffmpeg
      picard
      webcord
      signal-desktop
      whatsapp-for-linux
      teams-for-linux
      nomachine-client
    ];
  };
  security = {
    polkit.enable = true;
    pam.loginLimits = [
      {
        domain = "@users";
        item = "rtprio";
        type = "-";
        value = 1;
      }
    ];
  };
  programs = {
    dconf.enable = true;
    noisetorch.enable = true;
    seahorse.enable = true;
    file-roller.enable = true;
    hyprland.enable = true;
    xwayland.enable = true;
  };
  gtk.iconCache.enable = true;
  qt = {
    enable = true;
    style = if config.lib.stylix.scheme.variant == "light" then "adwaita" else "adwaita-dark";
  };
  services = {
    gnome.gnome-keyring.enable = true;
    flatpak.enable = true;
    printing.enable = true;
    tumbler.enable = true;
    udisks2.enable = true;
    blueman.enable = config.hardware.bluetooth.enable;
    gnome.sushi.enable = true;
    gvfs = {
      enable = true;
      package = pkgs.gnome.gvfs;
    };
    kanata = {
      enable = true;
      keyboards.main = {
        config = builtins.readFile ./kanata.kbd;
        extraDefCfg = "process-unmapped-keys yes";
      };
    };
    pipewire = {
      enable = true;
      pulse.enable = true;
      alsa = {
        enable = true;
        support32Bit = true;
      };
    };
    greetd = {
      enable = true;
      settings =
        let
          default_session.command = "Hyprland";
        in
        {
          inherit default_session;
          initial_session = {
            inherit (default_session) command;
            user = username;
          };
        };
    };
    xserver = {
      enable = true;
      xkb.layout = "gb";
    };
  };
  xdg.portal = {
    enable = true;
    config.common.default = "*"; # TODO change for xdg-desktop-portal > 1.17 changes
    extraPortals = [ pkgs.xdg-desktop-portal-gtk ];
  };
  home-manager.users.${username} =
    {
      config,
      pkgs,
      osConfig,
      ...
    }:
    {
      imports = [
        ./home/hyprland.nix
        ./home/terminal/default.nix
        ./home/browser/firefox.nix
        ./home/browser/nyxt.nix
        ./home/emacs/default.nix
        ./home/email/default.nix
        ./home/calendar/default.nix
        ./home/password-store/default.nix
      ];
      home.file.${config.gtk.gtk2.configLocation}.force = true;
      services = {
        syncthing.enable = true;
        gammastep = {
          inherit (osConfig.location) latitude longitude provider;
          enable = true;
          tray = true;
        };
      };
      gtk = {
        enable = true;
        gtk2.configLocation = "${config.xdg.configHome}/gtk-2.0/gtkrc";
        iconTheme = {
          package = (pkgs.papirus-icon-theme.override { color = "violet"; });
          name = if config.lib.stylix.scheme.variant == "light" then "Papirus-Light" else "Papirus-Dark";
        };
      };
      stylix.targets.gtk.extraCss = with config.lib.stylix.scheme.withHashtag; ''
        @define-color accent_color ${base0E-hex};
        @define-color accent_bg_color ${base0E-hex};
      '';
      xdg = {
        mime.enable = true;
        mimeApps =
          let
            defaultApplications = import ./mimeapps.nix;
          in
          {
            enable = true;
            inherit defaultApplications;
            associations.added = defaultApplications;
          };
        userDirs = {
          enable = true;
          createDirectories = true;
          extraConfig = {
            XDG_PROJECTS_DIR = "${config.home.homeDirectory}/Projects";
          };
        };
        configFile = {
          # Stop programs from overriding mimeapps
          "mimeapps.list".force = true;
          # Ensure GTK config is set
          "gtk-3.0/gtk.css".force = true;
          "gtk-3.0/settings.ini".force = true;
          "gtk-4.0/gtk.css".force = true;
          "gtk-4.0/settings.ini".force = true;
          # Set Swappy config so that it saves to Screenshots directory
          "swappy/config".text = ''
            [Default]
            save_dir=${config.xdg.userDirs.pictures}/Screenshots/
            save_filename_format=swappy-%Y%m%d-%H%M%S.png
            show_panel=false
            line_size=5
            text_size=${toString config.stylix.fonts.sizes.desktop}
            text_font=${config.stylix.fonts.sansSerif.name}
            paint_mode=brush
            early_exit=false
            fill_shape=false
          '';
          # WhatsApp config
          "whatsapp-for-linux/settings.conf" =
            let
              inherit (config.lib.stylix.scheme) variant;
            in
            {
              force = true;
              text = ''
                [web]
                allow-permissions=true
                hw-accel=2

                [general]
                notification-sounds=true
                close-to-tray=true
                start-in-tray=true

                [appearance]
                prefer-dark-theme=${if variant == "dark" then "true" else "false"}
              '';
            };
          # Teams config
          "teams-for-linux/config.json" = {
            force = true;
            text = builtins.toJSON {
              awayOnSystemIdle = true;
              closeAppOnCross = false;
              followSystemTheme = true;
              notificationMethod = "electron";
              optInTeamsV2 = true;
              spellCheckerLanguages = [ "en_GB" ];
            };
          };
          # Autostart some programs
          "autostart/signal-desktop.desktop".source =
            "${pkgs.signal-desktop}/share/applications/signal-desktop.desktop";
          "autostart/com.github.eneshecan.WhatsAppForLinux.desktop".source =
            "${pkgs.whatsapp-for-linux}/share/applications/com.github.eneshecan.WhatsAppForLinux.desktop";
        };
      };
    };
}