{ lib, ... }:
let
  inherit (lib.lists) singleton;

  mkHjemPackages = packages: {
    hjem.extraModules = singleton {
      inherit packages;
    };
  };

  packagesBase =
    { pkgs, ... }:
    {
      environment.defaultPackages = [ ];
    }
    // mkHjemPackages [
      pkgs.ast-grep
      pkgs.curl
      pkgs.forgejo-cli
      pkgs.hyperfine
      pkgs.moreutils
      pkgs.nodejs
      pkgs.openssl
      pkgs.pv
      pkgs.rsync
      pkgs.tokei
      pkgs.tree
      pkgs.typos
      pkgs.uutils-coreutils-noprefix
      pkgs.sqld
      pkgs.sqlite
      pkgs.wrk
      pkgs.xh
    ];

  packagesExtraCli =
    { pkgs, ... }:
    mkHjemPackages [
      pkgs.bitwarden-cli
      pkgs.deno
      pkgs.docker
      pkgs.docker-compose
      pkgs.exercism
      pkgs.pnpm
      pkgs.deadnix
      pkgs.treefmt
      # For experimental pipe-operators support.
      (pkgs.statix.overrideAttrs rec {
        src = pkgs.fetchFromGitHub {
          owner = "oppiliappan";
          repo = "statix";
          rev = "43681f0da4bf1cc6ecd487ef0a5c6ad72e3397c7";
          hash = "sha256-LXvbkO/H+xscQsyHIo/QbNPw2EKqheuNjphdLfIZUv4=";
        };

        cargoDeps = pkgs.rustPlatform.importCargoLock {
          lockFile = src + "/Cargo.lock";
          allowBuiltinFetchGit = true;
        };
      })
    ];

  packagesExtraGui =
    { pkgs, ... }:
    mkHjemPackages [
      pkgs.bitwarden-desktop
      pkgs.brave
      pkgs.obs-studio
      pkgs.thunderbird
      pkgs.wasistlos
    ];

  packagesExtraLinux =
    { pkgs, ... }:
    mkHjemPackages [
      pkgs.gcc
      pkgs.gnumake
      pkgs.wget
    ];
in
{
  flake.modules.nixos.packages = packagesBase;
  flake.modules.darwin.packages = packagesBase;

  flake.modules.nixos.packages-extra-linux = packagesExtraLinux;
  flake.modules.nixos.packages-extra-gui = packagesExtraGui;
  flake.modules.nixos.packages-extra-cli = packagesExtraCli;
}