{
  lib,
  pkgs,
  config,
  osConfig,
  ...
}: let
  hardware = osConfig.host.hardware;
in {
  imports = [
    ./vscode
    ./firefox.nix
    ./direnv.nix
    ./openssh.nix
    ./git.nix
  ];

  config = lib.mkMerge [
    {
      programs = lib.mkMerge [
        {
          # Let Home Manager install and manage itself.
          home-manager.enable = true;
        }
        (lib.mkIf (config.user.isTerminalUser || config.user.isDesktopUser) {
          bash.enable = true;
          git.enable = true;
          openssh.enable = true;
        })
        (lib.mkIf config.user.isDesktopUser {
          bitwarden.enable = true;
          obs-studio.enable = hardware.graphicsAcceleration.enable;
          qbittorrent.enable = true;
          prostudiomasters.enable = true;
          protonvpn-gui.enable = true;
          dbeaver-bin.enable = true;
          bruno.enable = true;
        })
        (lib.mkIf (hardware.directAccess.enable && config.user.isDesktopUser) {
          anki.enable = true;
          makemkv.enable = true;
          discord.enable = true;
          signal-desktop-bin.enable = true;
          calibre.enable = true;
          obsidian.enable = true;
          jetbrains.idea-community.enable = true;
          vscode.enable = true;
          firefox.enable = true;
          steam.enable = true;
        })
      ];
    }
    (lib.mkIf config.user.isTerminalUser {
      home.packages = with pkgs; [
        # command line tools
        sox
        yt-dlp
        ffmpeg
        imagemagick
      ];
    })
    (lib.mkIf config.user.isDesktopUser {
      nixpkgs.config = {
        allowUnfree = true;
      };

      home.packages = (
        (with pkgs; [
          aileron

          gnomeExtensions.dash-to-dock

          proxmark3
        ])
        ++ (
          lib.lists.optionals hardware.directAccess.enable (with pkgs; [
            #foss platforms
            ungoogled-chromium
            libreoffice
            inkscape
            gimp
            krita
            freecad
            # cura
            # kicad-small
            onionshare
            # rhythmbox

            # wireshark
            # rpi-imager
            # fritzing
            mfoc
            tor-browser
            pdfarranger
            picard

            # proprietary platforms
            (lib.mkIf hardware.graphicsAcceleration.enable davinci-resolve)

            # development tools
            # androidStudioPackages.canary
            qFlipper

            # system tools
            openvpn
            noisetorch

            # hardware management tools
            (lib.mkIf hardware.piperMouse.enable piper)
            (lib.mkIf hardware.openRGB.enable openrgb)
            (lib.mkIf hardware.viaKeyboard.enable via)
          ])
        )
      );
    })
  ];
}