{
  config,
  pkgs,
  lib,
  ...
}: let
  psCfg = config.pub-solar;
  wlroots = psCfg.graphical.wayland;
  xdg = config.home-manager.users."${psCfg.user.name}".xdg;
  variables = {
    XDG_CONFIG_HOME = xdg.configHome;
    XDG_CACHE_HOME = xdg.cacheHome;
    XDG_DATA_HOME = xdg.dataHome;

    XDG_CURRENT_DESKTOP = "sway";

    QT_QPA_PLATFORM = "wayland";

    # Wayland fixes
    ECORE_EVAS_ENGINE = "wayland_egl";
    ELM_ENGINE = "wayland_egl";
    SDL_VIDEODRIVER = "wayland";
    WLR_RENDERER =
      if wlroots.software-renderer.enable
      then "pixman"
      else "gles2";

    EDITOR = "/etc/profiles/per-user/${psCfg.user.name}/bin/nvim";
    VISUAL = "/etc/profiles/per-user/${psCfg.user.name}/bin/nvim";

    # fix "xdg-open fork-bomb" your preferred browser from here
    BROWSER = "${pkgs.firefox-wayland}/bin/firefox";

    # node
    NODE_REPL_HISTORY = "${xdg.dataHome}/node_repl_history";
    NVM_DIR = "${xdg.dataHome}/nvm";
    PKG_CACHE_PATH = "${xdg.cacheHome}/pkg-cache";

    # npm
    NPM_CONFIG_USERCONFIG = "${xdg.configHome}/npm/config";
    NPM_CONFIG_CACHE = "${xdg.configHome}/npm";
    # TODO: used to be XDG_RUNTIME_DIR NPM_CONFIG_TMP = "/tmp/npm";

    # Make sure virsh runs without root
    LIBVIRT_DEFAULT_URI = "qemu:///system";

    # wine
    WINEPREFIX = "${xdg.dataHome}/wineprefixes/default";

    # z
    _Z_DATA = "${xdg.dataHome}/z";

    # wget
    WGETRC = "${xdg.configHome}/wgetrc";

    # rust
    RUSTUP_HOME = "${xdg.dataHome}/rustup";
    CARGO_HOME = "${xdg.dataHome}/cargo";

    # Java
    _JAVA_OPTIONS = "-Djava.util.prefs.userRoot='${xdg.configHome}/java'";
    _JAVA_AWT_WM_NONREPARENTING = "1";

    # docker
    DOCKER_CONFIG = "${xdg.configHome}/docker";

    # experimental wayland in firefox/thunderbird
    MOZ_ENABLE_WAYLAND = "1";

    # chromium / electron on wayland: enable ozone (native wayland mode)
    NIXOS_OZONE_WL = "1";

    # Vagrant
    VAGRANT_HOME = "${xdg.dataHome}/vagrant";
    VAGRANT_DEFAULT_PROVIDER = "libvirt";

    # Android
    ANDROID_SDK_ROOT = "${xdg.configHome}/android";

    ANDROID_AVD_HOME = "${xdg.dataHome}/android";
    ANDROID_EMULATOR_HOME = "${xdg.dataHome}/android";
    ADB_VENDOR_KEY = "${xdg.configHome}/android";

    # TELEMETRY BS
    VUEDX_TELEMETRY = "off";

    # FZF shell history widget default colors
    FZF_DEFAULT_OPTS = lib.mkForce "--color=bg+:#2d2a2e,bg:#1a181a,spinner:#ef9062,hl:#7accd7 --color=fg:#d3d1d4,header:#7accd7,info:#e5c463,pointer:#ef9062 --color=marker:#ef9062,fg+:#d3d1d4,prompt:#e5c463,hl+:#7accd7";

    # nnn theme colors
    NNN_FCOLORS = let
      BLK = "04";
      CHR = "04";
      DIR = "04";
      EXE = "02";
      REG = "00";
      HARDLINK = "01";
      SYMLINK = "01";
      MISSING = "01";
      ORPHAN = "07";
      FIFO = "05";
      SOCK = "05";
      OTHER = "02";
    in
      BLK + CHR + DIR + EXE + REG + HARDLINK + SYMLINK + MISSING + ORPHAN + FIFO + SOCK + OTHER;
  };

  envListNames = lib.attrsets.mapAttrsToList (name: value: name) variables;

  # Here we merge an extra variable into the attrset called FULL_ENV_LIST.
  # It's a list of the variable names defined above.
  # We can use this to tell `systemctl import-environment` to import the full list above.
  variablesWithMeta = lib.attrsets.zipAttrsWith (name: values: builtins.head values) [
    variables
    {IMPORT_ENVIRONMENT_ENV_LIST = lib.lists.foldl (a: b: a + " " + b) "IMPORT_ENVIRONMENT_ENV_LIST" envListNames;}
  ];
in {
  home-manager = pkgs.lib.setAttrByPath ["users" psCfg.user.name] {
    home.sessionVariables = variablesWithMeta;
    systemd.user.sessionVariables = variablesWithMeta;
  };

  environment.variables = variablesWithMeta;
}