OpenNOW is a native macOS cloud gaming client for browsing, launching, streaming, and recording GeForce NOW sessions.
The repository contains a SwiftUI app target plus service, protocol, authentication, streaming, telemetry, and a root Swift package for tests. The visible frontend lives under View and includes:
- OAuth sign-in and branded loading surfaces
- Catalog home with a six-image hero rotation, game rails, search, filters, and detail panels
- Persistent favorites and library rails for quick game access across restarts
- Store ownership picker and launch/session overlays
- Native WebRTC streaming with input, microphone, audio, video enhancement, and diagnostics paths
- Local gameplay recordings with saved metadata and a recordings browser
- Settings for account, connections, gameplay, server location, upscaling, system, and diagnostics
Model- persisted SwiftData models, DTOs, stream value types, Twitch realtime models, and catalog value objectsOpenNOWApp.swift- macOS app entry point and application delegateResources- bundled images, fonts, and store icon assetsView- SwiftUI/AppKit views, stream host views, design primitives, and asset catalogsViewModel- observable UI state and presentation coordination for login, catalog, controller catalog, and recordingsOPN- authentication, catalog/session services, native WebRTC, telemetry, Twitch, preferences, logging, and app infrastructureGFN- protocol-specific GeForce NOW clients and wire types, including CloudMatch, GDN, Jarvis, LCARS, NesAuth, NetworkTest, NVST, Starfleet, and UDSTests- root SwiftPM test target covering the package-exposed production logic
The root Package.swift exposes a testable OpenNOW library target over non-app-entry production logic from Model, OPN, and GFN. The Xcode app target compiles all five production directories, including View and ViewModel.
Build the macOS app from the repository root:
xcodebuild build -project OpenNOW.xcodeproj -scheme OpenNOW -configuration Debug -destination platform=macOS CODE_SIGNING_ALLOWED=NORun package tests from the repository root so SwiftPM uses one shared .build graph:
swift test --scratch-path .build/sharedUseful focused checks:
swift test --scratch-path .build/shared --filter WebRTCStreamRecordingswift test --scratch-path .build/shared --filter OpenNOWGameServicesTestsAvoid package-local build directories during normal development. Use the root package and shared scratch path so generated SwiftPM state stays in one place and large binary artifacts such as sentry-cocoa are not duplicated.
To audit generated SwiftPM disk usage:
scripts/report-spm-build-size.shTo remove generated SwiftPM build caches and reclaim disk space:
scripts/clean-spm-builds.shPerformance audit entry points are documented under scripts/perf-audit/PERFORMANCE_AUDIT.md.
Use conventional commit prefixes such as fix:, feat:, docs:, test:, refactor:, style:, and chore:. Keep changes focused and verify the relevant package tests or app build before submitting changes.