# Input (/docs/reference/input)





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 [#default-shortcuts]

| Shortcut       | Action               |
| -------------- | -------------------- |
| `F3`           | Toggle stats overlay |
| `F8`           | Toggle pointer lock  |
| `F10`          | Toggle fullscreen    |
| `F11`          | Take screenshot      |
| `F12`          | Start/stop recording |
| `Ctrl+Shift+Q` | Stop session         |
| `Ctrl+Shift+K` | Toggle anti-AFK      |
| `Ctrl+Shift+M` | Toggle 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]

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-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 [#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-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 [#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 [#microphone]

| Mode             | Behavior                                                   |
| ---------------- | ---------------------------------------------------------- |
| `disabled`       | No microphone capture                                      |
| `push-to-talk`   | Hold/toggle the configured microphone shortcut to transmit |
| `voice-activity` | Keep microphone capture active when enabled                |

Additional settings:

| Setting                    | Purpose                                                                          |
| -------------------------- | -------------------------------------------------------------------------------- |
| `microphoneDeviceId`       | Preferred input device; empty means system default                               |
| `shortcutToggleMicrophone` | Default `Ctrl+Shift+M`                                                           |
| `hideStreamButtons`        | Hide 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-ui]

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

| Setting               | Description                                                                                 |
| --------------------- | ------------------------------------------------------------------------------------------- |
| `controllerMode`      | Enable controller-first library layout                                                      |
| `launchInConsoleMode` | Launch sessions with GFN's TV/console-style app launch mode and fullscreen controller shell |
| `autoFullScreen`      | Auto-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 [#data-channels]

<DataChannelsTable />

See [WebRTC](/docs/reference/webrtc/) for signaling/data-channel negotiation and [Native Streamer](/docs/reference/native-streamer/) for native protocol input events.
