Skip to main content

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-service with 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-hardware udev rules and pkexec are present, and can install the udev rules for you in one click.

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).

Lighthouse tracking without SteamVR​

Lighthouse headsets still need SteamVR installed, because Monado borrows its tracking driver, but since 2.0 I never have to open it. The Settings → Lighthouse page covers what I used to start SteamVR for:

  • Room setup — with VR running, stand the headset upright on the floor where you want the center of your play area, lenses facing forward, and press Set floor and center. Monadeck writes SteamVR's room file itself and my fork picks it up live, no restart. On stock Monado it falls back to SteamVR's own vrcmd calibration (with the service stopped).
  • Pairing — lists your receivers by what they are (the headset's left/right receivers, a Tundra SW3 as one entry, Vive dongles), shows which ones are in use, and puts one in pairing mode. It works with VR running, and a Tundra dongle can take several trackers at once.
  • Base stations — scan for them over Bluetooth, switch them on, to sleep or to standby, change a 2.0 station's channel, and optionally switch them on and off with VR. The PC needs a Bluetooth adapter for this.

Firmware updates for controllers, trackers and base stations are the one thing left that needs SteamVR.

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.

note

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.