OpenNOW
Guides

Getting Started

Download, install, first launch, and source builds for OpenNOW

OpenNOW is an open-source desktop client for GeForce NOW. The current app is the Electron client in opennow-stable/.

Download a release

Grab the latest build from GitHub Releases.

PlatformFormatsNotes
Windows x64NSIS installer, portable .exe, updater metadataExperimental native streamer is available and bundles a private GStreamer runtime
Windows ARM64NSIS installer, portable .exeRelease download only; no native streamer build in the release matrix
macOS x64 / arm64.dmg, .zipWeb streamer remains the default; experimental native streamer builds can use the bundled GStreamer runtime
Linux x64 / arm64.AppImage, .debWeb streamer remains the default; experimental native mode uses host distro GStreamer packages, and auto-updates are supported for AppImage and Debian-compatible .deb installs
iOSTestFlight betaInstall through Apple's TestFlight while the iOS build is in beta

Desktop artifact names use the app version, platform, and architecture, such as OpenNOW-v{version}-setup-x64.exe, OpenNOW-v{version}-mac-arm64.dmg, or OpenNOW-v{version}-linux-x64.AppImage.

First launch

  1. Open OpenNOW.
  2. Choose a provider if prompted.
  3. Sign in through the browser-based NVIDIA OAuth flow, or use Sign in with QR to authorize from another device.
  4. Browse your library or the public catalog, and use Settings to link/resync supported store accounts when GFN requires account connections for owned games.
  5. Open Settings to choose bitrate, codec, region, app language, controller mode, and other preferences. Resolution and FPS choices are filtered to the profiles reported by your current GFN subscription.
  6. Launch a game. Queue and server-selection screens appear when GFN requires them.

Some GFN catalog entries require a specific membership tier. When NVIDIA reports INSUFFICIENT_PLAYABILITY, OpenNOW shows a membership-upgrade launch error instead of treating it as a duplicate-session conflict. If the catalog provides SKU-specific text or a minimum membership label, that text is used in the launch-error panel.

By default OpenNOW streams through Chromium/WebRTC in the renderer. The optional native streamer mode is experimental on supported desktop platforms and uses a Rust child process with a GStreamer backend for video decode/rendering while Electron still owns session lifecycle and signaling. Native mode may have platform-specific bugs or missing media capabilities; if the platform, native executable, backend, protocol, runtime, or media capability is unavailable, OpenNOW reports the reason and falls back to the web streamer path. Report native-streamer issues on GitHub Issues or Discord.

On Linux, native mode uses system GStreamer libraries and plugins rather than a bundled private runtime. Install base/good/bad/ugly/libav plugins plus VAAPI, V4L2, GL, Vulkan, and driver packages where your distro provides them.

Build from source

Prerequisites:

  • Node.js 22
  • npm
  • Git
  • Rust/Cargo for native streamer work
  • GStreamer development packages when building the native gstreamer backend
git clone https://github.com/OpenCloudGaming/OpenNOW.git
cd OpenNOW/opennow-stable
npm install
cd ..
npm run dev

Common root scripts:

CommandDescription
npm run devStart development mode
npm run buildBuild production bundles
npm run native:checkCheck the Rust native streamer crate
npm run native:buildBuild the Rust native streamer
npm run typecheckRun TypeScript checks
npm run distBuild unsigned packages
npm run dist:signedBuild signed packages when signing is configured

Packaged output is written under opennow-stable/dist-release/.

Local data

DataLocation
Settingsapp.getPath("userData")/settings.json
Auth stateapp.getPath("userData")/auth-state.json
Stable CloudMatch device IDapp.getPath("userData")/gfn-device-id.json
App languageBrowser localStorage key opennow.locale
Thumbnail cacheapp.getPath("userData")/media-thumbs/
Screenshotsapp.getPath("pictures")/OpenNOW/Screenshots/
Recordingsapp.getPath("pictures")/OpenNOW/Recordings/

Close the app before deleting these files to reset local state.

On this page

On this page