{
  # Snowfall Lib provides a customized `lib` instance with access to your flake's library
  # as well as the libraries available from your flake's inputs.
  lib,
  # An instance of `pkgs` with your overlays and packages applied is also available.
  pkgs,
  # You also have access to your flake's inputs.
  inputs,

  # Additional metadata is provided by Snowfall Lib.
  namespace, # The namespace used for your flake, defaulting to "internal" if not set.
  system, # The system architecture for this host (eg. `x86_64-linux`).
  target, # The Snowfall Lib target for this system (eg. `x86_64-iso`).
  format, # A normalized name for the system target (eg. `iso`).
  virtual, # A boolean to determine whether this system is a virtual target using nixos-generators.
  systems, # An attribute map of your defined hosts.

  # All other arguments come from the system system.
  config,
  ...
}:
{
  imports = [ ./hardware-configuration.nix ];

  # nix.buildMachines = [
  #   {
  #     hostName = "192.168.3.118";
  #     system = "x86_64-linux";
  #     protocol = "ssh";
  #     # if the builder supports building for multiple architectures,
  #     # replace the previous line by, e.g.
  #     # systems = ["x86_64-linux" "aarch64-linux"];
  #     maxJobs = 4;
  #     speedFactor = 3;
  #     supportedFeatures = [
  #       "nixos-test"
  #       "benchmark"
  #       "big-parallel"
  #       "kvm"
  #     ];
  #     mandatoryFeatures = [ ];
  #   }
  # ];
  # nix.distributedBuilds = true;
  # optional, useful when the builder has a faster internet connection than yours
  # nix.extraOptions = "  builders-use-substitutes = true\n";

  modules = {
    # Bootloader
    system.boot.efi.enable = true;
    system.battery.enable = true;

    nixos.home.enable = true;
  };
  system.nix.enable = true;

  suites.desktop.enable = true;
  suites.development.enable = true;
  suites.editing.enable = true;

  # TODO: not used by iogamaster
  boot.supportedFilesystems = [
    "btrfs"
    "ntfs"
    "nfs"
    "cifs"
  ];

  networking.hostName = "aspi";
  # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant.
  networking.networkmanager.enable = true;

  # For network topology
  topology.self.hardware.info = "Aspire 3";
  networking.interfaces.wlp0s20f3 = {
    name = "wlp0s20f3";
    useDHCP = true;
  };
  networking.interfaces.enp1s0 = {
    name = "enp1s0";
    useDHCP = true;
  };

  # # Set your time zone.
  # time.timeZone = "Europe/Berlin";

  # # Set location used by redshift
  # location.provider = "manual";
  # location.latitude = 47.92;
  # location.longitude = 10.12;

  # modules = {
  #   locales.enable = true;
  #   # greetd.enable = true;
  # };

  # nix.settings.auto-optimise-store = true;
  # nix.settings.experimental-features = [
  #   "nix-command"
  #   "flakes"
  # ];

  # # Setup binary caches
  # nix.settings = {
  #   substituters = [
  #     "https://nix-community.cachix.org"
  #     "https://cache.nixos.org/"
  #     "https://hyprland.cachix.org"
  #   ];
  #   trusted-public-keys = [
  #     "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
  #     "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="
  #   ];
  # };

  # # Enable the X11 windowing system.
  # hardware.opengl.enable = true;

  # nix.gc = {
  #   automatic = true;
  #   dates = "weekly";
  #   options = "--delete-older-than 30d";
  # };

  # # Enable the XFCE Desktop Environment.
  # services.xserver.displayManager.gdm.enable = true;
  # security.pam.services.gdm.enableGnomeKeyring = true;

  # # services.displayManager.sddm.wayland.enable = true;
  # # services.xserver.desktopManager = {
  # #   xterm.enable = false;
  # #   xfce = {
  # #     enable = true;
  # #     noDesktop = true;
  # #     enableXfwm = false;
  # #   };
  # # };
  # # services.xserver.displayManager.gdm.enable = true;
  # # services.xserver.windowManager.i3.enable = true;
  # # services.xserver.windowManager.i3.package = pkgs.i3-gaps;

  # programs.hyprland.enable = true;
  # programs.hyprland.xwayland.enable = true;

  # # Configure keymap in X11
  # services.xserver = {
  #   enable = true;
  #   xkb.layout = "de";
  #   xkb.variant = "";
  # };

  # # Configure console keymap
  # console.keyMap = "de";

  # # Enable sound with pipewire.
  # sound.enable = true;
  # hardware.pulseaudio.enable = false;
  # security.polkit.enable = true;

  # systemd = {
  #   user.services.polkit-gnome-authentication-agent-1 = {
  #     description = "polkit-gnome-authentication-agent-1";
  #     wantedBy = [ "graphical-session.target" ];
  #     wants = [ "graphical-session.target" ];
  #     after = [ "graphical-session.target" ];
  #     serviceConfig = {
  #       Type = "simple";
  #       ExecStart = "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1";
  #       Restart = "on-failure";
  #       RestartSec = 1;
  #       TimeoutStopSec = 10;
  #     };
  #   };
  # };

  # security.pam.services.hyprlock = { };

  # # Sound
  # security.rtkit.enable = true;
  # services.pipewire = {
  #   enable = true;
  #   alsa.enable = true;
  #   alsa.support32Bit = true;
  #   pulse.enable = true;
  #   jack.enable = true;
  # };

  # # Enable touchpad support (enabled default in most desktopManager).
  # services.xserver.libinput.enable = true;

  # # Define a user account. Don't forget to set a password with ‘passwd’.
  # users.users.julian = {
  #   isNormalUser = true;
  #   description = "Julian";
  #   uid = 1000;
  #   group = "julian";
  #   shell = pkgs.fish;
  #   extraGroups = [
  #     "networkmanager"
  #     "wheel"
  #     "docker"
  #   ];
  # };

  # # home-manager.useGlobalPkgs = true; # make overlays for nixpkgs work for home-manager, not only the system
  # # home-manager.useUserPackages = true;

  # programs.fish.enable = true;

  # programs.nix-ld.enable = true;

  # users.groups.julian = {
  #   gid = 1000;
  # };

  # programs.seahorse.enable = true;
  # services.gnome.gnome-keyring.enable = true;

  # # systemd.services."wg-quick@julian".enable = true;
  # # networking.wireguard.enable = true;

  # # This interface is started on boot / switch
  # networking.wg-quick.interfaces = {
  #   julian = {
  #     configFile = "/etc/wireguard/julian.conf";
  #   };
  # };

  # # List services that you want to enable:
  # # Enable the OpenSSH daemon.
  # services.openssh.enable = false;

  # services.syncthing.enable = true;
  # services.syncthing.user = "julian";
  # services.syncthing.group = "julian";
  # #services.syncthing.key = config.sops.secrets."aspi/syncthing/key".path;
  # #services.syncthing.cert = config.sops.secrets."aspi/syncthing/cert".path;
  # # overrideDevices = true; # overrides any devices added or deleted through the WebUI
  # # overrideFolders = true; # overrides any folders added or deleted through the WebUI
  # # settings = {
  # #   devices = {
  # #     "device1" = {
  # #       id = "DEVICE-ID-GOES-HERE";
  # #     };
  # #     "device2" = {
  # #       id = "DEVICE-ID-GOES-HERE";
  # #     };
  # #   };
  # #   folders = {
  # #     "Documents" = {
  # #       # Name of folder in Syncthing, also the folder ID
  # #       path = "/home/myusername/Documents"; # Which folder to add to Syncthing
  # #       devices = [
  # #         "device1"
  # #         "device2"
  # #       ]; # Which devices to share the folder with
  # #     };
  # #     "Example" = {
  # #       path = "/home/myusername/Example";
  # #       devices = [ "device1" ];
  # #       ignorePerms = false; # By default, Syncthing doesn't sync file permissions. This line enables it for this folder.
  # #     };
  # #   };
  # # };

  # # x11 only, for wayland use gammastep (home-manager)
  # # services.redshift.enable = true;

  # services.flatpak.enable = true;

  # xdg.portal.enable = true;
  # xdg.portal.extraPortals = [
  #   pkgs.xdg-desktop-portal-gtk
  #   pkgs.xdg-desktop-portal-hyprland
  # ];

  # # services.emacs.enable = true;

  # # services.gnome.gnome-keyring.enable = true;

  # # List packages installed in system profile. To search, run:
  # # $ nix search wget

  # # Packages needed as root
  # environment.systemPackages = with pkgs; [
  #   vim
  #   htop
  #   mc
  #   xorg.xhost
  #   kdePackages.qtwayland
  #   frajul.pulseaudio-popup
  #   gparted-xhost # needs to be installed as system package so it can be actually opened
  # ];

  # virtualisation.docker.enable = true;

  # virtualisation.virtualbox.host.enable = true;
  # # virtualisation.virtualbox.host.enableExtensionPack = true;
  # # virtualisation.virtualbox.guest.enable = true;
  # # virtualisation.virtualbox.guest.x11 = true;
  # users.extraGroups.vboxusers.members = [ "julian" ];

  # Some programs need SUID wrappers, can be configured further or are
  # started in user sessions.
  # programs.mtr.enable = true;
  # programs.gnupg.agent = {
  #   enable = true;
  #   enableSSHSupport = true;
  # };

  # Open ports in the firewall.
  # networking.firewall.allowedTCPPorts = [ ... ];
  # networking.firewall.allowedUDPPorts = [ ... ];
  # Or disable the firewall altogether.
  # networking.firewall.enable = false;

  # ======================== DO NOT CHANGE THIS ========================
  system.stateVersion = "24.05";
  # ======================== DO NOT CHANGE THIS ========================
}
