From b23f46c3d850a5a5bb02921e323e57d14d829cf8 Mon Sep 17 00:00:00 2001 From: archipelago Date: Tue, 21 Jul 2026 13:49:10 -0400 Subject: [PATCH] fix(kiosk): companion remote control now reaches kiosk displays MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit App.vue skipped starting the browser-side remote relay on kiosks, citing a system-level xdotool injector that no longer exists — the backend's remote-input path is relay-only (validate + broadcast). With no consumer, companion input was silently dropped on TVs. Start the relay on kiosks like everywhere else; rides the next release + ISO via the web bundle. Co-Authored-By: Claude Fable 5 --- neode-ui/src/App.vue | 13 ++++++------- neode-ui/src/router/index.ts | 6 +++--- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/neode-ui/src/App.vue b/neode-ui/src/App.vue index 32123807..0dcb8b52 100644 --- a/neode-ui/src/App.vue +++ b/neode-ui/src/App.vue @@ -159,13 +159,12 @@ watch(() => appStore.isAuthenticated, (authenticated) => { if (authenticated) { messageToast.startPolling() screensaverStore.resetInactivityTimer() - // Don't start relay on kiosk — kiosk gets input via xdotool (system-level), - // relay would duplicate every keystroke/click as DOM events - const isKiosk = localStorage.getItem('kiosk') === 'true' - || new URLSearchParams(window.location.search).has('kiosk') - if (!isKiosk) { - startRemoteRelay() - } + // Kiosk included: the backend's remote-input path is relay-only (it + // validates and broadcasts; it never runs xdotool), so the browser-side + // relay is the ONLY consumer of companion input. Skipping it on kiosk — + // an assumption from a long-gone system-level xdotool injector — left + // TVs deaf to the companion remote. + startRemoteRelay() } else { messageToast.stopPolling() toastMessage.value = { show: false, text: '', fromPubkey: '' } diff --git a/neode-ui/src/router/index.ts b/neode-ui/src/router/index.ts index 1af23925..cba252f3 100644 --- a/neode-ui/src/router/index.ts +++ b/neode-ui/src/router/index.ts @@ -88,9 +88,9 @@ const router = createRouter({ // normal app (onboarding → login → dashboard) like any other client. // This route only persists kiosk mode + safe-area insets, then redirects // to the root app. The launcher still points Chromium here (not directly - // at `/`) so the 'kiosk' flag gets set — App.vue uses it to skip the - // remote relay, which would otherwise double xdotool input on the kiosk - // display. Public so the auth guard doesn't bounce us before beforeEnter. + // at `/`) so the 'kiosk' flag gets set — App.vue keys kiosk-only styling + // (kiosk-mode/kiosk-safe-area classes, dark AIUI pin) off it. Public so + // the auth guard doesn't bounce us before beforeEnter. path: '/kiosk', name: 'kiosk', meta: { public: true },