{"record":{"id":"f3a613c8588fb31b","repo":"BloopAI/vibe-kanban","slug":"this-host-is-not-paired-with-your-browser-pair-it","errorCode":null,"errorMessage":"This host is not paired with your browser. Pair it in Relay settings.","messagePattern":"This host is not paired with your browser\\. Pair it in Relay settings\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/remote-web/src/shared/lib/relay/context.ts","lineNumber":26,"sourceCode":"  createRemoteSession,\n  refreshRelaySigningSession,\n} from \"@/shared/lib/relayBackendApi\";\nimport { buildRelaySigningSessionRefreshPayload } from \"@/shared/lib/relaySigningSessionRefresh\";\n\nimport type { RelayHostContext } from \"@remote/shared/lib/relay/types\";\n\nconst remoteSessionIdCache = new Map<string, string>();\n\nsubscribeRelayPairingChanges(({ hostId }) => {\n  remoteSessionIdCache.delete(hostId);\n});\n\nexport async function resolveRemoteHostContext(\n  hostId: string,\n): Promise<RelayHostContext> {\n  const pairedHost = await findPairedHost(hostId);\n  if (!pairedHost) {\n    throw new Error(\n      \"This host is not paired with your browser. Pair it in Relay settings.\",\n    );\n  }\n\n  if (!pairedHost.signing_session_id) {\n    throw new Error(\n      \"This host pairing is outdated. Re-pair it in Relay settings.\",\n    );\n  }\n\n  const browserSessionId = await getRemoteSessionId(hostId);\n  return {\n    pairedHost,\n    sessionId: browserSessionId,\n  };\n}\n\nexport function invalidateRemoteSessionId(hostId: string): void {","sourceCodeStart":8,"sourceCodeEnd":44,"githubUrl":"https://github.com/BloopAI/vibe-kanban/blob/4deb7eca8f381f7cbc1f9d15515a9ab8f8009053/packages/remote-web/src/shared/lib/relay/context.ts#L8-L44","documentation":"resolveRemoteHostContext looks up the requested hostId among hosts paired with this browser. If findPairedHost returns nothing, the host was never paired (or the pairing record was deleted), so no relay session can be established and this error is thrown.","triggerScenarios":"Calling resolveRemoteHostContext(hostId) with a hostId that has no entry in the paired-hosts store for the current browser profile — e.g. after clearing site data, switching browsers, or referencing a host ID from another machine.","commonSituations":"User cleared browser storage/cookies; opened Relay in a different browser or private window; copied a host ID from a teammate's setup; pairing was removed from Relay settings but a stale client still references it.","solutions":["Open Relay settings and pair the host with this browser, then retry.","Verify the hostId passed to resolveRemoteHostContext matches a host shown in your Relay settings.","If storage was cleared, re-run the pairing flow to recreate the record.","Confirm you are in the same browser profile that performed the original pairing."],"exampleFix":"// before\nconst ctx = await resolveRemoteHostContext(hostId); // throws if unpaired\n// after\nconst ctx = await isHostPaired(hostId)\n  ? await resolveRemoteHostContext(hostId)\n  : await promptPairingFlow(hostId);","handlingStrategy":"validation","validationCode":"const paired = await findPairedHost(hostId);\nif (!paired) await openPairingDialog(hostId); // run before resolveRemoteHostContext","typeGuard":null,"tryCatchPattern":"try {\n  const ctx = await resolveRemoteHostContext(hostId);\n} catch (e) {\n  if (e instanceof Error && e.message.includes('not paired')) {\n    await startPairingFlow(hostId);\n  } else throw e;\n}","preventionTips":["Check the paired-host list in Relay settings before connecting programmatically.","Avoid clearing site data for the Relay origin; treat pairing records as durable config.","Validate hostId inputs against the UI's host list instead of hand-copying IDs."],"tags":["relay","pairing","host","configuration"],"backgroundTag":"host-not-paired","analyzedSha":"4deb7eca8f381f7cbc1f9d15515a9ab8f8009053","analyzedAt":"2026-08-29T09:24:13.446Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}