Monadeck — a SteamVR-style Launcher for Monado
Envision works, but I never liked its GTK UI or its PATH-bound, .desktop-file plugin system — and it does a lot of things (source builders, driver profiles, dependency checks) I never use. So I built Monadeck: a SteamVR-style launcher and orchestrator for my Monado fork, focused on the ~40% of Envision I actually reach for.
Repo: github.com/Eidenz/monadeck — grab the latest release there.
Think of it as the SteamVR you no longer have: it starts the runtime, shows you what's connected, and gives you an in-headset dashboard to launch games and adjust your playspace.
What it does
Runtime orchestration (the desktop app):
- Starts and stops
monado-servicewith the right environment for your headset (render scale, pacing, compositor, NVIDIA/AMD tweaks) — no launch-option guesswork. - Registers Xrizer as your OpenVR runtime automatically.
- Shows a live device strip (headset, controllers, trackers, gloves) with battery levels via libmonado.
- Launches overlay plugins by explicit path or by picking an installed app.
One-click setup (no building):
- If no Monado is found, Monadeck can download the prebuilt portable fork and Xrizer for you, into its own folders — it never touches or overwrites an existing install.
- A built-in pre-flight check verifies the
xr-hardwareudev rules andpkexecare present, and tells you exactly how to fix them if not.
Coexistence is a hard rule: every runtime switch backs up your active_runtime.json and openvrpaths.vrpath, and restores them when you stop — so Monadeck never breaks an existing SteamVR setup.
In-headset dashboard
Enable the built-in overlay and you get a curved, SteamVR-style dashboard you can summon over any game:
- Game library — Steam and non-Steam titles (it parses
shortcuts.vdf, which most launchers miss), with cover/hero/logo art, favorites, collections, sorting, and playtime. - Playspace mover — nudge and rotate your play space like OVR Advanced Settings, with per-game overrides on top of a global offset.
- Timer, battery readouts, low-battery warnings, and in-headset toasts.
- Set active / Freeze / Kill per running app (Freeze uses the fork's controller-freeze feature).
- Haptics and optional UI sounds.
- A Help button in Settings shows every gesture the overlay understands, in-headset.
Desktop viewer (the WayVR part)
Monadeck's overlay also mirrors your desktop into VR, so you don't need a separate overlay app for that anymore (WayVR still works alongside it if you prefer it):
- Screens — each monitor is captured through the desktop portal and PipeWire straight into the GPU (DMA-BUF, zero copy) and shown as a flat or curved panel. Grip to move, grip + trigger to resize, stick to push/pull or curve; drop one next to another to dock them edge-to-edge. Per-screen opacity, a frame-rate cap and an optional downscale keep the cost down; capture pauses when you're not looking.
- Mouse — the laser drives a real (uinput) mouse: trigger clicks and drags, A right-clicks, B clicks without moving, the stick scrolls. Scroll speed and drag threshold are sliders.
- Keyboard — a full ISO keyboard with F-row, nav cluster, numpad and Copy/Cut/Paste, labelled from your real xkb layouts, with a layout switcher (KDE), clipboard preview, key repeat, Shift lock and one-shot modifiers. It floats or docks under a screen; both hands can type. Optionally it pops up on its own when a text field gets focus on the desktop.
- Layouts — save the whole arrangement (screens, sizes, curves, keyboard) under a name, e.g. Standing and Lying down, and switch from the watch. The last one is loaded on start, hidden, and a double-B on the left hand brings it up where it was.
- Wrist watch — clock and date, extra time zones, battery levels, a timer, now-playing with transport controls (MPRIS), the last notifications behind a bell, and four configurable quick buttons (keyboard, recenter, next layout, freeze, timer, screenshot, screens, mute, photos) plus a menu button and one toggle per screen.
- Notifications — desktop notifications and XSOverlay-protocol messages (VRCX and friends,
udp/42069) show as toasts with the app's icon, with their own sound and volume. - Screenshots — the fork's in-headset screenshots (finger-frame gesture, controller chord) land on the watch for a quick look, can be opened into floating photo windows (copy, delete, translate, share), and are browsable on the Photos page. This replaced my old standalone monado-frame overlay.
- 360° background while no game is running (bring your own equirect image, or keep the default).
Visual binding editor
Instead of hand-editing Xrizer/SteamVR binding JSON (see the manual method), Monadeck bundles a visual binding editor: browse your games, click controller zones, assign actions, tweak parameters, and save straight to an Xrizer per-game override. Index/Knuckles are fully supported.
Bonus: flat games in VR (UEVR mode)
Monadeck can inject UEVR into flat Unreal Engine games for you — it downloads the injector, launches the game under Proton, and waits for injection, all from the in-headset library. See the UEVR page for the details.
Monadeck targets my Monado fork running from prefix /usr (or a Monadeck-installed portable copy). It also works against stock Monado — features that need the fork (like controller freeze) simply hide themselves when the loaded runtime doesn't support them.