{
  description = "EscapeAngle's Nix config";

  inputs = {
    # Nixpkgs
    nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05";
    nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";

    # Secrets
    sops-nix = {
      url = "github:Mic92/sops-nix";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    # disko
    disko = {
      url = "github:nix-community/disko";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    # srvos
    srvos = {
      url = "github:nix-community/srvos";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    # impermanence
    impermanence = {
      url = "github:nix-community/impermanence";
    };

    # theme
    catppuccin = {
      url = "github:catppuccin/nix/release-25.05";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    # Home manager
    home-manager = {
      url = "github:nix-community/home-manager/release-25.05";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    # colmena
    colmena = {
      url = "github:zhaofengli/colmena";
      inputs = {
        nixpkgs.follows = "nixpkgs-unstable";
        stable.follows = "nixpkgs";
      };
    };

    # nixos-wsl
    nixos-wsl = {
      url = "github:nix-community/NixOS-WSL/main";
      inputs.nixpkgs.follows = "nixpkgs-unstable";
    };

    # neovim
    nixvim = {
      url = "git+https://git.escapeangle.com/lander/nixvim.git";
      inputs.nixpkgs.follows = "nixpkgs-unstable";
    };

    # mailserver
    nixos-mailserver = {
      url = "gitlab:simple-nixos-mailserver/nixos-mailserver/nixos-25.05";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    # headplane
    headplane = {
      url = "github:igor-ramazanov/headplane";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    # tidalcycles
    tidalcycles = {
      url = "github:mitchmindtree/tidalcycles.nix";
      inputs.nixpkgs.follows = "nixpkgs-unstable";
    };

    # jellyfin
    declarative-jellyfin = {
      url = "git+https://git.spoodythe.one/spoody/declarative-jellyfin.git";
      inputs.nixpkgs.follows = "nixpkgs-unstable";
    };
  };

  outputs =
    {
      self,
      nixpkgs,
      tidalcycles,
      colmena,
      ...
    }@inputs:
    let
      inherit (self) outputs;

      # I only care about linux builds
      systems = [
        "aarch64-linux"
        "x86_64-linux"
      ];

      forAllSystems = nixpkgs.lib.genAttrs systems;
    in
    rec {
      # custom pkgs
      packages = forAllSystems (system: import ./pkgs nixpkgs.legacyPackages.${system});

      formatter = forAllSystems (system: nixpkgs.legacyPackages.${system}.alejandra);

      overlays = import ./overlays { inherit inputs; };

      nixosModules = import ./modules/nixos;
      homeManagerModules = import ./modules/home-manager;

      devShells = forAllSystems (
        system:
        let
          pkgs = nixpkgs.legacyPackages.${system};
        in
        {
          default = pkgs.mkShell {
            buildInputs = [
              colmena.packages.${system}.colmena
            ];
          };
        }
      );

      nixosConfigurations = {
        # hypervisors
        hyp-01 = nixpkgs.lib.nixosSystem {
          specialArgs = { inherit inputs outputs; };
          modules = [
            ./hosts/hyp-01
          ];
        };

        # workstations
        wodan = nixpkgs.lib.nixosSystem {
          specialArgs = { inherit inputs outputs; };
          modules = [
            {
              nixpkgs.overlays = [
                overlays.additions
                overlays.unstable-packages
                tidalcycles.overlays.default
              ];
            }
            ./hosts/wodan
          ];
        };
        widar = nixpkgs.lib.nixosSystem {
          specialArgs = { inherit inputs outputs; };
          modules = [
            ./hosts/widar
          ];
        };
        heimdall = nixpkgs.lib.nixosSystem {
          system = "x86_64-linux";
          specialArgs = { inherit inputs outputs; };
          modules = [
            {
              nixpkgs.overlays = [
                overlays.additions
                overlays.unstable-packages
              ];
            }
            ./hosts/heimdall
          ];
        };
      };

      colmenaHive =
        let
          servers = builtins.map (file: nixpkgs.lib.removeSuffix ".nix" file) (
            builtins.filter (file: file != "common.nix" && nixpkgs.lib.hasSuffix ".nix" file) (
              builtins.attrNames (builtins.readDir ./hosts/servers)
            )
          );

          colmenaConfig = nixpkgs.lib.genAttrs servers (
            name:
            { ... }:
            let
              diskConfig = import ./lib/disk-config.nix { inherit nixpkgs; };
              machineConfig = import ./hosts/servers/${name}.nix;
            in
            {
              imports = [
                inputs.declarative-jellyfin.nixosModules.default
                inputs.disko.nixosModules.disko
                inputs.headplane.nixosModules.headplane
                inputs.nixos-mailserver.nixosModules.mailserver
                inputs.sops-nix.nixosModules.sops
                nixosModules.bandcamp-collection-downloader
                nixosModules.namespaced-vpn
                nixosModules.storagebox
                nixosModules.wrtagweb

                ./hosts/servers/common.nix

                diskConfig
                machineConfig
              ];

              deployment =
                let
                  hostname = if name == "mail-01" then "mail" else name;
                in
                {
                  targetHost = "${hostname}.escapeangle.com";
                  targetPort = 22;
                  targetUser = "root";
                  buildOnTarget = true;
                };
            }
          );
        in
        colmena.lib.makeHive (
          {
            meta = {
              nixpkgs = import nixpkgs {
                system = "aarch64-linux";
                config.allowUnfree = true;
                overlays = [
                  overlays.unstable-packages
                  inputs.headplane.overlays.default
                ];
              };
            };
          }
          // colmenaConfig
        );
    };
}
