{
  config,
  nix-index-database,
  nixpkgs-unstable,
  nixpkgs,
  ...
}: {
  imports = [
    nix-index-database.nixosModules.nix-index
  ];

  nix = {
    # https://nixos.wiki/wiki/Storage_optimization
    gc = {
      # Automatically run the nix garbage collector, removing files from
      # the store that are not referenced by any generation.
      # https://nixos.org/manual/nix/stable/package-management/garbage-collection
      automatic = true;
      dates = "weekly";
      options = "--delete-older-than 7d";
    };

    settings = {
      # Automatically optimise the store after each build. Store optimisation
      # reduces nix store space by 25-35% by finding identical files and
      # hard-linking them to each other.
      # https://nixos.org/manual/nix/unstable/command-ref/nix-store/optimise.html
      auto-optimise-store = true;

      # Enable flakes
      experimental-features = ["nix-command" "flakes" "repl-flake"];

      # Timeout connections to the binary cache instead of waiting forever
      connect-timeout = 5;
    };

    # The nix registry is used to refer to flakes using symbolic identifiers
    # when running commands such as `nix run nixpkgs#hello`. By default,
    # `nixpkgs` is an alias of the system's nixpkgs, but no such alias is made
    # for unstable.
    registry = {
      nixpkgs-unstable.flake = nixpkgs-unstable;
    };
  };

  # The system-wide garbage collection service configured above does not know
  # about our user profile.
  home-manager.users.caspervk.nix.gc = {
    inherit (config.nix.gc) automatic options;
    frequency = config.nix.gc.dates;
  };

  # Run unpatched dynamic binaries on NixOS.
  # https://github.com/Mic92/nix-ld
  programs.nix-ld.enable = true;

  # Comma runs software without installing it. Basically it just wraps together
  # `nix shell -c` and `nix-index`. You stick a `,` in front of a command to
  # run it from whatever location it happens to occupy in nixpkgs without
  # really thinking about it.
  # https://github.com/nix-community/comma
  programs.nix-index-database.comma.enable = true;
  programs.command-not-found.enable = false;
}