VK_LAYER_OTTER_HUD) and an OpenGL preload hook capture frame timings and paint the overlay on present.
Install with:
otter-hud alone.
For a full HUD (live metrics, your layout, telemetry into Bench),
otter-benchd must be running. Without the daemon the game still launches and the layer fails open, but you only get a diagnostic banner — not a usable overlay. Start Bench once, run otter-benchctl status, or enable the user unit so the daemon is up before you play.Launch a game with the HUD
otter-hud sets the injection environment and execs the program. Job control, signals, and exit status belong to the game. Everything after the program name passes through, so otter-hud vkcube --gpu 0 works.
The layer is implicit and off by default. It activates when OTTER_HUD_ENABLED is set, which the launcher does.
How it behaves
- Fails open. Missing daemon, bad layout, or a full ring never take the game down. Instrumentation goes quiet (or shows the diagnostic banner) instead.
- No allocations on the present path. Frame events go into a lock-free shared-memory ring. A full ring bumps a counter; it never blocks the producer.
- Missing data is never zero. Sensors report unavailable with a reason. Graphs show gaps rather than inventing values.
64-bit only (for now)
Packaged builds ship the x86_64 Vulkan layer only. A 32-bit process (common under Steam/Proton for older titles) cannot load that layer, so those games get no HUD until a 32-bit package exists.Configuration
Shared HUD settings:~/.config/otter-shell/otter-hud.conf
Layouts: ~/.config/otter-shell/otter-hud/layouts/*.conf
