{
  description = "My System Configs";

  inputs = {
    nixpkgs.url = "nixpkgs/nixos-unstable";

    agenix.url = "github:ryantm/agenix";
    agenix.inputs.nixpkgs.follows = "nixpkgs";

    alejandra.url = "github:kamadorueda/alejandra/3.0.0";
    alejandra.inputs.nixpkgs.follows = "nixpkgs";

    devenv.url = "github:cachix/devenv";
    devenv.inputs.nixpkgs.follows = "nixpkgs";

    golink.url = "github:tailscale/golink";
    golink.inputs.nixpkgs.follows = "nixpkgs";

    home-manager.url = "github:nix-community/home-manager/master";
    home-manager.inputs.nixpkgs.follows = "nixpkgs";

    hyprland.url = "github:hyprwm/Hyprland";

    i3utils.url = "git+https://git.sr.ht/~dpatterbee/i3utils?ref=main";
    i3utils.inputs.nixpkgs.follows = "nixpkgs";

    nixgl.url = "github:/guibou/nixGL";
    nixgl.inputs.nixpkgs.follows = "nixpkgs";
  };

  outputs = {
    nixpkgs,
    agenix,
    alejandra,
    devenv,
    golink,
    home-manager,
    hyprland,
    i3utils,
    nixgl,
    ...
  } @ inputs: let
    system = "x86_64-linux";

    pkgs =
      (import nixpkgs {
        inherit system;
        config.allowUnfree = true;
        overlays = [
          golink.overlay
          hyprland.overlays.default
          nixgl.overlay
        ];
      })
      // {
        i3utils = i3utils.packages.${system}.default;
        hyprland = hyprland.packages."x86_64-linux".default.overrideAttrs (finalAttrs: previousAttrs: {
          buildInputs = previousAttrs.buildInputs ++ [pkgs.makeWrapper];
          postInstall = ''
            ls -lar $out
            wrapProgram $out/bin/Hyprland \
              --set LIBVA_DRIVER_NAME nvidia \
              --set XDG_SESSION_TYPE wayland \
              --set __GLX_VENDOR_LIBRARY_NAME nvidia \
              --set WLR_NO_HARDWARE_CURSORS 1
          '';
        });
      };

    lib = nixpkgs.lib;

    deckSystem = {hostname}:
      home-manager.lib.homeManagerConfiguration {
        inherit pkgs;
        modules = [
          ./users/deck
        ];
        extraSpecialArgs = {
          inherit hostname;
        };
      };

    hostSystem = {
      hostname,
      headless,
    }:
      lib.nixosSystem {
        inherit system;
        inherit pkgs;

        modules = [
          ./hosts/${hostname}/configuration.nix

          agenix.nixosModules.default

          hyprland.nixosModules.default
          {
            programs.hyprland = {
              enable = !headless;
            };
          }

          golink.nixosModules.default

          home-manager.nixosModules.home-manager
          {
            home-manager = {
              useGlobalPkgs = true;
              users = import ./users;
              extraSpecialArgs = {
                inherit hostname;
                inherit headless;
              };
              sharedModules = [
                hyprland.homeManagerModules.default
              ];
            };
          }
        ];
      };
  in {
    nixosConfigurations = {
      dingbox = hostSystem {
        hostname = "dingbox";
        headless = false;
      };
      elderbug = hostSystem {
        hostname = "elderbug";
        headless = false;
      };
      miniding = hostSystem {
        hostname = "miniding";
        headless = false;
      };
      pingbox = hostSystem {
        hostname = "pingbox";
        headless = false;
      };
      dingserver = hostSystem {
        hostname = "dingserver";
        headless = true;
      };
      bigding = hostSystem {
        hostname = "bigding";
        headless = true;
      };
    };
    homeConfigurations = {
      "deck" = deckSystem {
        hostname = "deck";
      };
    };

    devShell.${system} = devenv.lib.mkShell {
      inherit inputs pkgs;
      modules = [
        {
          # https://devenv.sh/reference/options/
          packages = with pkgs; [
            alejandra.packages.${system}.default
          ];

          enterShell = ''
          '';

          env = {
          };

          scripts = {
            tidy.exec = ''
              alejandra -e ./users/configs/desktop/hyprland/default.nix .
            '';
          };
        }
      ];
    };
  };
}
