{
  flake-lib,
  inputs,
  inputs',
  self',
  theme,
  stdenv,
  lib,
}: let
  inherit (stdenv) isDarwin isLinux;
  username = flake-lib.const.user;
  darwin-specific = [
    inputs.home-manager.darwinModules.home-manager
    {
      services.nix-daemon.enable = true;
      security.pam.enableSudoTouchIdAuth = true;
      users.users.${username}.home = "/Users/${username}";
    }
  ];
  linux-specific = [
    inputs.home-manager.nixosModules.home-manager
    {
      programs.mosh.enable = true;
      system.stateVersion = "22.05";
      users.users.${username} = {
        isNormalUser = true;
        extraGroups = ["wheel"];
        home = "/home/${username}";
        group = username;
      };
    }
  ];
  # TODO: Make those overridable
  builder =
    if isDarwin
    then inputs.darwin.lib.darwinSystem
    else if isLinux
    then inputs.nixpkgs.lib.nixosSystem
    else throw "Unsupported system";
in
  {
    system ? {},
    user ? {},
  }:
    builder {
      system = stdenv.system;
      modules =
        [
          system
          ({
            lib,
            pkgs,
            ...
          }: {
            _module.args = {
              inherit inputs' self' theme;
              user = username;
              # nix-darwin already declares inputs attribute (thanks nix-darwin)<
              # but since we're passing all flake inputs this should be fine
              inputs = lib.mkForce inputs;
            };

            nix = {
              package = pkgs.nixVersions.stable;

              registry = lib.mapAttrs (_: flake: {inherit flake;}) inputs;

              settings = {
                experimental-features = ["nix-command" "flakes"];
                trusted-users = [username];
              };
            };

            programs.fish.enable = true;
            environment.shells = [pkgs.fish];
            users.users.${username}.shell = pkgs.fish;

            home-manager = {
              useGlobalPkgs = true;
              useUserPackages = true;
              users.${username} = flake-lib.mkHome user;
            };

            time.timeZone = "Europe/Warsaw";
          })
        ]
        ++ (lib.optionals isDarwin darwin-specific)
        ++ (lib.optionals isLinux linux-specific);
    }