OpenNOW
Reference

Input

Keyboard, mouse, gamepad, clipboard, microphone, shortcuts, and native input behavior in OpenNOW

OpenNOW captures input in Electron and sends it to GeForce NOW over WebRTC data channels. In web mode the renderer owns the channels. In experimental native mode, the Rust streamer owns compatible channels after it emits input-ready; Electron input forwarding remains the fallback when native input readiness is unavailable.

Default shortcuts

ShortcutAction
F3Toggle stats overlay
F8Toggle pointer lock
F10Toggle fullscreen
F11Take screenshot
F12Start/stop recording
Ctrl+Shift+QStop session
Ctrl+Shift+KToggle anti-AFK
Ctrl+Shift+MToggle microphone

All shortcuts can be changed in Settings. On macOS the UI may display Ctrl as Cmd, while the stored binding uses the same setting string.

allowEscapeToExitFullscreen defaults to false. Escape is still used for pointer-lock release behavior; opting into Escape fullscreen exit makes fullscreen easier to leave but can conflict with in-game Escape usage. Intentional host-side releases, including the F8 pointer-lock toggle and F10 fullscreen toggle, suppress the synthetic remote Escape that OpenNOW normally sends when Chromium drops pointer lock after an intercepted Escape key.

Keyboard

Keyboard events are translated to Windows-style virtual key codes and sent with scancode 0, matching GeForce NOW's web client behavior so the server applies the selected layout instead of OpenNOW forcing a US physical-key mapping. The keyboardLayout setting controls the layout used by the remote session, which is important for regional layouts such as German where keys like Y, Z, and punctuation differ from US keyboards. Web mode sends keyboard packets over input_channel_v1; experimental native mode sends equivalent packets through the native child when its input channel is ready.

When fullscreen is active, OpenNOW also makes a best-effort navigator.keyboard.lock() request for browser-reserved keys such as Ctrl+T, Ctrl+N, F11, Escape, Print Screen, and common browser/navigation keys so those shortcuts can reach the stream instead of the host browser when Chromium allows it. If Chromium releases pointer lock because it captured Escape before the stream sees it, OpenNOW sends a synthetic Escape press to the remote session and then tries to restore pointer lock.

Pointer lock and mouse

  • Pointer lock captures the cursor inside the stream view. Toggle with F8 by default.
  • mouseSensitivity defaults to 1 and scales relative movement.
  • mouseAcceleration defaults to 1 and is clamped to 1–150.
  • Latency-sensitive mouse deltas use input_channel_partially_reliable.

Gamepad

OpenNOW tracks up to four controllers through the browser Gamepad API. Button and analog state is polled and sent over the partially reliable input channel. Controller badges/loading states can appear while the app is waiting for a controller-focused library or launch flow to become ready.

The enableGyroscopeControls setting is an experimental, opt-in bridge for controller motion sensors. It defaults off and only exposes gyro aiming data when the browser/input backend reports compatible motion axes; regular gamepad button and stick packets continue to work without it.

Controller-mode navigation uses the standard Gamepad button layout: D-pad or left stick moves focus, south/A selects or plays, east/B goes back or closes overlays, west/X opens search, shoulder buttons switch between controller pages, and menu opens game details or cycles variants depending on the page. The guide button is treated as a menu alias when the browser exposes it as button 16.

Native input caveat

Native OS-level input capture is part of the experimental native streamer path and is implemented on Windows. On macOS, Linux, and Raspberry Pi/Linux ARM, native streaming may run through the child process, but input support depends on the platform/backend capabilities reported by the streamer. If native input readiness is not reported, the app should not assume the child can receive input packets.

When the native streamer window has focus on Windows, the native input bridge matches configured app shortcuts and sends shortcut events back to Electron before forwarding other keyboard input to the stream. Remote keyboard packets still use virtual key codes with scancode 0, so regional layouts such as German QWERTZ keep the selected remote layout instead of the local physical key position.

Clipboard paste

While streaming, OpenNOW intercepts the host paste shortcut so local/browser paste behavior does not leak into the app UI. When clipboardPaste is enabled, web mode reads text from the browser clipboard API and falls back to Electron's main-process clipboard bridge when needed, then converts up to 4096 mappable characters into synthetic keystrokes using the selected keyboardLayout. Native mode can emit a clipboard-paste shortcut event so Electron reads the host clipboard and sends the same GFN paste packet through signaling. If clipboard text cannot be read, OpenNOW falls back to sending the remote paste shortcut.

Microphone

ModeBehavior
disabledNo microphone capture
push-to-talkHold/toggle the configured microphone shortcut to transmit
voice-activityKeep microphone capture active when enabled

Additional settings:

SettingPurpose
microphoneDeviceIdPreferred input device; empty means system default
shortcutToggleMicrophoneDefault Ctrl+Shift+M
hideStreamButtonsHide stream overlay controls including microphone/fullscreen/end-session buttons

In web mode, MicrophoneManager adds the microphone track to the renderer RTCPeerConnection.

Controller mode UI

Controller mode changes navigation and layout, not the underlying GFN input protocol.

SettingDescription
controllerModeEnable controller-first library layout
launchInConsoleModeLaunch sessions with GFN's TV/console-style app launch mode and fullscreen controller shell
autoFullScreenAuto-enter fullscreen when controller mode triggers it

Queue/server selection and wait-time screens still apply in controller mode; controller-friendly loading surfaces are UI wrappers around the same CloudMatch launch state.

Data channels

ChannelReliabilityTraffic
input_channel_v1ordered, reliableKeyboard and control messages
input_channel_partially_reliableunordered, partially reliableMouse deltas and gamepad state

See WebRTC for signaling/data-channel negotiation and Native Streamer for native protocol input events.

On this page

On this page