mangohud-logger/README.md
Gavin Nugent fc2f702fb2 Initial commit: mangohud-logger toggle script
One-touch toggle for MangoHud CSV logging on Linux gaming-launcher systems
(DeckShift, super-alt-S, gamescope-session-plus). Manages three files
idempotently: MangoHud.conf block, environment.d MANGOHUD=1, and a
gamescope-session-plus user override that fixes Steam's mangoapp/MANGOHUD_CONFIGFILE
suppression.
2026-05-18 14:35:26 +01:00

131 lines
4.9 KiB
Markdown

# mangohud-logger
One-touch toggle for MangoHud CSV logging on Linux gaming-launcher systems
(DeckShift, super-alt-S, plain `gamescope-session-plus`, or any setup that
already uses MangoHud).
Run the script — it switches logging on if it's off, off if it's on. CSV
samples land in `~/Downloads/mango-logs/`. That's the entire interface.
## Why this exists
Getting MangoHud to *actually* write logs from a Steam-via-gamescope game
turns out to be a three-step setup, and every step has a non-obvious
gotcha. This script handles all three so you don't have to remember them.
## What it changes
The script writes three files (all marker-tagged so it can clean them up
on disable, and so it won't trample anything you wrote by hand):
1. **`~/.config/MangoHud/MangoHud.conf`** — appends a marker-bracketed block
with `output_folder`, `autostart_log=1`, `log_duration=0` (= until you
quit), `log_interval=100`, `toggle_logging=Shift_L+F2`, and a
`no_display=0` override.
2. **`~/.config/environment.d/95-mangohud-logger.conf`** — contains
`MANGOHUD=1` so the Vulkan loader auto-injects MangoHud into every game.
Requires a logout/login to take effect (systemd-user only reads
`environment.d/*.conf` at session start).
3. **`~/.config/gamescope-session-plus/sessions.d/steam`** — user-level
override that unsets the system's `MANGOHUD_CONFIGFILE` and turns off
`STEAM_USE_MANGOAPP`. See "Gotchas" below for why.
When you toggle it off, the script removes all three.
## Gotchas it works around
- **`no_display` blocks `autostart_log`.** If your MangoHud config has
`no_display` (HUD hidden by default), MangoHud's `autostart_log` rides on
the render hook that `no_display` disables — so the log never starts. The
script appends `no_display=0` at the end of its block to override.
Tradeoff: while logging is on, the HUD becomes visible during games.
- **DeckShift / gamescope-session-plus suppresses your user MangoHud config.**
The system `gamescope-session-plus` script does
`export MANGOHUD_CONFIGFILE=$(mktemp /tmp/mangohud.XXXXXXXX)` and writes
only `no_display` into that file. Result: MangoHud ignores your real
`~/.config/MangoHud/MangoHud.conf` and your `output_folder` / `autostart_log`
keys never run. The user-level session override unsets that var so
MangoHud falls back to the user file.
- **Steam uses `mangoapp` instead of the in-game MangoHud Vulkan layer.**
The system steam session exports `STEAM_USE_MANGOAPP=1`, which makes
gamescope draw the overlay via a separate `mangoapp` process — and
`mangoapp` doesn't write CSV logs the same way (and segfaults in a loop
on some boxes). The session override forces `STEAM_USE_MANGOAPP=0` so
the regular Vulkan-layer MangoHud takes over.
- **`log_duration=0` means "log forever".** The MangoHud docs aren't crystal
clear; empirically `0` = log until you quit or hit the toggle key.
- **`MANGOHUD=1` only injects the Vulkan layer.** OpenGL-only games (rare
these days) still need `mangohud %command%` in Steam launch options or
an `LD_PRELOAD` wrapper.
## Install
Requires `mangohud` (and `lib32-mangohud` for 32-bit games). On Arch:
```bash
sudo pacman -S mangohud lib32-mangohud
```
Then:
```bash
git clone https://git.no-signal.uk/nosignal/mangohud-logger.git
cd mangohud-logger
chmod +x mangohud-logger.sh
./mangohud-logger.sh
```
Or copy the script anywhere on `$PATH`:
```bash
install -Dm755 mangohud-logger.sh ~/.local/bin/mangohud-logger
mangohud-logger
```
## Usage
```bash
./mangohud-logger.sh
```
That's it — no flags, no subcommands. First run enables; second run disables.
After the first enable, **log out of your desktop session and back in** so
the `MANGOHUD=1` env var becomes effective. You only need to do that once.
In-game keys (set by the script's MangoHud block):
| Key | Action |
|---|---|
| `Shift+F2` | Toggle logging on/off mid-game (useful for benchmarking a specific section) |
| Your existing `toggle_hud` key | Hide the HUD overlay (logging keeps running) |
CSV files appear in `~/Downloads/mango-logs/` as `<game>_<timestamp>.csv`.
Drop them into <https://flightlessmango.com/> for graphs, or open in a
spreadsheet.
## Compatibility
- **DeckShift** ([28allday/DeckShift](https://github.com/28allday/DeckShift))
— gamescope-session-plus based, Omarchy-only.
- **super-alt-S** ([28allday/super-alt-S-cachy-deckmode](https://github.com/28allday/super-alt-S-cachy-deckmode))
— KDE-Plasma gaming mode on CachyOS.
- **Plain `gamescope-session-plus`** on any Arch-based distro.
- **Steam without gamescope** — works too; only piece 3 (the gamescope
override) becomes a no-op.
- **Non-systemd distros** — piece 2 (the `environment.d` file) won't be
read; set `MANGOHUD=1` via your distro's preferred env-var mechanism.
## Honours XDG
Log folder is `$XDG_DOWNLOAD_DIR/mango-logs` (resolved via `xdg-user-dir`),
config dir is `$XDG_CONFIG_HOME` — works on non-English locales.
## License
MIT