{
  inputs = {
    nixpkgs.url = "git+https://github.com/nixos/nixpkgs?ref=release-24.05";
    nixpkgs-unstable.url = "git+https://github.com/nixos/nixpkgs?ref=nixpkgs-unstable";
    nixpkgs-master.url = "git+https://github.com/nixos/nixpkgs?ref=master";

    darwin.url = "git+https://github.com/lnl7/nix-darwin";
    darwin.inputs.nixpkgs.follows = "nixpkgs";

    deploy-rs.url = "git+https://github.com/serokell/deploy-rs?ref=master";
    deploy-rs.inputs.nixpkgs.follows = "nixpkgs";

    agenix.url = "git+https://github.com/ryantm/agenix";
    agenix.inputs.nixpkgs.follows = "nixpkgs";

    home-manager.url = "git+https://github.com/nix-community/home-manager?ref=release-24.05";
    home-manager.inputs.nixpkgs.follows = "nixpkgs";

    naersk.url = "git+https://github.com/nix-community/naersk";
    naersk.inputs.nixpkgs.follows = "nixpkgs";

    microvm.url = "git+https://github.com/astro/microvm.nix";
    microvm.inputs.nixpkgs.follows = "nixpkgs";


    # hefe-internal.url = "git+ssh://gitea@git.emile.space/hanemile/hefe-internal.git?ref=main";

    # nix registry add flake:mylocalrepo git+file:///path/to/local/repo
    # nix registry list
    # hefe-internal.url = "flake:mylocalrepo";
    # hefe-internal.url = "git+file:///Users/emile/hefe-internal";
    hefe-internal.url = "git+ssh://git@git.emile.space/hefe-internal";
  };

  outputs =
    {
      self,
      nixpkgs, # packages
      nixpkgs-unstable, # unstable branch
      nixpkgs-master, # master branch
      darwin, # darwin related stuff
      deploy-rs, # deploy the hosts
      agenix, # store secrets crypted using age
      home-manager, # manage my home envs
      naersk, # build rust stuff
      hefe-internal, # internal tooling
      microvm, # microvms
      ...
    }@inputs:
    let
      lib = import ./nix/lib inputs;
      helper = lib.flake-helper;
    in
    {

      hosts = {
        caladan = {
          system = "aarch64-darwin";
          sshUser = "hydra";
          homeManagerEnable = true;
          description = "macbook air";
          # nix run https://github.com/LnL7/nix-darwin/archive/master.tar.gz -- switch --flake .#caladan
        };
        corrino = {
          system = "x86_64-linux";
          ip = "corrino";
          description = "Hetzner AX41 dual 512GB NVME";
          modules = [ hefe-internal.nixosModules.corrino ];
          microvms = true;
          # unstable = true;
        };
        chusuk = {
          # ip = "chusuk.pinto-pike.ts.net";
          system = "x86_64-linux";
          description = "lenovo t480";
        };
        hacknix = {
          # ip = "hacknix.pinto-pike.ts.net"; # clone repo and deploy within
          system = "x86_64-linux";
          description = "hacking vm";
        };
        mail = {
          # ip = "mail.pinto-pike.ts.net"; # clone repo and deploy within
          system = "x86_64-linux";
          description = "mail server";
        };

        #kolhar = {}; # nixos vm on caladan
        #hagal = {}; # apple tv

        lampadas = {
          system = "x86_64-linux"; # 4c4t (intel n100), 32GB RAM
          description = "NAS";
        };
        # palma = {
        #   description = "palma bmc";
        # };

        lernaeus = {
          system = "x86_64-linux"; # 8c16t (AMD ryzen 5 5600g), 32GB RAM
          description = "VM Host";
        };
        # parmentier = {
        #   description = "lernaeus bmc";
        # };

        # lankiveil = {
        #   system = "x86_64-linux"; # ???, ???, RTX A2000
        #   description = "";
        # };
        # poritrin = {
        #   description = "lankiveil bmc";
        # };

        # kaitain = {};
        # ecaz = {};
        # gamont = {};

        # futher names: https://neoencyclopedia.fandom.com/wiki/List_of_Dune_planets
        # Muritan
        # Naraj
        # Palma
        # Parmentier
        # Poritrin
        # Richese
        # Romo
        # Rossak
        # Sikun
        # Synchrony
        # Tleilax
        # Tupile
        # Zanovar
      };

      nixosConfigurations = helper.mapToNixosConfigurations self.hosts;
      darwinConfigurations = helper.mapToDarwinConfigurations self.hosts;

      nixosModules = {
        x86_64-linux = import ./nix/modules/x86_64-linux.nix;
        default = self.nixosModules.x86_64-linux;
      };

      overlays = {
        emile = import ./nix/pkgs/overlay.nix;

        x86_64-linux = import ./nix/pkgs/x86_64-linux.nix;
        aarch64-darwin = import ./nix/pkgs/aarch64-darwin.nix;

        default = self.overlays.x86_64-linux;

        unstable = final: prev: {
          unstable = import nixpkgs-unstable {
            system = "x86_64-linux";
            config.allowUnfree = true;
          };
        };
      };

      deploy.nodes = helper.mapToDeployRsConfiguration self.hosts;
      deploy.autoRollback = true;

      packages =
        nixpkgs.lib.genAttrs
          [
            "x86_64-linux"
            "aarch64-darwin"
          ]
          (
            system:
            let
              pkgs = import nixpkgs {
                inherit system;
                overlays = [

                  (
                    if system == "x86_64-linux" then
                      self.overlays.x86_64-linux
                    else if system == "aarch64-darwin" then
                      self.overlays.aarch64-darwin
                    else
                      null
                  )
                  # self.overlays.emile

                  # some arguments for packages
                  (_: _: { inherit naersk; })
                ];
              };
            in
            {
              inherit (pkgs)
                vokobe
                r2wars-web
                # emu-riscv
                # emu-mips
                # emu-x86_64
                ;
            }
          );

      hydraJobs = {
        inherit (self) packages;
        nixosConfigurations = helper.buildHosts self.nixosConfigurations;
      };

      templates = {
        # ; nix nix registry add hefe /Users/emile/Documents/hefe
        # ; nix flake init -t hefe#ctf
        ctf = {
          description = "A basic ctf env with pwn, rev, ... tools";
          path = ./nix/templates/ctf;
          welcomeText = ''
            # A basic CTF env
            ## Intended usage
            The intended usage of this flake is...

            ## More info
            - [Rust language](https://www.rust-lang.org/)
            - [Rust on the NixOS Wiki](https://nixos.wiki/wiki/Rust)
            - ...
          '';
        };
      };

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