{ machine, lib, ... }@inputs:
{

  imports = lib.concatLists [
    [
      ./xdg.nix
      ./nvim
      ./fish
      ./kanata
      ./kitty
      ./tmux
      ./git
      ./jj
      ./niri
      ./zed
      ./firefox
    ]

    (machine.program {
      name = "graphcial-packages";
      inherit inputs;
      requirements = [ "graphical" ];
      home-config =
        { pkgs, ... }:
        {
          home.packages = with pkgs; [
            spotify
            obsidian
            element-desktop
            # chromium
            bind.dnsutils
            mpv
            vlc
            libreoffice-qt
            hunspell
            hunspellDicts.en_US
          ];
        };
    })

    (machine.program {
      name = "discord";
      inherit inputs;
      requirements = [ "graphical" ];
      home-config =
        {
          config,
          pkgs,
          lib,
          ...
        }:
        let
          disableFeatures = [
            "WebRtcAllowInputVolumeAdjustment"
            "ChromeWideEchoCancellation"
          ];
          enableFeatures = [ ];
          commandLineArgs =
            lib.optionals (enableFeatures != [ ]) [
              "--enable-features=${lib.concatStringsSep "," enableFeatures}"
            ]
            ++ lib.optionals (disableFeatures != [ ]) [
              "--disable-features=${lib.concatStringsSep "," disableFeatures}"
            ];
          joinedArgs = lib.concatStringsSep " " commandLineArgs;
        in
        {
          home.file."${config.xdg.configHome}/discord/settings.json".source = pkgs.writeText "settings.json" (
            lib.strings.toJSON (
              let
                endpoint = "https://inject.shelter.uwu.network/shelter+yt_ad_block+yt_embed_fix";
              in
              {
                SKIP_HOST_UPDATE = true;
                MINIMIZE_TO_TRAY = false;
                OPEN_ON_STARTUP = false;
                DANGEROUS_ENABLE_DEVTOOLS_ONLY_ENABLE_IF_YOU_KNOW_WHAT_YOURE_DOING = true;
                enableHardwareAcceleration = true;
                UPDATE_ENDPOINT = endpoint;
                NEW_UPDATE_ENDPOINT = "${endpoint}/";
                BACKGROUND_COLOR = "#2c2d32";

                openasar = {
                  setup = true;
                  # using the performance preset breaks vaapi
                  cmdPreset = "balanced";
                  # quickstart is buggy and breaks discord sometimes.
                  quickstart = false;
                  # this css is made for discord compact mode. if you're not using that, stuff won't align!!
                  css =
                    # css
                    ''
                      /* Hide nitro begging */
                      @import url("https://raw.codeberg.page/AllPurposeMat/Disblock-Origin/DisblockOrigin.theme.css");

                      /* Hide the Visual Refresh title bar */
                      .visual-refresh {
                        /* Hide the bar itself */
                        --custom-app-top-bar-height: 0px !important;

                        /* Title bar buttons are still visible so hide them too */
                        div.base__5e434 > div.bar_c38106 {
                          display: none;
                        }

                        /* Bring the server list down a few pixels */
                        ul[data-list-id="guildsnav"] > div.itemsContainer_ef3116 {
                          margin-top: 8px;
                        }
                      }

                      :root {
                        /* Disblock settings */
                        --display-clan-tags: none;
                        --display-active-now: none;
                        --display-hover-reaction-emoji: none;
                        --bool-show-name-gradients: false;
                      }

                      /* Make "Read All" vencord button text smaller */
                      button.vc-ranb-button {
                        font-size: 9.5pt;
                        font-weight: normal;
                      }

                      /* Hide Discover button */
                      div[data-list-item-id="guildsnav___guild-discover-button"] {
                        display: none !important;
                      }

                      /* Hide voice settings menus in user panel */
                      div[class^="micButtonParent__"] button[role="switch"] {
                        border-radius: var(--radius-sm);
                        & ~ button { display: none; }
                      }
                      /* Also reduce the gap between the buttons */
                      div.container__37e49 > div.buttons__37e49 {
                        gap: 1px;
                      }
                    '';
                };
              }
            )
          );

          home.packages = with pkgs; [
            (discord.override {
              # we disable updates in settings.json
              disableUpdates = false;
              commandLineArgs = joinedArgs;
              withTTS = false;
              enableAutoscroll = true;
              withOpenASAR = true;
            })
          ];
        };
    })

    (machine.program {
      name = "fun-packages";
      inherit inputs;
      requirements = [ "fun" ];
      home-config =
        { pkgs, ... }:
        {
          home.packages = with pkgs; [
            custom.p1n3appl3.tab
            prismlauncher
          ];
        };
    })

    (machine.program {
      name = "cli-packages";
      inherit inputs;
      requirements = [ "cli" ];
      home-config =
        { config, pkgs, ... }:
        {
          home.packages = with pkgs; [
            # general cli tools
            sops
            fzf
            htop
            ncdu
            psmisc
            ripgrep
            rsync
            zoxide
            tmux
            direnv
            atuin
            rcon
            lix
            nix-output-monitor
            wget
            comma
            unzip
            pciutils
            difftastic

            # dev tools
            gdb
            clang-tools
            rustup
            git
            python3
            unixtools.xxd
            net-tools
            sqlite-interactive
            tokei
            just
            uv
            llvmPackages.bintools

            (writeShellScriptBin "nas" ''
              mkdir -p ~/Documents/nas
              ${sshfs}/bin/sshfs fili:/storage/storage/data/ ~/Documents/nas
              cd ~/Documents/nas
            '')
          ];

          # Set up direnv
          programs.direnv = {
            package = pkgs.direnv;
            silent = false;
            nix-direnv = {
              enable = true;
              package = pkgs.nix-direnv;
            };
          };

          home.file = {
            "${config.xdg.configHome}/sqlite3/sqliterc".source = pkgs.writeText ".sqliterc" ''
              .mode box
            '';
          };
        };
    })
  ];
}
