Add remote control feature (search, playback, fullscreen from phone)#9411
Closed
LambdaGW wants to merge 2 commits into
Closed
Add remote control feature (search, playback, fullscreen from phone)#9411LambdaGW wants to merge 2 commits into
LambdaGW wants to merge 2 commits into
Conversation
added 2 commits
July 12, 2026 01:48
Adds an opt-in local HTTP+WebSocket server (Settings > Remote Control) that serves a self-contained mobile page over the LAN, letting a phone browser search videos and control playback without installing an app. Off by default; access is gated by a random per-session token shown as a QR code, and only the window that started the server can report state or resolve searches for it.
…align code style - Route a new 'fullscreen' command through the existing IPC command channel, reusing the same already-shipped toggleFullScreen bridge used by the 'f' keyboard shortcut. - Add skip +/-10s, quick mute toggle, haptic feedback, and connection-status gating (controls disable while disconnected) to the phone remote page. - Fix RemoteControlSettings.vue: the error message and loading states were nested inside `v-if="isRunning"`, so a failed start could never actually show its error, and the loading spinner never appeared before isRunning flipped true. Both now render independently of it. - Rewrite the embedded remote-control page script to ES6 (let/const, arrow functions) and fill in missing JSDoc, per project conventions. - Verified end-to-end against the running app via CDP: real search (Local API), real open/play/pause/volume/seek against the live player, real state broadcast, and a real Invidious search attempt (which surfaced a public instance's bot-check page rather than a bug in this code, verified independently with a matching curl request).
auto-merge was automatically disabled
July 12, 2026 08:16
Pull request was closed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Pull Request Type
Related issue
N/A
Description
Adds an opt-in Remote Control feature (Settings → Remote Control) that lets you control FreeTube from your phone's browser over your local network no companion app to install on either side.
When enabled, FreeTube starts a local HTTP + WebSocket server (off by default) and shows a QR code / URL. Opening that link in any phone browser (iOS Safari, Android Chrome, etc.) gives you:
toggleFullScreenbridge already used by thefkeyboard shortcut)Security/privacy design:
crypto.randomBytes, timing-safe comparison), shown only via the QR code/URL never persisted to disk or synced between windows.unsafe-inline), strict input validation on every incoming command, and caps on concurrent connections/searches to bound resource use.ipcMainhandlers follow the existingisFreeTubeUrl(event.senderFrame.url)guard pattern already used elsewhere insrc/main/index.js.New dependencies:
ws(WebSocket server no Node core alternative) andqrcode(QR rendering same rationale the project already applies toautolinker: don't hand-roll a well-defined, easy-to-get-wrong algorithm). Both are small, mainstream, widely-audited packages;qrcode's CLI-only transitive deps (yargsetc.) are not pulled into the renderer bundle since webpack resolves itsbrowserfield.Testing
pnpm install && pnpm run devto launch a dev build.Desktop
Additional context
9482) and is not yet user-configurable; if that port is already in use, enabling the feature will show an error toast. Happy to add a configurable port as a follow-up if maintainers want it.en-US(following the usual FreeTube convention that other locales get filled in via the translation platform, not in the PR itself).pnpm run lintclean; new/changed files were also exercised via a live end-to-end pass (search, play/pause/volume/seek/fullscreen, multi-window isolation) against a running dev build before opening this PR.