{
  description = "PatOS is a minimal, immutable Linux distribution specialized for the Patagia Platform.";

  inputs = {
    flake-utils.url = "github:numtide/flake-utils";
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
  };

  outputs =
    {
      self,
      flake-utils,
      nixpkgs,
    }:
    flake-utils.lib.eachDefaultSystem (
      system:
      let
        pkgs = import nixpkgs { inherit system; };
        patosPkgs = self.packages.${system};
        version = "0.0.1";
        secureBoot = "false";
        cpuArch = "intel";
        updateUrl = "http://10.0.2.2:8000/";
      in
      {
        packages = {
          default = patosPkgs.image;
          image = pkgs.callPackage ./pkgs/image {
            inherit
              patosPkgs
              version
              updateUrl
              cpuArch
              secureBoot
              ;
          };
          rootfs = pkgs.callPackage ./pkgs/rootfs/mkrootfs.nix { inherit patosPkgs version; };
          initrd = pkgs.callPackage ./pkgs/rootfs/mkinitrd.nix { inherit patosPkgs version; };
          kernel = pkgs.callPackage ./pkgs/kernel { };
          linux-firmware = pkgs.callPackage ./pkgs/linux-firmware { };
          glibc = pkgs.callPackage ./pkgs/glibc { };
          busybox = pkgs.callPackage ./pkgs/busybox { };
          openssl = pkgs.callPackage ./pkgs/openssl { };
          cert = pkgs.callPackage ./pkgs/cert { };
          kexec = pkgs.callPackage ./pkgs/kexec-tools { };
          lvm2 = pkgs.callPackage ./pkgs/lvm2 { };
          tpm2-tools = pkgs.callPackage ./pkgs/tpm2-tools { inherit patosPkgs; };
          tpm2-tss = pkgs.callPackage ./pkgs/tpm2-tss { };
          systemd = pkgs.callPackage ./pkgs/systemd { };
          dbus-broker = pkgs.callPackage ./pkgs/dbus-broker { };

          qemu-uefi-tpm = pkgs.callPackage ./utils/qemu-uefi-tpm.nix { };

          debug-tools-sysext = pkgs.callPackage ./lib/make-sysext.nix {
            name = "debug-tools";
            version = "0.0.1";
            packages = [
              {
                drv = pkgs.curl;
                path = "bin/curl";
              }
              {
                drv = pkgs.bash;
                path = "bin/bash";
              }
              {
                drv = patosPkgs.glibc;
                path = "bin/ldd";
              }
              {
                drv = pkgs.keyutils;
                path = "bin/keyctl";
              }
              {
                drv = pkgs.gnutar;
                path = "bin/tar";
              }
              {
                drv = pkgs.binutils-unwrapped;
                path = "bin/strings";
              }
              {
                drv = pkgs.strace;
                path = "bin/strace";
              }
              {
                drv = patosPkgs.tpm2-tools;
                path = "bin/tpm2";
              }
              {
                drv = patosPkgs.openssl;
                path = "bin/openssl";
              }
              {
                drv = pkgs.cryptsetup;
                path = "bin/cryptsetup";
              }
              {
                drv = pkgs.cryptsetup;
                path = "bin/veritysetup";
              }
              {
                drv = pkgs.erofs-utils;
                path = "bin/mkfs.erofs";
              }
              # shared lib required for cryptsetup
              {
                drv = pkgs.popt;
                path = "lib/libpopt.so.0.0.2";
              }
              {
                drv = pkgs.popt;
                path = "lib/libpopt.so.0";
              }
              {
                drv = pkgs.popt;
                path = "lib/libpopt.so";
              }
              # shared lib required for mkfs.erofs
              {
                drv = pkgs.lz4.lib;
                path = "lib/liblz4.so.1.10.0";
              }
              {
                drv = pkgs.lz4.lib;
                path = "lib/liblz4.so.1";
              }
              {
                drv = pkgs.lz4.lib;
                path = "lib/liblz4.so";
              }
              # shared lib required for binutils
              {
                drv = pkgs.binutils-unwrapped.lib;
                path = "lib/libsframe.so.1.0.0";
              }
              {
                drv = pkgs.binutils-unwrapped.lib;
                path = "lib/libsframe.so.1";
              }
              {
                drv = pkgs.binutils-unwrapped.lib;
                path = "lib/libbfd-2.43.1.so";
              }
              {
                drv = pkgs.binutils-unwrapped.lib;
                path = "lib/libbfd.so";
              }
              # shared lib required for strace
              {
                drv = pkgs.elfutils.out;
                path = "lib/libdw-0.192.so";
              }
              {
                drv = pkgs.elfutils.out;
                path = "lib/libdw.so.1";
              }
              {
                drv = pkgs.elfutils.out;
                path = "lib/libdw.so";
              }
              {
                drv = pkgs.elfutils.out;
                path = "lib/libelf-0.192.so";
              }
              {
                drv = pkgs.elfutils.out;
                path = "lib/libelf.so.1";
              }
              {
                drv = pkgs.elfutils.out;
                path = "lib/libelf.so";
              }
            ];
          };
        };

        checks = {
          simple-test = pkgs.runCommand "simple-test" { } ''
            ${self.packages.${system}.default}/bin/my-program
            touch $out
          '';
        };

        formatter = pkgs.nixpkgs-fmt;

        devShells.default = pkgs.mkShell {
          buildInputs = with pkgs; [
            just
            nixd
            nixfmt-rfc-style
            patosPkgs.qemu-uefi-tpm
          ];
        };

      }
    );
}