{
  description = "Your new nix config";

  inputs = {
    # Nixpkgs
    nixpkgs.url = "github:nixos/nixpkgs/nixos-22.11";
    unstable.url = "github:nixos/nixpkgs/nixos-unstable";
    nixos-hardware.url = "github:NixOS/nixos-hardware/master";

    # Home manager
    home-manager.url = "github:nix-community/home-manager";
    home-manager.inputs.nixpkgs.follows = "nixpkgs";
    hardware.url = "github:nixos/nixos-hardware";

    # Tools
    agenix.url = "github:ryantm/agenix";
    agenix.inputs.nixpkgs.follows = "nixpkgs";
    deploy-rs.url = "github:serokell/deploy-rs";
    deploy-rs.inputs.nixpkgs.follows = "nixpkgs";

    # Packages
    poonam.url = "git+ssh://gitea@git.sealight.xyz/aynish/kitaab?ref=main";
    poonam.inputs.nixpkgs.follows = "nixpkgs";
    basant.url = "git+ssh://gitea@git.sealight.xyz/aynish/basant?ref=main";
    vimwikicli.url = "git+ssh://gitea@git.sealight.xyz/aynish/vimwiki-cli?ref=main";
    basant.inputs.nixpkgs.follows = "nixpkgs";
    basant.inputs.poonam.follows = "poonam";
    vimwikicli.inputs.nixpkgs.follows = "nixpkgs";

    grasp.url = "git+ssh://gitea@git.sealight.xyz/aynish/grasp.git?ref=main";
    grasp.inputs.nixpkgs.follows = "nixpkgs";
    # Matrix
    nix-matrix-appservices.url = "gitlab:coffeetables/nix-matrix-appservices";
    # Others
    nur.url = "github:nix-community/NUR";
    rust-overlay = {
      url = "github:oxalica/rust-overlay";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    eww = {
      url = "github:elkowar/eww";
      inputs.nixpkgs.follows = "nixpkgs";
      inputs.rust-overlay.follows = "rust-overlay";
    };
    tidalcycles.url = "github:mitchmindtree/tidalcycles.nix";
    tidalcycles.inputs.nixpkgs.follows = "unstable";
    llamacpp.url = "github:ggerganov/llama.cpp";
    llamacpp.inputs.nixpkgs.follows = "unstable";
    # TODO hundred rabbits software
    # TODO needs secrets
    # dhyan.url = "git+ssh://gitea@git.sealight.xyz/aynish/dhyan?ref=main";
    # dhyan.inputs.nixpkgs.follows = "nixpkgs";
    # TODO needs secrets
    # muneem.url = "git+ssh://gitea@git.sealight.xyz/aynish/muneem?ref=main";
    # muneem.inputs.nixpkgs.follows = "nixpkgs";
  };

  outputs =
    { self
    , nixpkgs
    , unstable
    , nixos-hardware
    , home-manager
    , deploy-rs
    , agenix
    , basant
    , grasp
    , nix-matrix-appservices
    , nur
    , tidalcycles
    , rust-overlay
    , eww
    , llamacpp
    , vimwikicli
    , ...
    }@inputs:
    let
      forAllSystems = nixpkgs.lib.genAttrs [
        "aarch64-linux"
        "i686-linux"
        "x86_64-linux"
        "aarch64-darwin"
        "x86_64-darwin"
      ];
      unstableOverlay = final: prev: {
        # We already have these in scope
        unstable = unstable.legacyPackages.${prev.system};
        deploy = deploy-rs.packages.${prev.system}.deploy-rs;
      };
      llamaOverlay = final: prev: {
        llama = llamacpp.packages.${prev.system}.default;
      };
      vimwikiOverlay = final: prev: {
        vimwiki-cli = vimwikicli.packages.${prev.system}.vimwiki-cli;
      };

      nixpkgsFor = forAllSystems (system: import nixpkgs {
        inherit system;
        config.allowUnfreePredicate = pkg: builtins.elem (nixpkgs.lib.getName pkg) [
          "ripcord"
          "VCV-Rack"
          "SunVox"
          "renoise"
        ];
        # config.permittedInsecurePackages = [
        #   "python3.10-django-3.1.14" # Needed for archivebox deployments on curve
        #   # Check when archive box updates it's dependeny
        # ];
        overlays = [
          rust-overlay.overlays.default
          tidalcycles.overlays.default
          agenix.overlays.default
          nur.overlay
          nix-matrix-appservices.overlay
          unstableOverlay
          llamaOverlay
          vimwikiOverlay
          self.overlays.additions
          self.overlays.modifications
        ];
      });

      # for when space matters
      litePkgsFor = forAllSystems (system: import nixpkgs {
        inherit system;
        overlays = [
          agenix.overlays.default
          unstableOverlay # Remove once updated to 23.05 (used for microbin on helix)
          tidalcycles.overlays.default # needed for nvim which comes pre-installed lol
        ];
      });
    in
    {
      # Your custom packages
      # Acessible through 'nix build', 'nix shell', etc
      packages = forAllSystems (system:
        let pkgs = nixpkgsFor.${system};
        in import ./pkgs { pkgs = pkgs; }
      );
      # Devshell for bootstrapping
      # Acessible through 'nix develop' or 'nix-shell' (legacy)
      devShells = forAllSystems (system:
        let pkgs = nixpkgsFor.${system};
        in import ./shell.nix { pkgs = pkgs; }
      );

      # Your custom packages and modifications, exported as overlays
      overlays = import ./overlays;
      # Reusable nixos modules you might want to export
      # These are usually stuff you would upstream into nixpkgs
      nixosModules = import ./modules/nixos;
      # Reusable home-manager modules you might want to export
      # These are usually stuff you would upstream into home-manager
      homeManagerModules = import ./modules/home-manager;

      # NixOS configuration entrypoint
      nixosConfigurations = {
        curve = nixpkgs.lib.nixosSystem rec {
          specialArgs = { inherit inputs self; };
          system = "x86_64-linux";
          pkgs = nixpkgsFor.${system};
          modules = [
            ./hosts/curve
            agenix.nixosModules.age
            self.nixosModules.backup
            self.nixosModules.wireguard
            nixos-hardware.nixosModules.lenovo-thinkpad-x270
            home-manager.nixosModules.home-manager
            {
              home-manager.useGlobalPkgs = true;
              home-manager.useUserPackages = true;
              home-manager.users.anish = import ./home/gui;
            }
          ];
        };

        helix = nixpkgs.lib.nixosSystem rec {
          specialArgs = { inherit inputs self; };
          system = "x86_64-linux";
          pkgs = litePkgsFor.${system};
          modules = [
            ./hosts/helix
            agenix.nixosModules.age
            self.nixosModules.backup
            self.nixosModules.wireguard
            self.nixosModules.microbin
          ];
        };

        lituus = nixpkgs.lib.nixosSystem rec {
          specialArgs = { inherit inputs self; };
          system = "x86_64-linux";
          pkgs = nixpkgsFor.${system};
          modules = [
            ./hosts/lituus
            agenix.nixosModules.age
            self.nixosModules.backup
            self.nixosModules.hesienbridge
            nix-matrix-appservices.nixosModule
            home-manager.nixosModules.home-manager
            {
              home-manager.useGlobalPkgs = true;
              home-manager.useUserPackages = true;
              home-manager.users.anish = import ./home/core;
            }
          ];
        };

        cube = nixpkgs.lib.nixosSystem rec {
          specialArgs = { inherit inputs self; };
          system = "x86_64-linux";
          pkgs = litePkgsFor.${system};
          modules = [
            ./hosts/cube
            agenix.nixosModules.age
            self.nixosModules.backup
            self.nixosModules.wireguard
            basant.nixosModule
          ];
        };

        box = nixpkgs.lib.nixosSystem rec {
          specialArgs = { inherit inputs self; };
          system = "x86_64-linux";
          pkgs = nixpkgsFor.${system};
          modules = [
            ./hosts/box
            agenix.nixosModules.age
            self.nixosModules.backup
            self.nixosModules.wireguard
            self.nixosModules.wallabag
            self.nixosModules.gonic
            self.nixosModules.ulogger-server
            self.nixosModules.photoprism
            grasp.nixosModule
            home-manager.nixosModules.home-manager
            {
              home-manager.useGlobalPkgs = true;
              home-manager.useUserPackages = true;
              home-manager.users.anish = import ./home/core;
            }
          ];
        };
      };

      # Standalone home-manager configuration entrypoint
      # Available through 'home-manager --flake .#your-username@your-hostname'
      homeConfigurations = {
        "anish@work" = home-manager.lib.homeManagerConfiguration {
          pkgs = nixpkgsFor."x86_64-linux"; # Home-manager requires 'pkgs' instance
          extraSpecialArgs = { inherit inputs; };
          modules = [
            ./home/core.nix
            ./home/profiles/firefox
          ];
        };
      };

      deploy.nodes = {
        box = {
          hostname = "mossnet.lan";
          autoRollback = false;
          profiles.system = {
            user = "root";
            path = deploy-rs.lib.x86_64-linux.activate.nixos self.nixosConfigurations.box;
          };
        };
        lituus = {
          hostname = "sealight.xyz";
          # autoRollback = false;
          profiles.system = {
            user = "root";
            path = deploy-rs.lib.x86_64-linux.activate.nixos self.nixosConfigurations.lituus;
          };
        };
        helix = {
          hostname = "git.sealight.xyz";
          # autoRollback = false;
          profiles.system = {
            user = "root";
            path = deploy-rs.lib.x86_64-linux.activate.nixos self.nixosConfigurations.helix;
          };
        };
        cube = {
          hostname = "lakhwara.com";
          profiles.system = {
            user = "root";
            path = deploy-rs.lib.x86_64-linux.activate.nixos self.nixosConfigurations.cube;
          };
        };
      };

      checks = builtins.mapAttrs (system: deployLib: deployLib.deployChecks self.deploy) deploy-rs.lib;
    };
}
