{ 
  # INFORMATION
  # When building for a system, remember to change the hostname variable below
  description = "NixOS System Config";

  inputs = {
    # NixOS packages
    stable-nixpkgs.url   = "nixpkgs/nixos-23.05";
    unstable-nixpkgs.url = "nixpkgs/nixos-unstable";

    # Manage dotfiles in a home directory
    home-manager.url = "github:nix-community/home-manager/release-23.05";
    home-manager.inputs.nixpkgs.follows = "stable-nixpkgs";

    # Secureboot Configuration
    lanzaboote.url = "github:nix-community/lanzaboote";
    lanzaboote.inputs.nixpkgs.follows = "stable-nixpkgs";

    # Nix User Repository
    nur.url = "github:nix-community/NUR";

    # Hardware support
    nixos-hardware.url = "github:NixOS/nixos-hardware/master";

    # Encrypted secrets in Nix configuration files
    # https://github.com/Mic92/sops-nix
    sops-nix.url = "github:Mic92/sops-nix";
  };

  outputs = { stable-nixpkgs, unstable-nixpkgs, home-manager, lanzaboote, nur, sops-nix, nixos-hardware, ... }@inputs:
  let
    # Variables - Remember to set these
    hostname = "nixos-laptop";
    system = "x86_64-linux";

    pkgs = import stable-nixpkgs {
      inherit system;
      config = { allowUnfree = true; };
    };

    unstable = import unstable-nixpkgs {
      inherit system;
      config = { allowUnfree = true; };
    };

    lib = stable-nixpkgs.lib;
  in {
    # NixOS Configuration files:
    nixosConfigurations = {
      # Declare a generic configuration using the $hostname variable:
      ${hostname} = lib.nixosSystem { 
        inherit system;
        specialArgs = { 
          inherit unstable; 
          inherit hostname;  
        };
        modules = [
          # Configuration Imports
          ./hosts/${hostname}/hardware-configuration.nix # Hardware Configuration
          ./hosts/${hostname}/configuration.nix          # Extra options for the host configuration
          ./configuration.nix                            # Common NixOS Configuration

          # Flake Imports
          sops-nix.nixosModules.sops                     # Handle secrets
          lanzaboote.nixosModules.lanzaboote             # SecureBoot Configuration
          nur.nixosModules.nur                           # NixOS User Repository
          nixos-hardware.nixosModules.lenovo-thinkpad-p1 # Thinkpad P1 hardware configuration

          # Home Manager settings
          home-manager.nixosModules.home-manager {
            home-manager.useGlobalPkgs   = true;
            home-manager.useUserPackages = true;
            home-manager.users.albert = import ./users/albert/home.nix;
            home-manager.users.root   = import ./users/root/home.nix;
            nixpkgs.overlays = [
              nur.overlay
            ];
          }
        ]; # modules
      }; # lib.nixosSystem - ${hostname}
    }; # nixosConfiguration
  };
}