{ inputs, lib, config, pkgs, userName, ... }:
  let
    unstable = import inputs.nixpkgs-unstable { system = "x86_64-linux"; config.allowUnfree = true; };
  in
{
    options.niriwm = {
        enable = lib.mkEnableOption "Enable niri window manager.";
        useNonFree = lib.mkOption {
            default = false;
            example = true;
            description = "Whether to enable non-free software in the niri config";
        };
        systemPackages = lib.mkOption {
            default = [];
            description = "Add any additional packages desired. Merged with sway defaults.";
        };

    };

    ###
    ##  Configuration
    ###
    config = lib.mkIf config.niriwm.enable {

        #programs.dconf.enable = true;
        #programs.sway.enable = true;
        #programs.sway.wrapperFeatures.gtk = true;

        nixpkgs.config.allowUnfree = config.niriwm.useNonFree;
        
        ###
        ##  XDG portal setup
        ###
        xdg.portal = {
            config = {
                common = {
                  default = [
                    "wlr"
                  ];
                };
            };
            extraPortals = with pkgs; [
                # xdg-desktop-portal-kde
                xdg-desktop-portal-gnome
            ];
            #wlr.enable = true;
            enable = true;
        };
        xdg.sounds.enable = true;

        ###
        ##  System Packages
        ###
        environment.systemPackages = with pkgs; lib.lists.flatten [
             [
                bash
                foot
                git
                glib # gsettings
                grim
                #sway-contrib.grimshot
                libnotify
                mako
                man-pages
                man-pages-posix
                ncspot
                networkmanagerapplet
                #unstable.niri
                pavucontrol
                slurp
                syncthingtray
                swaylock
                #swayidle
                #swaybg
                # swww
                #tailscale-systray
                wl-clipboard
                waybar
                wdisplays
                wofi
                xdg-utils
                zsh
                lxqt.lxqt-policykit
                # Fonts
             ]
            config.niriwm.systemPackages
        ];
        environment.variables.QT_STYLE_OVERRIDE = "kvantum";

        # adds additional man pages
        documentation.dev.enable = true;

        # Thunar config
        programs.thunar = {
            enable = true;
            plugins = with pkgs.xfce; [
                thunar-archive-plugin
                thunar-volman
            ];
        };
        programs.file-roller.enable = true;
        programs.xfconf.enable = true;

        programs.zsh.enable = true;
        #programs.steam.enable = config.swaywm.installGaming;
        #programs.gamemode.enable = true;

        #programs.adb.enable = true;
        #programs.kdeconnect.enable = true;
        # service file to start the sshAgent
        #programs.ssh.startAgent = true;

        ###
        ##  Services
        ###
        virtualisation.docker.enable = true;
        services.blueman.enable = true;
        #services.flatpak.enable = true;
        services.gvfs.enable = true;  # thunar mount, trash, etc
        services.tumbler.enable = true; # thunar thumbnails
        services.openssh.enable = true;
        services.dbus.enable = true;
        #services.syncthing.enable = true;
        services.gnome.gnome-keyring.enable = true;
        #services.usbmuxd.enable = true;
        #services.tailscale = {
        #    enable = true;
        #    openFirewall = true;
        #};
        # For betaflight configurator
        #services.udev.extraRules = ''
            # DFU (Internal bootloader for STM32 and AT32 MCUs)
        #    SUBSYSTEM=="usb", ATTRS{idVendor}=="2e3c", ATTRS{idProduct}=="df11", MODE="0664", GROUP="dialout"
        #    SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", MODE="0664", GROUP="dialout"
        #'';
        # For yubioath desktop
        services.pcscd.enable = true;
        # Audio
        security.rtkit.enable = true;
        services.pipewire = {
          enable = true;
          alsa.enable = true;
          pulse.enable = true;
          wireplumber.enable = true;
        };
        sound.enable = false;

        ###
        ##  Misc
        ###
        # Necessary for home-manager sway setup
        security.polkit.enable = true;

        #services.greetd = {
        #  enable = true;
        #  settings = rec {
        #    initial_session = {
        #      command = "${pkgs.sway}/bin/sway";
        #      user = "nate";
        #    };
        #    default_session = initial_session;
        #  };
        #};

        # services.xserver.videoDrivers = [ "amdgpu" ];
        # Enable HIP
        #systemd.tmpfiles.rules = [
        #    "L+    /opt/rocm/hip   -    -    -     -    ${pkgs.rocmPackages.clr}"
        #];
        hardware.bluetooth.enable = true; # enables support for Bluetooth
        hardware.bluetooth.powerOnBoot = true; # powers up the default Bluetooth controller on boot
        #hardware.opengl = {
            # Mesa
            # enable = true;
            # Vulkan
            # driSupport = true;
            # Rocm support and vulkan drivers
        #    extraPackages = with pkgs; [
        #        rocmPackages.clr.icd
        #    ];
        #};
    };
}