{
  config,
  pkgs,
  lib,
  inputs,
  ...
}:

with lib;
let
  nixGL = config.lib.nixGL.wrap;
  electronFlags = "--enable-features=UseOzonePlatform --ozone-platform=wayland --enable-wayland-ime --disable-gpu-shader-disk-cache -n";
in
{
  config = {
    nixpkgs.overlays = [
      (_: prev: {
        quickemu = prev.quickemu.overrideAttrs (old: {
          patches = (old.patches or [ ]) ++ [ ./../patches/quickemu.patch ];
        });
      })
    ];

    home.packages =
      with pkgs;
      [
        up
        htop
        rustc
        cargo
        nixfmt-rfc-style
        nodejs
        bun
        deno
        devbox
        tldr
        flutter
        nurl
        hcloud
        tea
        dgraph
        nix-init
        nodePackages.nodemon
        pocketbase
        hub
        httpie
        manix
        (pkgs.writeShellScriptBin "ssh-fix-permissions" (
          builtins.readFile ./../scripts/ssh-fix-permissions.sh
        ))
        (pkgs.writeShellScriptBin "yt-dlp-audio" (builtins.readFile ./../scripts/yt-dlp-audio.sh))
        (pkgs.writeShellScriptBin "nix-shell-init" (builtins.readFile ./../scripts/nix-shell-init.sh))
        (pkgs.writeShellScriptBin "http-server" ''
          ${pkgs.caddy}/bin/caddy file-server --listen :2345z
        '')
        (pkgs.writeShellScriptBin "nix-build-default" ''
          nix-build -E 'with import <nixpkgs> { }; callPackage ./default.nix { }'
        '')
        (callPackage ./../pkgs/toggl-time-grouper/package.nix { inherit python3Packages; })
        (callPackage ./../pkgs/extract.nix { inherit pkgs; })
        (pkgs.writeShellScriptBin "kitty-term-fix" ''
            infocmp -a xterm-kitty | ssh $1 tic -x -o \~/.terminfo /dev/stdin
          '')
        nixpkgs-fmt
        ddev
        act
        mkcert
        # pulumi
        kubectl
        pulumiPackages.pulumi-language-nodejs
        ncdu
        devenv
        inputs.nixpkgs-update.packages.x86_64-linux.nixpkgs-update
        inputs.dagger.packages.x86_64-linux.dagger
        unzip
        nil
        nixd
        unrar
        inputs.w17.packages.x86_64-linux.default
        aichat
        nerd-fonts.jetbrains-mono
        nerd-fonts.fira-code
        nerd-fonts.fira-mono
        nix-output-monitor
        nodePackages.pnpm
        npm-check-updates
        air
        uv
        ruff

        # FPGA stuff
        yosys
        nextpnr
        icestorm
        icebreaker

        php
        (lib.hiPrio phpPackages.composer)

        nixfmt-rfc-style
      ]
      ++ (
        if (!config.machine.isGeneric) then
          [
            toolbox
            distrobox
          ]
        else
          [ ]
      )
      ++ (
        if (config.machine.isGraphical) then
          [
            (nixGL insomnia)
            (nixGL comma)
            # (nixGL processing)
            (nixGL scrcpy)
          ]
        else
          [ ]
      )
      ++ (
        if (config.machine.isGraphical && !config.machine.isGeneric) then
          [
            # jetbrains.webstorm
            # jetbrains.phpstorm
            # jetbrains.rust-rover
            # jetbrains.goland
            element-desktop
            ludusavi
            dbeaver-bin
            onlyoffice-bin
            spotify
            discord
            (lutris.override {
              extraLibraries = _: [ adwaita-icon-theme ];
              extraPkgs = _: [
                wineWowPackages.full
                winetricks
                adwaita-icon-theme
              ];
            })
            bottles
            protontricks
            heroic
            (vscode.override { commandLineArgs = electronFlags; })
            quickemu
            quickgui
            trilium-desktop
            anki
            # inputs.muse-sounds-manager.packages.x86_64-linux.muse-sounds-manager
            jetbrains-toolbox
            mumble
            prusa-slicer
            trayscale
            gnome-disk-utility
            inkscape
            musescore
            obsidian
            syncthingtray
            reaper
            yabridge
            inputs.suyu.packages.x86_64-linux.suyu
            inputs.nix-alien.packages.x86_64-linux.nix-alien
            kdePackages.kdenlive
            audacity
            signal-desktop
          ]
        else
          [ ]
      )
      ++ (
        if config.machine.isGnome then
          [
            gnomeExtensions.blur-my-shell
            gnomeExtensions.dash-to-panel
            gnomeExtensions.user-themes
            gnomeExtensions.vitals
            gnomeExtensions.custom-accent-colors
          ]
        else
          [ ]
      );
  };
}