{
  description = "Test flake for nixos-hardware";

  inputs = {
    nixos-unstable-small.url = "github:NixOS/nixpkgs/nixos-unstable-small";
    nixos-stable.url = "github:NixOS/nixpkgs/nixos-24.05";
    # override in the test
    nixos-hardware.url = "github:NixOS/nixos-hardware";
    flake-parts.url = "github:hercules-ci/flake-parts";
    flake-parts.inputs.nixpkgs-lib.follows = "nixos-unstable-small";
  };

  outputs =
    inputs@{ flake-parts, ... }:
    flake-parts.lib.mkFlake { inherit inputs; } {
      systems = [
        "aarch64-linux"
        "x86_64-linux"
        "riscv64-linux"
      ];
      perSystem =
        {
          system,
          lib,
          pkgs,
          inputs',
          ...
        }:
        let
          blackList = [
            # does import-from-derivation
            "toshiba-swanky"
            # uses custom nixpkgs config
            "raspberry-pi-2"

            # deprecated profiles
            "framework"
            "asus-zephyrus-ga402x"
            "lenovo-yoga-7-14ARH7"
          ];

          # There are more, but for those we need to force it.
          # In future we should probably already define it in our module.
          aarch64Systems = [
            "raspberry-pi-3"
            "raspberry-pi-4"
            "raspberry-pi-5"
          ];

          matchArch =
            moduleName:
            if builtins.elem moduleName aarch64Systems then
              pkgs.hostPlatform.system == "aarch64-linux"
            else
              # TODO also add riscv64
              pkgs.hostPlatform.system == "x86_64-linux";

          modules = lib.filterAttrs (
            name: _: !(builtins.elem name blackList || lib.hasPrefix "common-" name) && matchArch name
          ) inputs.nixos-hardware.nixosModules;
          buildProfile = import ./build-profile.nix;

          unfreeNixpkgs =
            importPath:
            import importPath {
              config = {
                allowBroken = true;
                allowUnfree = true;
                nvidia.acceptLicense = true;
              };
              overlays = [ ];
              inherit system;
            };
          nixpkgsUnstable = unfreeNixpkgs inputs.nixos-unstable-small;
          nixpkgsStable = unfreeNixpkgs inputs.nixos-stable;

          checksForNixpkgs =
            channel: nixpkgs:
            lib.mapAttrs' (
              name: module:
              lib.nameValuePair "${channel}-${name}" (buildProfile {
                pkgs = nixpkgs;
                profile = module;
              })
            ) modules;
        in
        {
          _module.args.pkgs = nixpkgsUnstable;
          checks = checksForNixpkgs "nixos-unstable" nixpkgsUnstable // checksForNixpkgs "nixos-stable" nixpkgsStable;
          packages.run = pkgs.writeShellScriptBin "run.py" ''
            #!${pkgs.bash}/bin/bash
            export PATH=${lib.makeBinPath [ pkgs.nix-eval-jobs pkgs.nix-eval-jobs.nix ]}
            exec ${pkgs.python3.interpreter} ${./.}/run.py --nixos-hardware "$@"
          '';
        };
    };
}