{ lib, pkgs, ... }:
{
  nix = {
    package = pkgs.nixVersions.latest;
    diffSystem = true;
    settings = {
      experimental-features = [
        "nix-command"
        "flakes"
      ];
      keep-outputs = true;
      builders-use-substitutes = true;
      connect-timeout = 20;
      substituters = [
        "https://cache.nixos.org/?priority=1&want-mass-query=true"
        "https://attic.alicehuston.xyz/cache-nix-dot?priority=4&want-mass-query=true"
        "https://cache.alicehuston.xyz/?priority=5&want-mass-query=true"
        "https://nix-community.cachix.org/?priority=10&want-mass-query=true"
      ];
      trusted-substituters = [
        "https://cache.nixos.org"
        "https://attic.alicehuston.xyz/cache-nix-dot"
        "https://cache.alicehuston.xyz"
        "https://nix-community.cachix.org"
      ];
      trusted-public-keys = [
        "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
        "cache.alicehuston.xyz:SJAm8HJVTWUjwcTTLAoi/5E1gUOJ0GWum2suPPv7CUo=%"
        "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
        "cache-nix-dot:Od9KN34LXc6Lu7y1ozzV1kIXZa8coClozgth/SYE7dU="
      ];
      trusted-users = [
        "root"
        "@wheel"
      ];
    };

    # free up to 10 gb when only 1 gb left
    extraOptions = ''
      min-free = ${toString (1 * 1024 * 1024 * 1024)}
      max-free = ${toString (10 * 1024 * 1024 * 1024)}
    '';

    gc = lib.mkDefault {
      automatic = true;
      dates = "weekly";
      options = "--delete-older-than 30d";
    };

    optimise = {
      automatic = true;
      dates = [ "01:00" ];
    };
  };
}