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.
| Platform | Formats | Notes |
|---|---|---|
| Windows x64 | NSIS installer, portable .exe, updater metadata | Experimental native streamer is available and bundles a private GStreamer runtime |
| Windows ARM64 | NSIS installer, portable .exe | Release download only; no native streamer build in the release matrix |
| macOS x64 / arm64 | .dmg, .zip | Web streamer remains the default; experimental native streamer builds can use the bundled GStreamer runtime |
| Linux x64 / arm64 | .AppImage, .deb | Web streamer remains the default; experimental native mode uses host distro GStreamer packages, and auto-updates are supported for AppImage and Debian-compatible .deb installs |
| iOS | TestFlight beta | Install 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
- Open OpenNOW.
- Choose a provider if prompted.
- Sign in through the browser-based NVIDIA OAuth flow, or use Sign in with QR to authorize from another device.
- Browse your library or the public catalog, and use Settings to link/resync supported store accounts when GFN requires account connections for owned games.
- 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.
- 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
gstreamerbackend
git clone https://github.com/OpenCloudGaming/OpenNOW.git
cd OpenNOW/opennow-stable
npm install
cd ..
npm run devCommon root scripts:
| Command | Description |
|---|---|
npm run dev | Start development mode |
npm run build | Build production bundles |
npm run native:check | Check the Rust native streamer crate |
npm run native:build | Build the Rust native streamer |
npm run typecheck | Run TypeScript checks |
npm run dist | Build unsigned packages |
npm run dist:signed | Build signed packages when signing is configured |
Packaged output is written under opennow-stable/dist-release/.
Local data
| Data | Location |
|---|---|
| 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/ |
Close the app before deleting these files to reset local state.