No description
  • TypeScript 44.3%
  • Vue 32.5%
  • Go 20.7%
  • CSS 2%
  • HTML 0.5%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-10-09 10:48:20 +03:00
go Steam Env Manager: Go wrapper + Electron/Vue configurator 2026-10-08 22:05:09 +03:00
src add more vars 2026-10-09 10:48:20 +03:00
.gitignore Steam Env Manager: Go wrapper + Electron/Vue configurator 2026-10-08 22:05:09 +03:00
electron.vite.config.ts Steam Env Manager: Go wrapper + Electron/Vue configurator 2026-10-08 22:05:09 +03:00
package-lock.json Steam Env Manager: Go wrapper + Electron/Vue configurator 2026-10-08 22:05:09 +03:00
package.json Steam Env Manager: Go wrapper + Electron/Vue configurator 2026-10-08 22:05:09 +03:00
README.md add more vars 2026-10-09 10:48:20 +03:00
tsconfig.json Steam Env Manager: Go wrapper + Electron/Vue configurator 2026-10-08 22:05:09 +03:00
tsconfig.node.json Steam Env Manager: Go wrapper + Electron/Vue configurator 2026-10-08 22:05:09 +03:00
tsconfig.web.json Steam Env Manager: Go wrapper + Electron/Vue configurator 2026-10-08 22:05:09 +03:00

Steam Env Manager

Manage per-game environment variables for Steam on Linux — NVIDIA driver features (Smooth Motion), DLSS presets, Proton/VKD3D toggles, plus MangoHud and GameMode — through two cooperating parts:

  • steamenv — a small Go wrapper you put in a game's Steam launch options. It reads a JSON profile, applies its env vars, prepends the gamemoderun / mangohud wrapper chain and execs the game command, forwarding signals and the exit code.
  • Electron app — a Vue 3 + TypeScript configurator (bundled with electron-vite) that edits those profiles, with a curated, source-verified catalog of NVIDIA/DLSS/Proton/VKD3D variables and free-form custom variables.

Profiles are standalone — what's in the file is what gets applied, with no merging between global and game profiles.

Install

Requirements: Go ≥ 1.24, Node.js ≥ 20.

npm install
npm run build:wrapper        # go build -o ./resources/steamenv ./go/cmd/steamenv
npm run dev                  # start the configurator

Put the wrapper somewhere on your PATH (Steam needs to find it):

mkdir -p ~/.local/bin
cp resources/steamenv ~/.local/bin/

Usage

  1. In the app, create a profile — pick a game from your Steam library (scanned locally) or enter a name manually.

  2. Toggle MangoHud / GameMode, enable catalog variables (dropdowns show the legal values), add custom KEY=value pairs.

  3. Copy the launch-options string shown in the profile header and paste it into the game's Steam properties → Launch Options:

    steamenv --profile hades %command%
    

    Without --profile, the global profile is used:

    steamenv %command%
    

Flags: --dry-run prints the resolved command chain and env vars without launching; --verbose prints the same to stderr during a real launch. Flags must precede the command (that's how Steam expands %command%).

Profile storage

$XDG_CONFIG_HOME/steam-env-manager/ (default ~/.config/steam-env-manager/):

global.json              # default profile (no --profile flag)
profiles/<slug>.json     # one file per game profile

Schema (version 1) — the contract shared by the wrapper and the app:

{
  "version": 1,
  "name": "hades",
  "gameName": "Hades",
  "appId": 1145360,
  "env": {
    "NVPRESENT_ENABLE_SMOOTH_MOTION": "1",
    "DXVK_NVAPI_DRS_NGX_DLSS_SR_OVERRIDE_RENDER_PRESET_SELECTION": "render_preset_k"
  },
  "mangohud": true,
  "gamemoderun": false
}

name is a slug ([a-z0-9][a-z0-9_-]*); gameName/appId are informative only. Env vars are applied on top of the inherited environment (profile wins on conflicts). A missing or invalid profile aborts the launch with a non-zero exit code.

Wrapper behavior:

  • gamemoderun and/or mangohud are resolved with exec.LookPath and prepended (gamemoderun mangohud <cmd>); a missing binary is skipped with a stderr warning instead of failing the launch.
  • SIGINT/SIGTERM/SIGHUP are forwarded to the game; the game's exit code is propagated (127 if the command can't start).

Catalog notes

The built-in catalog was verified against the NVIDIA driver README (580.x), the dxvk-nvapi wiki, the Proton README and the vkd3d-proton README. Highlights:

  • NVPRESENT_ENABLE_SMOOTH_MOTION — RTX 40 Series+, Vulkan x86_64 only; do not combine with in-game DLSS Frame Generation.
  • __GL_MaxFramesAllowed — caps the driver's render-ahead frame queue (1 = lowest input lag, 3 = driver default; 0 is ignored on Linux). There is no Linux equivalent of the Windows "Ultra" low latency mode (that one is Reflex-based); for Reflex in Proton games use PROTON_ENABLE_NVAPI.
  • DLSS SR/RR render presets now span render_preset_a…render_preset_o (FG: a–z, NR: a–d).
  • NVAPI support is enabled by default in current Proton — the catalog offers PROTON_DISABLE_NVAPI for the off case.
  • PROTON_FSR4_UPGRADE (not ..._ENABLE) is GE-Proton/CachyOS-only.
  • DLSS indicator options cover the three runtimes: __NGX_SHOW_INDICATOR (native builds), DXVK_NVAPI_SET_NGX_DEBUG_OPTIONS (Proton, NVIDIA-documented; persists in the wineprefix — use the Off value to clear it) and PROTON_DLSS_INDICATOR (GE-Proton/CachyOS dlsshud).

Anything not in the catalog can be added as a custom variable.

Development

npm run test:wrapper     # go test ./go/...
npm run build:wrapper    # build the Go wrapper into resources/
npm run typecheck        # tsc (main/preload) + vue-tsc (renderer)
npm run build            # electron-vite production build (out/)
npm run dev              # run the app in dev mode

Layout: Electron app at the repo root (src/main, src/preload, src/renderer), Go module in go/ (cmd/steamenv, internal/profile, internal/runner).

Debug helpers: STEAMENV_SMOKE=/path/screenshot.png npm run dev captures a screenshot after load and quits; STEAMENV_SELECT=<profile> opens the app with that profile selected (#<profile> deep link).