{
  # 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.
  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 module system.
  config,
  host,
  ...
}:

with lib;

let
  cfg = config.modules.i3;
in
{
  options.modules.i3 = {
    enable = mkOption { default = false; };
  };

  config = mkIf cfg.enable {
    modules.rofi.enable = true;

    services.dunst.enable = true;

    programs = {
      i3status-rust = {
        enable = true;
      };
    };
    home.packages = with pkgs; [
      nitrogen
      xfce.xfce4-screenshooter
      pulseaudio # For pactl commands
    ];
    xsession.enable = true; # Give gui programs access to sessionVariables
    # Prevent screen from going blank (check these settings with `xset q`)
    # And disable bell sound (b)
    xsession.initExtra = ''
      ${pkgs.xorg.xset}/bin/xset s off
      ${pkgs.xorg.xset}/bin/xset -dpms
      ${pkgs.xorg.xset}/bin/xset b off
    '';
    xsession.windowManager.i3 = {
      enable = true;
      package = pkgs.i3-gaps;
    };

    xsession.importedVariables = [ ];

    # Overwrite default home-manager config file
    xdg.configFile."i3/config".source = lib.mkForce (
      if host == "kardorf" then ./i3/config-kardorf else ./i3/config
    );

    home.file = {
      ".config/i3/scripts" = {
        source = ./i3/scripts;
        recursive = true;
      };
      ".config/i3/workspace-messaging.json".source = ./i3/workspace-chat-element-tele.json;
      ".config/i3status-rust/config.toml".source = ./i3status-rust/config.toml;
    };

    home.sessionPath = [ "/home/julian/.config/i3/scripts" ];
  };
}