Skip to content

Merge latest updates upstream - #756

Merged
Kief5555 merged 145 commits into
mainfrom
dev
Aug 14, 2026
Merged

Merge latest updates upstream#756
Kief5555 merged 145 commits into
mainfrom
dev

Conversation

@Kief5555

@Kief5555 Kief5555 commented Aug 14, 2026

Copy link
Copy Markdown
Collaborator

Summary

Merge the latest dev changes into main, bringing the desktop app's streaming reliability, diagnostics, controller-first experience, settings, catalog, reporting, and platform improvements upstream.

This is an aggregate release sync containing 144 commits across 280 files.

Highlights

Streaming, media, and input reliability

  • Preserve gameplay interaction and pointer capture around Escape/unlock flows.
  • Prevent recursive mouse-flush scheduling and tolerate closed output/streamer pipes.
  • Recover shader and audio playback more reliably and harden media lifecycles.
  • Align SDP and bandwidth estimation with the official client.
  • Add capability-aware codec selection with bounded negotiation fallback.
  • Harden authentication, external lifecycle handling, and authorized CloudMatch endpoints.

Related PRs: #711, #712, #713, #714, #715, #720, #722, #728, #735.

Diagnostics, recording, and support

  • Add distinct server, receive, decode, render, ICE, capacity, and session-location telemetry.
  • Add configurable compact and full GFN-style stats HUD modes.
  • Report accurate region and server GPU information.
  • Harden browser recording with presented-frame capture, ordered chunk persistence, and reliable finalization.
  • Add desktop bug reporting and session summaries.

Related PRs: #723, #724, #725, #748, #749.

Controller and console experience

  • Add a controller-first console mode with PIN-protected profiles.
  • Harden profile PIN and controller navigation flows.
  • Suggest controller mode when a gamepad connects and allow the prompt to be controlled by gamepad.
  • Polish the controller-mode prompt and shared action glyphs.

Related PRs: #697, #741, #742, #747.

Catalog, settings, and in-app UX

  • Add game details, including premium membership requirements.
  • Reorganize stream and diagnostics settings while preserving persisted values and legacy search aliases.
  • Add a compact settings icon rail.
  • Add recurring anti-AFK reminders, queue ad mute controls, and an account-menu exit action.
  • Improve runtime performance and repair light-theme behavior.

Related PRs: #721, #726, #729, #731, #733, #739, #744, #751.

Platform, release, and localization

  • Restore the Linux app icon under Wayland.
  • Support an isolated secondary desktop app instance.
  • Keep release changelog comparisons current.
  • Refresh dependencies and include the latest Crowdin-generated translations.

Related PRs: #675, #732, #736, #740, #743, #755.

Validation

This sync is covered by the GitHub Actions desktop build matrix for macOS, Windows, and Linux on x64/arm64, together with CodeQL analysis. See the PR checks for the current results.

Summary by CodeRabbit

  • New Features
    • Added a controller-friendly console mode with profile selection, PIN protection, game browsing, details, store variants, and controller navigation.
    • Added configurable stream recording quality, enhanced statistics overlays, session reports, and recurring anti-idle reminders.
    • Added desktop bug reporting with optional logs and session diagnostics.
    • Added codec selection and fallback support, GPU details, server location, transport, and game-FPS diagnostics.
    • Added broader localization coverage across supported languages.
  • Bug Fixes
    • Improved screenshot and recording management, stream recovery, pointer input, audio, video rendering, and account switching reliability.
  • Documentation
    • Documented running two instances on Windows.

Kief5555 and others added 30 commits July 24, 2026 18:04
* fix(input): preserve interaction after Escape unlock

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* fix(input): pin cursor before fallback clicks

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* fix(input): order fallback cursor pins reliably

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

---------

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Co-authored-by: Akamiya Chizui <127862333+Chizuui@users.noreply.github.com>
Co-authored-by: Akamiya Chizui <127862333+Chizuui@users.noreply.github.com>
Adds capability-aware codec selection and bounded negotiation fallback, preserving official-client SDP/BWE behavior while preventing unsupported codec choices from leaving sessions without video.

Co-authored-by: Akamiya Chizui <127862333+Chizuui@users.noreply.github.com>
Adds typed telemetry for server game FPS, receive/decode rates, ICE transport, network capacity, and session location so the compact/full HUD reports distinct measurements accurately.

Co-authored-by: Akamiya Chizui <127862333+Chizuui@users.noreply.github.com>
Adds off, compact, and full frame-stat modes with distinct server, receive, decode, and render telemetry; configurable corner placement; localized diagnostics; and a guarded Ctrl+N shortcut.

Co-authored-by: Akamiya Chizui <127862333+Chizuui@users.noreply.github.com>
…game-details

Show premium membership requirements in game details
@coderabbitai

coderabbitai Bot commented Aug 14, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 8bbe3d51-276d-4cdc-8b85-10502b35a7f1

📥 Commits

Reviewing files that changed from the base of the PR and between 7e1e35d and 603638d.

⛔ Files ignored due to path filters (12)
  • .github/assets/anti-afk-reminders/in-stream-placement.png is excluded by !**/*.png
  • .github/assets/anti-afk-reminders/reminder-closeup.png is excluded by !**/*.png
  • .github/assets/anti-afk-reminders/settings.png is excluded by !**/*.png
  • .github/assets/windows-secondary-instance/concurrent-instances.png is excluded by !**/*.png
  • docs/pr-assets/premium-membership-required.png is excluded by !**/*.png
  • docs/pr-assets/premium-membership-unknown.png is excluded by !**/*.png
  • docs/pr-assets/region-gpu-stats-compact.png is excluded by !**/*.png
  • docs/pr-assets/region-gpu-stats-full.png is excluded by !**/*.png
  • docs/verification/esc-pointer-lock/escape-retains-capture.png is excluded by !**/*.png
  • docs/verification/esc-pointer-lock/f8-restores-capture.png is excluded by !**/*.png
  • opennow-stable/bun.lock is excluded by !**/*.lock
  • opennow-stable/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (268)
  • .gitattributes
  • .github/workflows/auto-build.yml
  • .github/workflows/release.yml
  • .gitignore
  • README.md
  • _tmp-test-out.txt
  • _tmp-typecheck-out.txt
  • locales/de.json
  • locales/en.json
  • locales/es.json
  • locales/fr.json
  • locales/ja.json
  • locales/ko.json
  • locales/nl.json
  • locales/pl.json
  • locales/ro.json
  • locales/ru.json
  • locales/tr.json
  • locales/zh.json
  • opennow-stable/package.json
  • opennow-stable/scripts/run-tests.mjs
  • opennow-stable/src/main/appInstance.test.ts
  • opennow-stable/src/main/appInstance.ts
  • opennow-stable/src/main/gpuInfo.test.ts
  • opennow-stable/src/main/gpuInfo.ts
  • opennow-stable/src/main/index.ts
  • opennow-stable/src/main/installationId.ts
  • opennow-stable/src/main/ipc/accountCatalogHandlers.ts
  • opennow-stable/src/main/ipc/consolePinHandlers.ts
  • opennow-stable/src/main/ipc/coreHandlers.ts
  • opennow-stable/src/main/ipc/sessionHandlers.ts
  • opennow-stable/src/main/media/recordings.ts
  • opennow-stable/src/main/media/screenshots.ts
  • opennow-stable/src/main/nativeStreamer/manager.test.ts
  • opennow-stable/src/main/nativeStreamer/manager.ts
  • opennow-stable/src/main/platforms/gfn/accountConnections.ts
  • opennow-stable/src/main/platforms/gfn/auth.ts
  • opennow-stable/src/main/platforms/gfn/auth/accountManager.test.ts
  • opennow-stable/src/main/platforms/gfn/auth/accountManager.ts
  • opennow-stable/src/main/platforms/gfn/auth/consoleProfileStore.test.ts
  • opennow-stable/src/main/platforms/gfn/auth/consoleProfileStore.ts
  • opennow-stable/src/main/platforms/gfn/auth/oauthFlow.test.ts
  • opennow-stable/src/main/platforms/gfn/auth/oauthFlow.ts
  • opennow-stable/src/main/platforms/gfn/auth/persistedAccountState.ts
  • opennow-stable/src/main/platforms/gfn/auth/pinHash.test.ts
  • opennow-stable/src/main/platforms/gfn/auth/pinHash.ts
  • opennow-stable/src/main/platforms/gfn/auth/pinPolicy.test.ts
  • opennow-stable/src/main/platforms/gfn/auth/pinPolicy.ts
  • opennow-stable/src/main/platforms/gfn/catalogBrowse.ts
  • opennow-stable/src/main/platforms/gfn/cloudmatch.test.ts
  • opennow-stable/src/main/platforms/gfn/cloudmatch.ts
  • opennow-stable/src/main/platforms/gfn/cloudmatchFeatures.ts
  • opennow-stable/src/main/platforms/gfn/cloudmatchSessionParsing.test.ts
  • opennow-stable/src/main/platforms/gfn/cloudmatchSessionParsing.ts
  • opennow-stable/src/main/platforms/gfn/cloudmatchSessionRequest.ts
  • opennow-stable/src/main/platforms/gfn/cloudmatchTransport.test.ts
  • opennow-stable/src/main/platforms/gfn/cloudmatchTransport.ts
  • opennow-stable/src/main/platforms/gfn/gameAppMapper.ts
  • opennow-stable/src/main/platforms/gfn/lcarsGraphql.test.ts
  • opennow-stable/src/main/platforms/gfn/proxyFetch.ts
  • opennow-stable/src/main/platforms/gfn/types.ts
  • opennow-stable/src/main/security/encryptedJsonFile.test.ts
  • opennow-stable/src/main/security/encryptedJsonFile.ts
  • opennow-stable/src/main/security/safeStorageAdapter.ts
  • opennow-stable/src/main/services/cacheManager.ts
  • opennow-stable/src/main/services/desktopBugReportProtocol.test.ts
  • opennow-stable/src/main/services/desktopBugReportProtocol.ts
  • opennow-stable/src/main/services/desktopBugReports.ts
  • opennow-stable/src/main/services/requestTimeout.test.ts
  • opennow-stable/src/main/services/requestTimeout.ts
  • opennow-stable/src/main/settings.ts
  • opennow-stable/src/main/signaling/signalingCoordinator.ts
  • opennow-stable/src/main/telemetry/posthog.ts
  • opennow-stable/src/main/updater.ts
  • opennow-stable/src/main/videoAcceleration.test.ts
  • opennow-stable/src/main/videoAcceleration.ts
  • opennow-stable/src/main/window/externalUrl.test.ts
  • opennow-stable/src/main/window/externalUrl.ts
  • opennow-stable/src/main/window/externalUrlPolicy.ts
  • opennow-stable/src/main/window/mainWindow.ts
  • opennow-stable/src/main/window/rendererLifecycle.test.ts
  • opennow-stable/src/main/window/rendererLifecycle.ts
  • opennow-stable/src/main/window/streamEscapeShortcut.test.ts
  • opennow-stable/src/main/window/streamEscapeShortcut.ts
  • opennow-stable/src/main/window/streamShortcutInterception.test.ts
  • opennow-stable/src/main/window/streamShortcutInterception.ts
  • opennow-stable/src/main/window/windowTheme.test.ts
  • opennow-stable/src/main/window/windowTheme.ts
  • opennow-stable/src/preload/index.ts
  • opennow-stable/src/renderer/index.html
  • opennow-stable/src/renderer/src/App.tsx
  • opennow-stable/src/renderer/src/components/ControllerModePromptModal.tsx
  • opennow-stable/src/renderer/src/components/FeedbackModal.tsx
  • opennow-stable/src/renderer/src/components/GameCard.test.ts
  • opennow-stable/src/renderer/src/components/GameCard.tsx
  • opennow-stable/src/renderer/src/components/GameCardListItem.tsx
  • opennow-stable/src/renderer/src/components/GameDetailModal.tsx
  • opennow-stable/src/renderer/src/components/HomePage.tsx
  • opennow-stable/src/renderer/src/components/LibraryPage.tsx
  • opennow-stable/src/renderer/src/components/LoginScreen.tsx
  • opennow-stable/src/renderer/src/components/Navbar.tsx
  • opennow-stable/src/renderer/src/components/QueueAdPreview.tsx
  • opennow-stable/src/renderer/src/components/SessionReportModal.tsx
  • opennow-stable/src/renderer/src/components/SettingsPage.tsx
  • opennow-stable/src/renderer/src/components/SettingsPageLayout.tsx
  • opennow-stable/src/renderer/src/components/ShaderAtmosphere.tsx
  • opennow-stable/src/renderer/src/components/StatsOverlay.tsx
  • opennow-stable/src/renderer/src/components/StreamStatsHud.tsx
  • opennow-stable/src/renderer/src/components/StreamView.tsx
  • opennow-stable/src/renderer/src/components/console/ConsoleBillboard.tsx
  • opennow-stable/src/renderer/src/components/console/ConsoleGameDetails.tsx
  • opennow-stable/src/renderer/src/components/console/ConsoleHintBar.tsx
  • opennow-stable/src/renderer/src/components/console/ConsoleManageProfiles.tsx
  • opennow-stable/src/renderer/src/components/console/ConsoleOverlay.tsx
  • opennow-stable/src/renderer/src/components/console/ConsolePinPad.tsx
  • opennow-stable/src/renderer/src/components/console/ConsolePosterCard.tsx
  • opennow-stable/src/renderer/src/components/console/ConsoleProfileGate.tsx
  • opennow-stable/src/renderer/src/components/console/ConsoleProfilePicker.tsx
  • opennow-stable/src/renderer/src/components/console/ConsoleProfileTile.tsx
  • opennow-stable/src/renderer/src/components/console/ConsoleRow.tsx
  • opennow-stable/src/renderer/src/components/console/ConsoleSplash.tsx
  • opennow-stable/src/renderer/src/components/console/ConsoleStorePicker.tsx
  • opennow-stable/src/renderer/src/components/console/ConsoleStoreView.tsx
  • opennow-stable/src/renderer/src/components/library/ControllerGameCard.tsx
  • opennow-stable/src/renderer/src/components/library/LibraryControllerView.tsx
  • opennow-stable/src/renderer/src/components/settings/SettingsNav.tsx
  • opennow-stable/src/renderer/src/components/settings/sections/SettingsAboutSection.tsx
  • opennow-stable/src/renderer/src/components/settings/sections/SettingsAudioSection.tsx
  • opennow-stable/src/renderer/src/components/settings/sections/SettingsConsoleSection.tsx
  • opennow-stable/src/renderer/src/components/settings/sections/SettingsDiagnosticsSection.tsx
  • opennow-stable/src/renderer/src/components/settings/sections/SettingsGameSection.tsx
  • opennow-stable/src/renderer/src/components/settings/sections/SettingsInputSection.tsx
  • opennow-stable/src/renderer/src/components/settings/sections/SettingsInterfaceSection.tsx
  • opennow-stable/src/renderer/src/components/settings/sections/SettingsNativeStreamerSection.tsx
  • opennow-stable/src/renderer/src/components/settings/sections/SettingsStreamSection.tsx
  • opennow-stable/src/renderer/src/components/settings/sections/SettingsThanksSection.tsx
  • opennow-stable/src/renderer/src/components/settings/settingsFormatters.ts
  • opennow-stable/src/renderer/src/components/settings/settingsSearch.test.ts
  • opennow-stable/src/renderer/src/components/settings/settingsSearch.ts
  • opennow-stable/src/renderer/src/components/settings/settingsTypes.ts
  • opennow-stable/src/renderer/src/components/settings/stream/BrowserRecordingSection.tsx
  • opennow-stable/src/renderer/src/components/settings/stream/CodecDiagnosticsSection.tsx
  • opennow-stable/src/renderer/src/components/settings/stream/RegionSelectionSection.tsx
  • opennow-stable/src/renderer/src/components/settings/stream/SessionProxySettings.tsx
  • opennow-stable/src/renderer/src/components/settings/stream/StatsOverlayControls.tsx
  • opennow-stable/src/renderer/src/components/settings/stream/StreamQualityControls.tsx
  • opennow-stable/src/renderer/src/components/settings/stream/StreamSessionOptions.tsx
  • opennow-stable/src/renderer/src/components/settings/stream/StreamVideoSection.tsx
  • opennow-stable/src/renderer/src/components/settings/stream/VideoShaderControls.tsx
  • opennow-stable/src/renderer/src/components/stream/antiAfkReminder.test.ts
  • opennow-stable/src/renderer/src/components/stream/antiAfkReminder.ts
  • opennow-stable/src/renderer/src/components/stream/quick-menu/StreamQuickMenu.tsx
  • opennow-stable/src/renderer/src/components/stream/quick-menu/StreamQuickMenuMediaPage.tsx
  • opennow-stable/src/renderer/src/hooks/streamSession/useGameLaunch.ts
  • opennow-stable/src/renderer/src/hooks/streamSession/useSignalingEvents.ts
  • opennow-stable/src/renderer/src/hooks/streamSession/useStreamRuntimeState.ts
  • opennow-stable/src/renderer/src/hooks/useAuthSession.ts
  • opennow-stable/src/renderer/src/hooks/useCatalogData.ts
  • opennow-stable/src/renderer/src/hooks/useConsoleImageWidths.ts
  • opennow-stable/src/renderer/src/hooks/useConsoleShell.ts
  • opennow-stable/src/renderer/src/hooks/useControllerFocusScroll.ts
  • opennow-stable/src/renderer/src/hooks/useControllerModePrompt.test.ts
  • opennow-stable/src/renderer/src/hooks/useControllerModePrompt.ts
  • opennow-stable/src/renderer/src/hooks/useControllerNavigation.ts
  • opennow-stable/src/renderer/src/hooks/useStreamMenuNavigation.ts
  • opennow-stable/src/renderer/src/hooks/useStreamRecorder.ts
  • opennow-stable/src/renderer/src/i18n.ts
  • opennow-stable/src/renderer/src/lib/appLaunchMode.test.ts
  • opennow-stable/src/renderer/src/lib/appLaunchMode.ts
  • opennow-stable/src/renderer/src/lib/codecDiagnostics.test.ts
  • opennow-stable/src/renderer/src/lib/codecDiagnostics.ts
  • opennow-stable/src/renderer/src/lib/consoleGameMedia.ts
  • opennow-stable/src/renderer/src/lib/consoleImageSizing.test.ts
  • opennow-stable/src/renderer/src/lib/consoleImageSizing.ts
  • opennow-stable/src/renderer/src/lib/consoleLibraryRows.test.ts
  • opennow-stable/src/renderer/src/lib/consoleLibraryRows.ts
  • opennow-stable/src/renderer/src/lib/consolePinInput.test.ts
  • opennow-stable/src/renderer/src/lib/consolePinInput.ts
  • opennow-stable/src/renderer/src/lib/consoleRowFocus.test.ts
  • opennow-stable/src/renderer/src/lib/consoleRowFocus.ts
  • opennow-stable/src/renderer/src/lib/consoleShellState.test.ts
  • opennow-stable/src/renderer/src/lib/consoleShellState.ts
  • opennow-stable/src/renderer/src/lib/consoleStoreChoices.test.ts
  • opennow-stable/src/renderer/src/lib/consoleStoreChoices.ts
  • opennow-stable/src/renderer/src/lib/controllerCatalogUi.test.ts
  • opennow-stable/src/renderer/src/lib/controllerCatalogUi.ts
  • opennow-stable/src/renderer/src/lib/controllerInputState.test.ts
  • opennow-stable/src/renderer/src/lib/controllerInputState.ts
  • opennow-stable/src/renderer/src/lib/controllerKeyboard.ts
  • opennow-stable/src/renderer/src/lib/gameCardStores.ts
  • opennow-stable/src/renderer/src/lib/gameCatalog.ts
  • opennow-stable/src/renderer/src/lib/libraryFilters.ts
  • opennow-stable/src/renderer/src/lib/pointerLock.test.ts
  • opennow-stable/src/renderer/src/lib/pointerLock.ts
  • opennow-stable/src/renderer/src/lib/premiumMembership.test.ts
  • opennow-stable/src/renderer/src/lib/premiumMembership.ts
  • opennow-stable/src/renderer/src/lib/queueAds.test.ts
  • opennow-stable/src/renderer/src/lib/queueAds.ts
  • opennow-stable/src/renderer/src/lib/recordingCapture.test.ts
  • opennow-stable/src/renderer/src/lib/recordingCapture.ts
  • opennow-stable/src/renderer/src/lib/recordingChunkQueue.test.ts
  • opennow-stable/src/renderer/src/lib/recordingChunkQueue.ts
  • opennow-stable/src/renderer/src/lib/streamDiagnostics.test.ts
  • opennow-stable/src/renderer/src/lib/streamDiagnostics.ts
  • opennow-stable/src/renderer/src/lib/streamSessionHelpers.test.ts
  • opennow-stable/src/renderer/src/lib/streamSessionHelpers.ts
  • opennow-stable/src/renderer/src/main.tsx
  • opennow-stable/src/renderer/src/platforms/gfn/keyboardMapping.ts
  • opennow-stable/src/renderer/src/platforms/gfn/microphoneManager.test.ts
  • opennow-stable/src/renderer/src/platforms/gfn/microphoneManager.ts
  • opennow-stable/src/renderer/src/platforms/gfn/sdp.test.ts
  • opennow-stable/src/renderer/src/platforms/gfn/sdp.ts
  • opennow-stable/src/renderer/src/platforms/gfn/sdp/codec.test.ts
  • opennow-stable/src/renderer/src/platforms/gfn/sdp/codec.ts
  • opennow-stable/src/renderer/src/platforms/gfn/sdp/nvstOffer.test.ts
  • opennow-stable/src/renderer/src/platforms/gfn/sdp/nvstOffer.ts
  • opennow-stable/src/renderer/src/platforms/gfn/videoShaderPipeline.test.ts
  • opennow-stable/src/renderer/src/platforms/gfn/videoShaderPipeline.ts
  • opennow-stable/src/renderer/src/platforms/gfn/webrtc/codecNegotiation.test.ts
  • opennow-stable/src/renderer/src/platforms/gfn/webrtc/codecNegotiation.ts
  • opennow-stable/src/renderer/src/platforms/gfn/webrtc/codecPreferences.test.ts
  • opennow-stable/src/renderer/src/platforms/gfn/webrtc/codecPreferences.ts
  • opennow-stable/src/renderer/src/platforms/gfn/webrtc/controllers.test.ts
  • opennow-stable/src/renderer/src/platforms/gfn/webrtc/decoderPressureController.ts
  • opennow-stable/src/renderer/src/platforms/gfn/webrtc/domInputCaptureController.test.ts
  • opennow-stable/src/renderer/src/platforms/gfn/webrtc/domInputCaptureController.ts
  • opennow-stable/src/renderer/src/platforms/gfn/webrtc/iceTransportStats.test.ts
  • opennow-stable/src/renderer/src/platforms/gfn/webrtc/iceTransportStats.ts
  • opennow-stable/src/renderer/src/platforms/gfn/webrtc/peerMediaLifecycleController.test.ts
  • opennow-stable/src/renderer/src/platforms/gfn/webrtc/peerMediaLifecycleController.ts
  • opennow-stable/src/renderer/src/platforms/gfn/webrtc/senderBitrate.test.ts
  • opennow-stable/src/renderer/src/platforms/gfn/webrtc/senderBitrate.ts
  • opennow-stable/src/renderer/src/platforms/gfn/webrtc/sessionDiagnostics.test.ts
  • opennow-stable/src/renderer/src/platforms/gfn/webrtc/sessionDiagnostics.ts
  • opennow-stable/src/renderer/src/platforms/gfn/webrtc/statsChannel.test.ts
  • opennow-stable/src/renderer/src/platforms/gfn/webrtc/statsChannel.ts
  • opennow-stable/src/renderer/src/platforms/gfn/webrtc/streamDiagnosticsTypes.ts
  • opennow-stable/src/renderer/src/platforms/gfn/webrtc/streamStatsHelpers.test.ts
  • opennow-stable/src/renderer/src/platforms/gfn/webrtc/streamStatsHelpers.ts
  • opennow-stable/src/renderer/src/platforms/gfn/webrtcClient.ts
  • opennow-stable/src/renderer/src/shortcuts.ts
  • opennow-stable/src/renderer/src/styles.css
  • opennow-stable/src/renderer/src/styles/console.css
  • opennow-stable/src/renderer/src/telemetry/posthog.ts
  • opennow-stable/src/renderer/src/utils/sessionReport.test.ts
  • opennow-stable/src/renderer/src/utils/sessionReport.ts
  • opennow-stable/src/renderer/src/utils/shortcutCaptureFocus.test.ts
  • opennow-stable/src/renderer/src/utils/shortcutCaptureFocus.ts
  • opennow-stable/src/renderer/src/utils/streamQualityPresets.ts
  • opennow-stable/src/renderer/src/utils/streamStatsHud.test.ts
  • opennow-stable/src/renderer/src/utils/streamStatsHud.ts
  • opennow-stable/src/shared/bugReport.ts
  • opennow-stable/src/shared/gfn.test.ts
  • opennow-stable/src/shared/gfn/api.ts
  • opennow-stable/src/shared/gfn/auth.ts
  • opennow-stable/src/shared/gfn/index.ts
  • opennow-stable/src/shared/gfn/sdpValidation.test.ts
  • opennow-stable/src/shared/gfn/sdpValidation.ts
  • opennow-stable/src/shared/gfn/session.ts
  • opennow-stable/src/shared/gfn/settings.test.ts
  • opennow-stable/src/shared/gfn/settings.ts
  • opennow-stable/src/shared/gfn/signaling.ts
  • opennow-stable/src/shared/gfn/stream.ts
  • opennow-stable/src/shared/ipc.ts
  • opennow-stable/src/shared/logger.test.ts
  • opennow-stable/src/shared/logger.ts
  • opennow-stable/src/shared/shortcut.ts
  • package.json

📝 Walkthrough

Walkthrough

This PR delivers a large multi-area update to the OpenNOW desktop application. It switches CI/release workflows to npm and adds release-notes generation, adds secondary app-instance support, console PIN-protected profiles with encrypted storage, native streamer stdin/codec resilience, CloudMatch codec negotiation, browser recording, desktop bug reporting with session reports, a controller-first console UI, expanded localization for twelve languages, and broad renderer/shared refactors covering codec diagnostics, WebRTC negotiation, and settings navigation.

Changes

CI, Infra, and Docs

Layer / File(s) Summary
CI workflow, packaging config, docs
.github/workflows/*, .gitignore, .gitattributes, README.md, package.json, opennow-stable/package.json, opennow-stable/scripts/run-tests.mjs
Auto-build and release workflows switch from Bun to npm and add release-notes generation. README documents secondary-instance usage. Root and app package.json add scripts, engine requirements, and Electron locale packaging.

Estimated code review effort: 5 (Critical) | ~180 minutes

Localization

Layer / File(s) Summary
Locale file updates
locales/*.json
Twelve locale files receive new keys for QR login, console/PIN flows, library filtering, stream diagnostics, recording, settings, feedback/bug reporting, and session reports.

Shared Contracts

Layer / File(s) Summary
Shared type/contract updates
opennow-stable/src/shared/**
Adds CodecPreference/auto normalization, console PIN contracts, bug-report/session-report models, IPC channel constants, SDP validation, shortcut parsing, and broken-pipe-resilient logging.

Main Process

Layer / File(s) Summary
App instance and secondary launch
opennow-stable/src/main/appInstance.ts, opennow-stable/src/main/index.ts
Adds secondary-instance detection, profile resolution, and port ordering, wired into startup for separate user-data paths and updater disablement.
Console PIN storage and account integration
opennow-stable/src/main/security/*, opennow-stable/src/main/platforms/gfn/auth/*, opennow-stable/src/main/ipc/consolePinHandlers.ts
Adds encrypted storage, PIN policy/hashing, ConsoleProfileStore, and integrates PIN gating into AccountManager/AuthService with IPC handlers.
GPU backend info
opennow-stable/src/main/gpuInfo.ts
Collects GPU backend info via Electron APIs for codec diagnostics.
Native streamer resiliency
opennow-stable/src/main/nativeStreamer/manager.ts
Adds broken-pipe detection, stdin failure handling, and codec-negotiation validation.
CloudMatch codec/session changes
opennow-stable/src/main/platforms/gfn/cloudmatch*
Adds codec wire-value resolution, trusted URL validation, and removes the network-test session flow.
Recordings/screenshots listing
opennow-stable/src/main/media/*
Separates metadata collection from thumbnail loading and preserves the newest file during cleanup.
Bug report upload services
opennow-stable/src/main/services/*
Adds multipart form construction, response parsing, and bounded upload/timeout handling.
Settings, window, telemetry
opennow-stable/src/main/settings.ts, opennow-stable/src/main/window/*, others
Adds recording/stats-overlay normalization, theme application, and shortcut interception.

Preload

Layer / File(s) Summary
Preload API updates
opennow-stable/src/preload/index.ts
Adds console PIN, GPU info, shortcut subscription, and bug-report bridge methods.

Renderer Core

Layer / File(s) Summary
App shell and bootstrap
opennow-stable/src/renderer/src/App.tsx, main.tsx
Wires session reports, stats modes, controller prompt, console shell, and codec migration.
Streaming/console/controller hooks
opennow-stable/src/renderer/src/hooks/**
Adds console shell, PIN switching, recording status, and controller navigation hooks.
i18n and lib utilities
opennow-stable/src/renderer/src/i18n.ts, lib/**
Adds codec diagnostics, console layout helpers, recording capture, and pointer-lock utilities.

Renderer Streaming

Layer / File(s) Summary
WebRTC client and codec negotiation
opennow-stable/src/renderer/src/platforms/gfn/webrtc/**, webrtcClient.ts
Adds codec fallback negotiation, live bitrate updates, ICE stats, session diagnostics, and shader/input pointer-lock fixes.
PostHog lazy loading
opennow-stable/src/renderer/src/telemetry/posthog.ts
Loads the PostHog client lazily and tracks consent explicitly.

Renderer Console UI

Layer / File(s) Summary
Console component suite
opennow-stable/src/renderer/src/components/console/*
Adds billboard, game details, hint bar, profile gate/picker/tile, poster card, row, splash, and store picker/view.
Console page wiring
HomePage.tsx, LibraryPage.tsx, LibraryControllerView.tsx, Navbar.tsx
Replaces controller carousels with console rows and adds profile-picker/exit actions.
Console stylesheet
styles/console.css
Adds the full console-mode stylesheet.

Renderer Settings UI

Layer / File(s) Summary
Search scope and types
settingsSearch.ts, settingsTypes.ts
Adds tokenized scope matching and restructured section identifiers.
Nav and page restructuring
SettingsNav.tsx, SettingsPage.tsx
Flattens navigation and adds search/console wiring.
New settings sections
SettingsConsoleSection.tsx, SettingsDiagnosticsSection.tsx, BrowserRecordingSection.tsx, StatsOverlayControls.tsx
Adds console, diagnostics, recording, and stats-overlay controls.
Row-layout regrouping
multiple section files
Adopts grouped row styling classes and typed codec dropdowns.

Renderer Stream View

Layer / File(s) Summary
StreamView, StreamStatsHud, quick menu
StreamView.tsx, StreamStatsHud.tsx, quick-menu/*
Adds recording configuration, anti-AFK scheduling, and bug-report action.
Anti-AFK reminder
antiAfkReminder.ts
Adds a recurring reminder scheduler.
Feedback and session report
FeedbackModal.tsx, SessionReportModal.tsx, GameDetailModal.tsx, ControllerModePromptModal.tsx
Adds a bug-report review flow and session-quality reporting.

Renderer GameCard and Misc

Layer / File(s) Summary
GameCard details wiring
GameCard.tsx, GameCardListItem.tsx, ShaderAtmosphere.tsx, LoginScreen.tsx, QueueAdPreview.tsx
Adds details-modal wiring, render throttling, deferred QR import, and mute controls.

Sequence Diagram(s)

sequenceDiagram
  participant Renderer as ConsoleProfileGate (Renderer)
  participant Preload
  participant IPC as consolePinHandlers (Main)
  participant Store as ConsoleProfileStore
  participant Policy as pinPolicy/pinHash

  Renderer->>Preload: verifyConsolePin(userId, pin)
  Preload->>IPC: CONSOLE_PIN_VERIFY
  IPC->>Store: verifyPin(userId, pin)
  Store->>Policy: evaluatePinGate / verifyPinHash
  Policy-->>Store: gate result, hash match
  Store-->>IPC: ConsolePinVerifyResult
  IPC-->>Preload: verify result
  Preload-->>Renderer: success or lockout state
  Renderer->>Renderer: enter shell or show lockout
Loading
sequenceDiagram
  participant Client as webrtcClient
  participant Codec as codecNegotiation
  participant PC as RTCPeerConnection
  participant SDP as sdpValidation

  Client->>Codec: negotiatePeerConnectionCodecAnswer(candidates)
  loop each candidate codec
    Codec->>PC: setRemoteDescription(offer)
    Codec->>PC: createAnswer()
    Codec->>SDP: extractNegotiatedVideoCodec(answer.sdp)
    alt codec negotiated
      SDP-->>Codec: VideoCodec
      Codec-->>Client: NegotiatedCodecAnswer
    else rejected
      Codec->>PC: rollback remote offer
    end
  end
Loading
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0d11fded7a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread locales/de.json
Comment on lines +2 to +3
"common": {
"loading": "Loading..."

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Revert generated locale edits

This change directly updates locales/de.json and the other non-English locale files alongside product code, but these files are Crowdin-generated and may only change through a Crowdin sync pull request; keep the new copy in locales/en.json and let the translation workflow populate the generated locales.

AGENTS.md reference: AGENTS.md:L57-L59

Useful? React with 👍 / 👎.

Comment on lines +285 to +287
requestedResolution: settings.resolution,
requestedCodec: settings.codec,
targetFps: settings.fps,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Score against the resolved stream profile

When persisted resolution/FPS settings exceed the active account's entitlements, buildCurrentStreamSettings clamps them through resolveEntitledStreamProfile before session creation, but this accumulator records the raw settings instead. A legitimately clamped 1080p60 session requested from stale 4K120 settings will therefore be reported as an unexpected resolution change and have its FPS scored against 120, producing a misleading low-quality report; capture the resolved profile used for this session instead.

Useful? React with 👍 / 👎.

@Kief5555
Kief5555 merged commit 2f5d4f9 into main Aug 14, 2026
19 of 20 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants