The desktop app may freeze the first time it's launched after updating — restart vrOS from the system tray to use it normally.
Enhancements
First-time entry into the compact dashboard now shows a one-time dialog explaining how to return to the full-size dashboard. The dialog reads your current logo-gesture binding and names the actual gesture (defaults to "long-hold the vrOS logo"), or points you to Settings if no gesture is bound. The acknowledgement persists across restarts.
Bug Fixes
Popped-out FPS tab (and every other popout, ad overlay, and alert overlay) now correctly shows live data when SteamVR is running — a regression from the v1.2.5 IPC refactor silently dropped async bridge replies for any view other than the main dashboard, leaving popouts stuck on the "available in VR" stub
Desktop window no longer freezes for up to 5 seconds when restarting VR overlays, opening popouts, or polling perf timings while the VR child is mid-recovery — these calls now run off the desktop's main event loop
Eliminated the startup log cascade when launching alongside SteamVR (DX11 readiness queries piling up, UI frame cap dropping to 15 fps, abandoned readiness queries) — added a 500 ms grace window covering the SteamVR compositor handover
UI frame cap now recovers back to 30 fps once temporary GPU pressure subsides; previously stayed pinned at 15 fps for the rest of the session
Twitch and OBS reconnect loops resist flapping endpoints — a server that accepts the handshake but drops in under a second no longer pins backoff at 1 s. A healthy session of at least 2× the current backoff (minimum 5 s) is required before backoff resets
Reconnect sleeps now use ±25 % jitter to spread out simultaneous attempts across Twitch IRC, Twitch EventSub, and OBS
Integrations (Twitch, OBS, VRChat, OSC) now shut down cleanly via cancellation tokens with a 1 s drain instead of bare task aborts. OBS additionally sends a WebSocket Close frame on shutdown
VR pose loop no longer stalls during playspace calibration if the event bus is contended
Launcher now shows a Windows error dialog if the main DLL fails to load, instead of silently exiting with code 1
Removed a startup warning about a missing recovery-incident handler in the VR child
Reduced log noise: transient pipe-decode errors that auto-recover are now logged as WARN instead of ERROR
Improvements
Heavy IPC traffic (audio meters, Twitch chat, video frame metadata) uses less CPU — pipe writes now reuse a single buffer and flush once per batch instead of per message
VR child crash recovery is now near-instant for in-flight bridge requests: all pending callers receive a structured disconnect error immediately instead of timing out one at a time
JS bridge callbacks now arrive in a single batched call instead of one round-trip per callback, smoothing burst response
Stuck pipe requests evict after 8 s instead of accumulating across the session
Bus event batches drain up to 32–64 messages per select iteration instead of one-per-iteration
Twitch settings subtab no longer trips the "slow bridge poll" warning — 5 more handlers moved off the UI thread
Channel Points Rewards panel renders faster — Soundpad / VRChat Avatar / Camera Control sections are collapsed by default and only mount their action lists when expanded
Twitch channel-point redemptions and chat-command reloads no longer tie up an async runtime worker thread while the SQLite read completes — the load moved to tokio's dedicated blocking thread pool, so other async tasks scheduled on the same worker keep running
Notes
This release closes the last items of the IPC audit started in v1.2.5. The desktop/VR pipe is now fully off the UI and main event-loop threads — no synchronous IPC waits remain on either side.