BloopAI/vibe-kanban · error · Error

This host is not paired with your browser. Pair it in Relay

Error message

This host is not paired with your browser. Pair it in Relay settings.

What it means

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.

Source

Thrown at packages/remote-web/src/shared/lib/relay/context.ts:26

  createRemoteSession,
  refreshRelaySigningSession,
} from "@/shared/lib/relayBackendApi";
import { buildRelaySigningSessionRefreshPayload } from "@/shared/lib/relaySigningSessionRefresh";

import type { RelayHostContext } from "@remote/shared/lib/relay/types";

const remoteSessionIdCache = new Map<string, string>();

subscribeRelayPairingChanges(({ hostId }) => {
  remoteSessionIdCache.delete(hostId);
});

export async function resolveRemoteHostContext(
  hostId: string,
): Promise<RelayHostContext> {
  const pairedHost = await findPairedHost(hostId);
  if (!pairedHost) {
    throw new Error(
      "This host is not paired with your browser. Pair it in Relay settings.",
    );
  }

  if (!pairedHost.signing_session_id) {
    throw new Error(
      "This host pairing is outdated. Re-pair it in Relay settings.",
    );
  }

  const browserSessionId = await getRemoteSessionId(hostId);
  return {
    pairedHost,
    sessionId: browserSessionId,
  };
}

export function invalidateRemoteSessionId(hostId: string): void {

View on GitHub (pinned to 4deb7eca8f)

Solutions

  1. Open Relay settings and pair the host with this browser, then retry.
  2. Verify the hostId passed to resolveRemoteHostContext matches a host shown in your Relay settings.
  3. If storage was cleared, re-run the pairing flow to recreate the record.
  4. Confirm you are in the same browser profile that performed the original pairing.

Example fix

// before
const ctx = await resolveRemoteHostContext(hostId); // throws if unpaired
// after
const ctx = await isHostPaired(hostId)
  ? await resolveRemoteHostContext(hostId)
  : await promptPairingFlow(hostId);
Defensive patterns

Strategy: validation

Validate before calling

const paired = await findPairedHost(hostId);
if (!paired) await openPairingDialog(hostId); // run before resolveRemoteHostContext

Try / catch

try {
  const ctx = await resolveRemoteHostContext(hostId);
} catch (e) {
  if (e instanceof Error && e.message.includes('not paired')) {
    await startPairingFlow(hostId);
  } else throw e;
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of BloopAI/vibe-kanban@4deb7eca8f (2026-08-29). Data as JSON: /api/errors/f3a613c8588fb31b. Report an issue: GitHub.