{
  lib,
  config,
  osConfig,
  pkgs,
  inputs,
  ...
}: {
  nixpkgs = {
    overlays = [
      inputs.nix-vscode-extensions.overlays.default
    ];
  };

  programs = {
    bash.shellAliases = lib.mkIf config.isFullUser {
      code = "codium";
    };

    vscode = let
      extensions = inputs.nix-vscode-extensions.extensions.${pkgs.system};
      open-vsx = extensions.open-vsx;
      vscode-marketplace = extensions.vscode-marketplace;
    in {
      enable = true;

      package = pkgs.vscodium;

      mutableExtensionsDir = false;
      enableUpdateCheck = false;
      enableExtensionUpdateCheck = false;

      userSettings = {
        "workbench.colorTheme" = "Atom One Dark";
      };

      extensions = with extensions.open-vsx;
        [
          # vs code feel extensions
          ms-vscode.atom-keybindings
          akamud.vscode-theme-onedark
          streetsidesoftware.code-spell-checker
          streetsidesoftware.code-spell-checker-german
          streetsidesoftware.code-spell-checker-italian
          jeanp413.open-remote-ssh

          # nix extensions
          pinage404.nix-extension-pack
          jnoortheen.nix-ide

          # html extensions
          formulahendry.auto-rename-tag
          ms-vscode.live-server

          # js extensions
          dsznajder.es7-react-js-snippets
          dbaeumer.vscode-eslint
          standard.vscode-standard
          firsttris.vscode-jest-runner
          stylelint.vscode-stylelint
          tauri-apps.tauri-vscode

          # misc extensions
          bungcip.better-toml

          # the number at the start of the name here doesnt resolve nicely so we have to refernce it as a part of open-vsx directly instead of though with
          open-vsx."10nates".ollama-autocoder
        ]
        ++ (with extensions.vscode-marketplace; [
          # js extensions
          karyfoundation.nearley
        ]);
    };

    # steam = lib.mkIf config.isFullUser {
    #   enable = true;
    #   remotePlay.openFirewall = true; # Open ports in the firewall for Steam Remote Play
    #   dedicatedServer.openFirewall = true; # Open ports in the firewall for Source Dedicated ServerServer
    #   localNetworkGameTransfers.openFirewall = true; # Open ports in the firewall for Steam Local Network Game Transfers
    # };

    # noisetorch.enable = config.isFullUser;

    # adb.enable = config.isFullUser;
  };

  home = {
    packages = lib.mkIf (config.isFullUser || config.isThinUser) (
      lib.mkMerge [
        (
          with pkgs; [
            # comand line tools
            yt-dlp
            ffmpeg
            imagemagick
          ]
        )
        (
          lib.mkIf (!config.isThinUser) (
            with pkgs; [
              #foss platforms
              signal-desktop
              bitwarden
              firefox
              ungoogled-chromium
              libreoffice
              inkscape
              gimp
              krita
              freecad
              # cura
              kicad-small
              makemkv
              transmission_4-gtk
              onionshare
              easytag
              # rhythmbox
              (lib.mkIf config.hasGPU obs-studio)
              # wireshark
              # rpi-imager
              # fritzing

              # proprietary platforms
              discord
              obsidian
              steam
              (lib.mkIf config.hasGPU davinci-resolve)

              # development tools
              androidStudioPackages.canary
              jetbrains.idea-community
              dbeaver-bin
              bruno

              # system tools
              protonvpn-gui
              openvpn
              nextcloud-client
              noisetorch

              # hardware managment tools
              (lib.mkIf osConfig.hardware.piperMouse.enable piper)
              (lib.mkIf osConfig.hardware.openRGB.enable openrgb)
              (lib.mkIf osConfig.hardware.viaKeyboard.enable via)
            ]
          )
        )
      ]
    );
  };
}