Configuration
Settings model, defaults, compatibility normalization, and storage for OpenNOW
OpenNOW persists user settings as JSON at app.getPath("userData")/settings.json. The source model is Settings in opennow-stable/src/shared/gfn/settings.ts; defaults and compatibility rules live in opennow-stable/src/main/settings.ts.
File locations
| Data | Path |
|---|---|
| Settings | app.getPath("userData")/settings.json |
| Auth state | app.getPath("userData")/auth-state.json |
| Stable CloudMatch device ID | app.getPath("userData")/gfn-device-id.json |
| App language | Browser localStorage key opennow.locale |
| Thumbnail cache | app.getPath("userData")/media-thumbs/ |
| Screenshots | app.getPath("pictures")/OpenNOW/Screenshots/ |
| Recordings | app.getPath("pictures")/OpenNOW/Recordings/ |
Video, stream, and native settings
| Setting | Type | Default | Description |
|---|---|---|---|
resolution | string | "1920x1080" | Stream resolution |
aspectRatio | AspectRatio | "16:9" | 16:9, 16:10, 21:9, or 32:9 |
posterSizeScale | number | 1.05 | Library poster scaling |
fps | number | 60 | Target frame rate |
maxBitrateMbps | number | 75 | Maximum stream bitrate in Mbps |
recordingBitrateMbps | number | null | null | Recording video bitrate in Mbps; null leaves bitrate selection to MediaRecorder |
streamClientMode | StreamClientMode | "web" | Renderer WebRTC by default; experimental native mode starts the Rust streamer on supported desktop platforms |
nativeStreamerBackend | NativeStreamerBackendPreference | "gstreamer" | Compatibility currently forces gstreamer |
nativeVideoBackend | NativeVideoBackendPreference | "auto" | Normalized to auto, d3d11, d3d12, or vulkan |
nativeStreamerExecutablePath | string | "" | Optional explicit native streamer path |
nativeCloudGsyncMode | NativeStreamerFeatureMode | "auto" | Native Cloud G-Sync/VRR mode |
nativeD3dFullscreenMode | NativeStreamerFeatureMode | "auto" | Windows native fullscreen behavior |
nativeExternalRenderer | boolean | false | Optional separate native renderer window; compatibility disables it outside Windows |
transportMode | StreamTransportMode | "webrtc" | Native media transport; legacy nvst values normalize back to WebRTC |
showNativeStreamerStats | boolean | false | Show the native streamer's own stats overlay during native streaming |
codec | VideoCodec | "H264" | Stream codec preference: H264, H265, or AV1 |
colorQuality | ColorQuality | "8bit_420" | Bit-depth/chroma preference: 8bit_420, 8bit_444, 10bit_420, or 10bit_444; 10-bit color is treated separately from HDR |
decoderPreference | string | "auto" | Decoder preference hint: auto, hardware, or software; read before Electron startup to choose Chromium acceleration switches |
encoderPreference | string | "auto" | Encoder preference hint: auto, hardware, or software; read before Electron startup to choose Chromium acceleration switches and sent with stream preferences |
region | string | "" | Preferred region URL; empty means auto |
sessionProxyEnabled | boolean | false | Use an explicit proxy for session/signaling requests |
sessionProxyUrl | string | "" | Proxy URL when enabled |
gameLanguage | GameLanguage | "en_US" | Game language sent to GFN |
enablePersistingInGameSettings | boolean | false | Request NVIDIA's per-game in-game graphics/settings persistence on new sessions |
enableL4S | boolean | false | Request L4S behavior where supported |
enableCloudGsync | boolean | false | User-facing Cloud G-Sync/VRR preference |
nativeTransitionDiagnostics | internal/optional | undefined | Native transition diagnostics state |
videoShader | VideoShaderSettings | disabled, sharpen 40, neutral color values | Web-mode GPU post-processing shader settings |
Native streamer settings control an experimental opt-in path. Keep streamClientMode at the default "web" unless you are testing native streaming and expect possible platform-specific fallback behavior.
After sign-in, Settings fetches the current MES subscription from https://mes.geforcenow.com/v4/subscriptions and uses its entitled width/height/framesPerSecond profiles to filter the resolution and FPS menus. If a saved profile is no longer entitled, OpenNOW normalizes it to the closest entitled profile before launch; if the subscription response has no entitlement list, the app keeps the safe 1920x1080/60 fallback instead of exposing the static high-end presets.
Codec diagnostics in Settings are renderer session state, not persisted settings.json fields. They test H.264, H.265, and AV1 browser decode/encode support, whether Chromium reports GPU-backed acceleration, and store the latest results in sessionStorage under opennow.codec-test-results.v1. On Linux, a software-only or missing-H.265 result shows a VA-API setup hint: AppImage builds still use the host distro codec/driver stack, and proprietary NVIDIA systems may need distro codec packages plus libva-nvidia-driver/nvidia-vaapi-driver even after OpenNOW's restart-applied NVIDIA VA-API flags are enabled.
Input and shortcuts
| Setting | Type | Default | Description |
|---|---|---|---|
clipboardPaste | boolean | false | Paste clipboard text into the stream |
enableGyroscopeControls | boolean | false | Experimental controller motion-sensor input mapping for gyro aiming when the input backend supports it |
steamControllerCompatibilityMode | boolean | false | macOS-only Chromium HID compatibility workaround for Steam Controller input |
nativeCursorOverlay | boolean | true | Use the WebRTC cursor data channel overlay instead of leaving cursor rendering to the stream |
mouseSensitivity | number | 1 | Relative mouse delta multiplier |
mouseAcceleration | number | 1 | Acceleration strength clamped to 1–150 |
shortcutToggleStats | string | "F3" | Toggle stats overlay |
shortcutTogglePointerLock | string | "F8" | Toggle pointer lock |
shortcutToggleFullscreen | string | "F10" | Toggle fullscreen |
shortcutStopStream | string | "Ctrl+Shift+Q" | Stop session |
shortcutToggleAntiAfk | string | "Ctrl+Shift+K" | Toggle anti-AFK |
shortcutToggleMicrophone | string | "Ctrl+Shift+M" | Toggle microphone |
shortcutScreenshot | string | "F11" | Screenshot |
shortcutToggleRecording | string | "F12" | Start/stop recording |
keyboardLayout | KeyboardLayout | default keyboard layout | Keyboard scan-code layout used for input mapping |
allowEscapeToExitFullscreen | boolean | false | Let Escape exit fullscreen when enabled |
Microphone and stream UI
| Setting | Type | Default | Description |
|---|---|---|---|
microphoneMode | MicrophoneMode | "disabled" | Disabled, push-to-talk, or voice-activity |
microphoneDeviceId | string | "" | Preferred input device ID |
hideStreamButtons | boolean | false | Hide stream overlay buttons |
showAntiAfkIndicator | boolean | true | Show anti-AFK status indicator |
showStatsOnLaunch | boolean | false | Open stats overlay when a session starts |
hideServerSelector | boolean | false | Skip/hide queue server selector UI where possible |
sessionCounterEnabled | boolean | false | Enable session timer display behavior |
showSessionTimeRemainingInStatsOverlay | boolean | false | Show the GFN session-limit countdown in the stats overlay |
sessionClockShowEveryMinutes | number | 60 | Re-show the session timer every N minutes |
sessionClockShowDurationSeconds | number | 30 | Duration for each session timer display |
appAccentColor | AppAccentColor | "green" | Desktop UI accent preset: green, blue, violet, amber, or rose |
appTheme | AppTheme | "auto" | UI theme: light, dark, or auto |
translucentUI | boolean | false | Use translucent settings/nav overlay surfaces |
Controller, window, and app behavior
| Setting | Type | Default | Description |
|---|---|---|---|
controllerMode | boolean | false | Controller-first library UI |
launchInConsoleMode | boolean | false | Launch sessions with GFN's TV/console app launch mode and fullscreen controller shell |
autoFullScreen | boolean | false | Auto-enter fullscreen when controller mode triggers it |
favoriteGameIds | string[] | [] | Saved favorites |
windowWidth | number | 1400 | Last window width |
windowHeight | number | 900 | Last window height |
discordRichPresence | boolean | false | Enable Discord Rich Presence |
autoCheckForUpdates | boolean | true | Check for app updates automatically |
updateChannel | UpdateChannel | "stable" | Updater channel: stable releases or opt-in nightly previews |
lastSeenReleaseHighlightsVersion | string | "" | Last app version for which the What's New modal was acknowledged |
Updates and build metadata
The About settings page gets update state from opennow-stable/src/main/updater.ts. Packaged builds check GitHub Releases automatically 12 seconds after startup and then every 6 hours when autoCheckForUpdates is enabled; manual checks, downloads, and restart-to-install actions use the same updater controller. The updater does not auto-download or auto-install updates, can use OPENNOW_GH_TOKEN or GH_TOKEN for GitHub Releases requests, and applies updateChannel through opennow-stable/src/main/updateChannel.ts: stable uses the latest feed without prereleases, while nightly uses the nightly feed with prereleases enabled and downgrade checks disabled.
Linux updater support is gated by the package type detected in opennow-stable/src/main/linuxUpdaterSupport.ts. AppImage installs are supported when the APPIMAGE environment variable is present, and .deb updates are supported only on Debian-compatible systems with dpkg or apt available. Other Linux installs report updates as disabled and direct users to the GitHub Releases AppImage or a Debian/Ubuntu package instead of trying an incompatible .deb updater path.
opennow-stable/src/main/appBuildInfo.ts combines app.getVersion() with build metadata embedded by electron.vite.config.ts. OPENNOW_BUILD_NUMBER, BUILD_NUMBER, or GITHUB_RUN_NUMBER becomes currentBuildNumber; OPENNOW_BUILD_COMMIT or GITHUB_SHA becomes the embedded commit. The Settings UI displays currentDisplayVersion, which is the package version plus (build N) when a build number is available. In unpackaged development mode, updater state is disabled but still reports the same build-info fields.
App language
App language is selected in Settings, but it is renderer UI state rather than a Settings JSON field. The selected locale is stored in browser localStorage as opennow.locale; when unset or invalid, OpenNOW falls back to the browser locale and then English. Translation files are loaded from locales/*.json, with locales/en.json as the English source file.
Compatibility rules
On load, OpenNOW merges saved settings with defaults, migrates legacy values, then saves the file if anything changed.
- Codec and color-quality values are normalized to the supported user-facing enum values. The default stream preference is H.264 +
8bit_420; 10-bit color depth does not enable HDR, which is still hardcoded off until a separate HDR toggle exists. streamClientMode: "native"is normalized back to"web"only when the app is running on an unsupported desktop platform.nativeStreamerBackendis forced togstreamer.nativeExternalRendereris honored only on Windows and is normalized tofalseelsewhere.transportModeis forced towebrtc; legacynvstvalues are migrated away until that transport is complete.nativeVideoBackendis normalized toauto,d3d11,d3d12, orvulkan.updateChannelis normalized tostableornightly.appThemeis normalized tolight,dark, orauto;translucentUIis normalized to a boolean.steamControllerCompatibilityModeis normalized to a boolean.videoShaderis normalized to safe UI ranges: sharpen 0–100, saturation 0–200, contrast/brightness 50–150, vibrance 0–100, and film grain 0–100.- Old macOS-style default shortcuts are migrated to the current
Ctrl+Shift+...defaults. mouseAccelerationis clamped to 1–150; legacy booleans become100or1.recordingBitrateMbpsis rounded and clamped to 1–200 Mbps; invalid, missing, ornullvalues use automaticMediaRecorderbitrate selection.appAccentColoris normalized togreen,blue,violet,amber, orrose.- The short-lived legacy
sessionTimeRemainingDisplay: "stats" | "both"value migrates toshowSessionTimeRemainingInStatsOverlay: trueand is removed from saved settings.