- TypeScript 44.3%
- Vue 32.5%
- Go 20.7%
- CSS 2%
- HTML 0.5%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| go | ||
| src | ||
| .gitignore | ||
| electron.vite.config.ts | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
| tsconfig.node.json | ||
| tsconfig.web.json | ||
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 thegamemoderun/mangohudwrapper 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
-
In the app, create a profile — pick a game from your Steam library (scanned locally) or enter a name manually.
-
Toggle MangoHud / GameMode, enable catalog variables (dropdowns show the legal values), add custom
KEY=valuepairs. -
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:
gamemoderunand/ormangohudare resolved withexec.LookPathand 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 (
127if 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;0is 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 usePROTON_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_NVAPIfor 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) andPROTON_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).