{
  description = "Nixos system config";

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

    # inputs for following
    systems = {
      url = "github:nix-systems/x86_64-linux"; # only evaluate for this system
    };
    poetry2nix = {
      url = "github:nix-community/poetry2nix";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        flake-utils.follows = "flake-utils";
      };
    };
    gitignore = {
      url = "github:hercules-ci/gitignore.nix";
      inputs = {
        nixpkgs.follows = "nixpkgs";
      };
    };
    beautysh = {
      url = "github:lovesegfault/beautysh";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        poetry2nix.follows = "poetry2nix";
        utils.follows = "flake-utils";
      };
    };
    pre-commit-hooks = {
      url = "github:cachix/pre-commit-hooks.nix";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        flake-utils.follows = "flake-utils";
        flake-compat.follows = "flake-compat";
        nixpkgs-stable.follows = "nixpkgs_stable_release";
        gitignore.follows = "gitignore";
      };
    };
    nixNeovimPlugins = {
      url = "github:soispha/nixNeovimPlugins";
      inputs = {
        flake-utils.follows = "flake-utils";
        nixpkgs.follows = "nixpkgs";
        poetry2nix.follows = "poetry2nix";
      };
    };
    flake-compat = {
      url = "github:edolstra/flake-compat";
      flake = false;
    };
    crane = {
      url = "github:ipetkov/crane";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        flake-compat.follows = "flake-compat";
        flake-utils.follows = "flake-utils";
        rust-overlay.follows = "rust-overlay";
      };
    };
    flake-utils = {
      url = "github:numtide/flake-utils";
      inputs = {
        systems.follows = "systems";
      };
    };
    rust-overlay = {
      url = "github:oxalica/rust-overlay";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        flake-utils.follows = "flake-utils";
      };
    };

    # nixos modules
    home-manager = {
      url = "github:nix-community/home-manager/master";
      inputs = {
        nixpkgs.follows = "nixpkgs";
      };
    };
    disko = {
      url = "github:nix-community/disko";
      inputs = {
        nixpkgs.follows = "nixpkgs";
      };
    };
    nixNeovim = {
      url = "github:nixNeovim/nixNeovim";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        flake-utils.follows = "flake-utils";
        home-manager.follows = "home-manager";
        nixneovimplugins.follows = "nixNeovimPlugins";
      };
    };
    nixVim = {
      url = "github:nix-community/nixvim";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        flake-utils.follows = "flake-utils";
        pre-commit-hooks.follows = "pre-commit-hooks";
        beautysh.follows = "beautysh";
      };
    };
    agenix = {
      url = "github:ryantm/agenix";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        home-manager.follows = "home-manager";
      };
    };
    ragenix = {
      url = "github:yaxitech/ragenix";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        agenix.follows = "agenix";
        flake-utils.follows = "flake-utils";
        rust-overlay.follows = "rust-overlay";
        crane.follows = "crane";
      };
    };
    impermanence = {
      url = "github:nix-community/impermanence";
      inputs = {
      };
    };
    nixos-generators = {
      url = "github:nix-community/nixos-generators";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    serverphone = {
      url = "git+https://codeberg.org/vhack.eu/serverphone.git";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        systems.follows = "systems";
        flake-compat.follows = "flake-compat";
        flake-utils.follows = "flake-utils";
        rust-overlay.follows = "rust-overlay";
        crane.follows = "crane";
      };
    };
    lanzaboote = {
      url = "github:nix-community/lanzaboote/v0.3.0";
      inputs = {
        nixpkgs.follows = "nixpkgs-stable";
        flake-compat.follows = "flake-compat";
        flake-utils.follows = "flake-utils";
        crane.follows = "crane";
        rust-overlay.follows = "rust-overlay";
        pre-commit-hooks-nix.follows = "pre-commit-hooks";
      };
    };

    # my configs
    neovim_config = {
      url = "git+https://codeberg.org/soispha/neovim-config.git";
      flake = false;
    };
    templates = {
      url = "git+https://codeberg.org/soispha/flake-templates.git";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        flake-utils.follows = "flake-utils";
        systems.follows = "systems";
      };
    };

    # my bins
    grades = {
      url = "git+https://codeberg.org/soispha/grades.git";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        crane.follows = "crane";
        flake-utils.follows = "flake-utils";
        rust-overlay.follows = "rust-overlay";
      };
    };
    video_pause = {
      url = "git+https://codeberg.org/soispha/video-pause.git";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        crane.follows = "crane";
        flake-utils.follows = "flake-utils";
      };
    };
    strip_js_comments = {
      url = "git+https://codeberg.org/ene/strip_js_comments.git";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        crane.follows = "crane";
        flake-utils.follows = "flake-utils";
      };
    };
    generate_firefox_extensions = {
      url = "git+https://codeberg.org/soispha/generate_firefox_extension.git";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        crane.follows = "crane";
        flake-utils.follows = "flake-utils";
        rust-overlay.follows = "rust-overlay";
      };
    };
    shell_library = {
      url = "git+https://codeberg.org/soispha/shell_library.git";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        flake-utils.follows = "flake-utils";
        systems.follows = "systems";
        flake_version_update.follows = "flake_version_update";
      };
    };
    river_init_lesser = {
      url = "git+https://codeberg.org/soispha/river_keymap_init.git";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        crane.follows = "crane";
        flake-utils.follows = "flake-utils";
        rust-overlay.follows = "rust-overlay";
        flake-compat.follows = "flake-compat";
      };
    };
    yambar_cpu = {
      url = "git+https://codeberg.org/soispha/yambar_cpu.git";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        crane.follows = "crane";
        flake-utils.follows = "flake-utils";
      };
    };
    yambar_memory = {
      url = "git+https://codeberg.org/soispha/yambar_memory.git";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        crane.follows = "crane";
        flake-utils.follows = "flake-utils";
      };
    };
    flake_update = {
      url = "git+https://codeberg.org/soispha/flake_update.git";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        systems.follows = "systems";
        flake-utils.follows = "flake-utils";
        shell_library.follows = "shell_library";
        flake_version_update.follows = "flake_version_update";
      };
    };
    flake_version_update = {
      url = "git+https://codeberg.org/soispha/flake_version_update.git";
      inputs = {
        systems.follows = "systems";
        nixpkgs.follows = "nixpkgs";
        flake-utils.follows = "flake-utils";
      };
    };

    # external resources
    user_js = {
      url = "github:arkenfox/user.js";
      flake = false;
    };
    snap-sync = {
      url = "github:qubidt/snap-sync";
      flake = false;
    };
  };

  outputs = {
    # core
    self,
    nixpkgs,
    # modules
    home-manager,
    nixos-generators,
    impermanence,
    agenix,
    ragenix,
    serverphone,
    disko,
    lanzaboote,
    nixNeovim,
    nixVim,
    # external dependencies
    neovim_config,
    user_js,
    snap-sync,
    templates,
    # my binaries
    video_pause,
    strip_js_comments,
    generate_firefox_extensions,
    shell_library,
    river_init_lesser,
    yambar_memory,
    yambar_cpu,
    grades,
    flake_update,
    ...
  }: let
    sysLib = shell_library.lib.${system};
    system = "x86_64-linux";
    pkgs = import nixpkgs (import ./system/nixpkgs {
      inherit (nixpkgs) lib;
      inherit system;
      overlays = [nixNeovim.overlays.default];
    });
    # FIXME this `nixpkgs` misses the configs applied to the other one
    nixpkgs_as_input = nixpkgs;
    outputs = import ./flake {
      inherit
        # core
        self
        pkgs
        system
        sysLib
        nixpkgs_as_input
        # modules
        
        home-manager
        nixNeovim
        nixVim
        nixos-generators
        impermanence
        agenix
        ragenix
        serverphone
        disko
        lanzaboote
        # external dependencies
        
        neovim_config
        user_js
        snap-sync
        templates
        # my binaries
        
        video_pause
        strip_js_comments
        generate_firefox_extensions
        shell_library
        river_init_lesser
        yambar_memory
        yambar_cpu
        grades
        flake_update
        ;
    };
  in
    outputs;
}