BloopAI/vibe-kanban · error · Error
This host pairing is outdated. Re-pair it in Relay settings.
Error message
This host pairing is outdated. Re-pair it in Relay settings.
What it means
The host is paired, but its pairing record has no signing_session_id, meaning the pairing predates the signing-session requirement or was created incompletely. The record exists but is not usable for secure relay communication, so resolveRemoteHostContext rejects it and asks for a re-pair.
Source
Thrown at packages/remote-web/src/shared/lib/relay/context.ts:32
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 {
remoteSessionIdCache.delete(hostId);
}
export async function tryRefreshRelayHostSigningSession(
context: RelayHostContext,
): Promise<RelayHostContext | null> {View on GitHub (pinned to 4deb7eca8f)
Solutions
- Remove the host in Relay settings and re-pair it to generate a signing session.
- Check whether a recent Relay version upgrade requires re-pairing (migration notes).
- If many hosts show this, verify the pairing endpoint completed successfully and persist signing_session_id.
- Clear the stale pairing record from storage programmatically and re-run setup.
Example fix
// before
const ctx = await resolveRemoteHostContext(hostId); // throws on stale pairing
// after
try {
return await resolveRemoteHostContext(hostId);
} catch (e) {
if (e.message.includes('outdated')) await rePairHost(hostId);
return await resolveRemoteHostContext(hostId);
} Defensive patterns
Strategy: validation
Validate before calling
const host = await findPairedHost(hostId); if (host && !host.signing_session_id) await rePairHost(hostId); // refresh stale pairing first
Type guard
function hasSigningSession(h: { signing_session_id?: string | null }): h is { signing_session_id: string } {
return typeof h.signing_session_id === 'string' && h.signing_session_id.length > 0;
} Try / catch
try {
return await resolveRemoteHostContext(hostId);
} catch (e) {
if (e instanceof Error && e.message.includes('outdated')) {
await rePairHost(hostId);
return await resolveRemoteHostContext(hostId);
}
throw e;
} Prevention
- Re-pair hosts after upgrading Relay versions that change the pairing schema.
- Treat interrupted pairing as invalid: delete and redo rather than retrying on a partial record.
- Validate pairing records (including signing_session_id) at app startup and prompt re-pairing.
When it happens
Trigger: resolveRemoteHostContext(hostId) finds pairedHost but pairedHost.signing_session_id is null/undefined — typically a pairing created by an older Relay version before signing sessions were introduced, or a partially completed pairing.
Common situations: Upgraded Relay server/client where old pairings were not migrated; pairing interrupted mid-handshake leaving the record without a signing session; storage partially cleared or corrupted.
Related errors
- This host is not paired with your browser. Pair it in Relay
- Server proof verification failed.
- Not authenticated
- (dynamic: extractErrorMessage(response, fallbackMessage))
- body.message || fallbackMessage (dynamic)
AI-assisted analysis of BloopAI/vibe-kanban@4deb7eca8f (2026-08-29).
Data as JSON: /api/errors/0789b8dde244f505.
Report an issue: GitHub.