{
    inputs = {
        nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
        home-manager = {
            url = "github:nix-community/home-manager";
            inputs.nixpkgs.follows = "nixpkgs";
        };
        nixos-06cb-009a-fingerprint-sensor = {
            url = "github:ahbnr/nixos-06cb-009a-fingerprint-sensor";
            inputs.nixpkgs.follows = "nixpkgs";
        };
        hyprland = {
            type = "git";
            url = "https://github.com/hyprwm/Hyprland";
            submodules = true;
        };
        hyprsplit = {
            type = "git";
            url = "https://github.com/shezdy/hyprsplit";
            inputs.hyprland.follows = "hyprland";
        };
        nur.url = "github:nix-community/NUR";
        ags.url = "github:aylur/ags/v1";
        fzgo.url = "git+https://git.thomasave.be/thomasave/fzgo.git";
        worktimer = {
            type = "git";
            url = "https://git.thomasave.be/thomasave/WorkTimer";
            ref = "cli";
        };
    };

    outputs = { nixpkgs, home-manager, nur, ... }@inputs:
        let
            system = "x86_64-linux";
            pkgs = nixpkgs.legacyPackages.${system};
            commonModules = host: user: [
                ./hosts/${host}/hardware-configuration.nix
                { nixpkgs.overlays = [
                    nur.overlay
                    (self: super: { utillinux = super.util-linux; })
                ]; }
                {
                    nixpkgs.config.allowUnfree = true;
                    networking.hostName = host;
                    boot.loader.systemd-boot.enable = true;
                    time.timeZone = "Europe/Brussels";

                    programs.hyprland = {
                        enable = true;
                        package = inputs.hyprland.packages.${pkgs.system}.hyprland;
                    };
                    nix.settings = {
                        substituters = [
                            "https://hyprland.cachix.org"
                            "https://nix-community.cachix.org"
                            "https://cuda-maintainers.cachix.org"
                        ];
                        trusted-public-keys = [
                            "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="
                            "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
                            "cuda-maintainers.cachix.org-1:0dq3bujKpuEPMCX6U4WylrUDZ9JyUG0VpVZa7CNfq5E="
                        ];
                        experimental-features = [ "nix-command" "flakes" ];
                        trusted-users = [ "root" user ];
                        auto-optimise-store = true;
                    };

                    nix.gc = {
                        automatic = true;
                        dates = "daily";
                        options = "--delete-older-than 2d";
                    };


                    users.users.${user} = {
                        isNormalUser = true;
                        extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user.
                        openssh.authorizedKeys.keys = [
                            "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKAa3tMzSCRuprEACrBsKI0F/o73o6J9L1qR3TaZn/N8 user@Kell"
                            "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIByLwLAdJbmoDV5sx4hg5NbzKbOh1GmWEhDOUJ1GQBhK user@Riva"
                            "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBxMq4kubz4wWr4S8xU3GRkPcn6XRS3y7IP+qylN5QAp user@Aloria"
                            "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOAhFTJI49o+eS1kHs5XRrpCLLuhAE+JUCffusudyR88 user@Arendia"
                            "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHtzTFdvLEvXpv69qAWLTipl4hgsKgRrRrWJRecsFthG user@Arch"
                            "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOxtJRtlAphl8euicVUR/6C7o+tyhpYmcbMBLHnldEIX server@mallorea"
                            "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILazQU/Y9I5PkMZoG/Lzc6mDR7s+aRHzqJoFUhYSse4P PocoF1"
                            "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFoUYcVMsDw6tmjfdOuQkwaXx8fohKJs/6/5HoLzTP6x Tablet"
                        ];
                        shell = pkgs.zsh;
                    };

                    system.stateVersion = "23.11";
                    environment.sessionVariables.NIXOS_OZONE_WL = "1"; # hint electron apps to use wayland:
                }
                home-manager.nixosModules.home-manager
                {
                    home-manager = {
                        extraSpecialArgs = {
                            inherit inputs;
                        }; # allows access to flake inputs in hm modules
                        useGlobalPkgs = true;
                        useUserPackages = true;
                        users.${user} = { imports = [ ./home/${host}.nix ]; };
                    };
                }
                ./hosts/${host}
            ];
            mkSystem = host: cfg:
                nixpkgs.lib.nixosSystem {
                    system = cfg.system or "x86_64-linux";
                    modules = (commonModules host cfg.user) ++ (cfg.modules or [ ]);
                    specialArgs = inputs;
                };
            systems = {
                Riva = { user = "user"; };
                Kell = { user = "user"; };
                Aloria = { user = "user"; };
                Arendia = { user = "user"; };
            };
        in
            { nixosConfigurations = nixpkgs.lib.mapAttrs mkSystem systems; };
}