{
  nixpkgs
, unstable
, liminix
, ... }:
let
  inherit (builtins) map;
  pkgs = (import nixpkgs {});
  borderVmConf =  ./bordervm.conf-example.nix;
  inherit (pkgs.lib.attrsets) genAttrs;
  devices = [ "qemu" "gl-ar750" "gl-mt300n-v2" "gl-mt300a" ];
  vanilla = ./vanilla-configuration.nix;
  for-device = name:
    (import liminix {
      inherit nixpkgs borderVmConf;
      device = import (liminix + "/devices/${name}");
      liminix-config = vanilla;
    }).outputs.default;
  tests = import ./tests/ci.nix;
  jobs =
    (genAttrs devices (name: for-device name)) // tests // {
      buildEnv = (import liminix {
        inherit nixpkgs  borderVmConf;
        device = import (liminix + "/devices/qemu");
        liminix-config = vanilla;
      }).buildEnv;
      doc = pkgs.stdenv.mkDerivation {
        name = "liminix-doc";
        nativeBuildInputs = with pkgs; [ gnumake sphinx ];
        src = ./doc;
        buildPhase = ''
          make html
        '';
        installPhase = ''
          mkdir -p $out/nix-support $out/share/doc/
          # (cd _build && tar cf $out/share/doc/liminix_manual.tar html)
          cp -a _build/html $out/share/doc/liminix
          echo "file source-dist \"$out/share/doc/liminix\"" \
              > $out/nix-support/hydra-build-products
        '';
      };
      with-unstable = (import liminix {
        nixpkgs = unstable;
        inherit borderVmConf;
        device = import (liminix + "/devices/qemu");
        liminix-config = vanilla;
      }).outputs.default;
    };
in jobs