Files
openchamber/packages/mobile/capacitor.config.ts
T
Iuliia Ivashko 91a95bfdaa feat: pairing v2 — one-tap trusted devices over LAN and private relay (#2103)
Reworks how devices connect to an OpenChamber server, end to end.

Pairing v2:
- One-time pairing links/QR codes (openchamber://connect?v=2) carrying a set of transport candidates (LAN/tunnel/relay) and a single-use secret redeemed server-side; no tokens embedded in links
- Add-a-device dialog written for first-time users: intent-based transport choice (Anywhere / Home network only / This computer only) with plain-language descriptions, transparent fallback checkboxes, server-authoritative LAN detection, high-res QR dialog
- Private relay folded into pairing as a transport candidate with a demand-driven lifecycle (enables when a relay device is paired, disables when none remain)

Multi-transport devices:
- A saved device holds all its transports and one token; mobile re-probes on connect, resume, and network change and hot-switches LAN<->relay seamlessly (no re-pairing, no remount, session preserved)
- Desktop can import relay pairing links, switch to relay hosts through the E2EE tunnel, and restore a relay default host after relaunch

Device management:
- Device list (web + desktop) shows live per-device connectivity with the active transport (Connected - Local network / Relay) and platform badges (iOS/Android/macOS/Windows/Linux)
- One physical device = one record: stable per-install dedupe keys across pairing and password re-login; typed pairing label names the device, paired devices name the connection by the issuing server hostname
- Trusted desktop-local client manages all devices (list, revoke, clear revoked); relay host reaps dead client sockets after 3 missed keepalives

Android:
- LAN transport unblocked (cleartext + mixed content, mirroring iOS ATS exceptions); resume re-probe retries through network flux and silently auto-reconnects from a disconnected state
2026-07-10 00:12:33 +03:00

42 lines
1.5 KiB
TypeScript

import type { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = {
appId: 'com.openchamber.app',
appName: 'OpenChamber',
webDir: 'dist',
server: {
androidScheme: 'https',
},
android: {
// The Android WebView serves the app from an https:// origin, so its fetch
// and WebSocket calls to plain-http LAN servers (http://192.168.x.x) are
// blocked as mixed content even with cleartext allowed in the manifest.
// Allow it — LAN transport is a core feature; iOS has no equivalent issue
// (capacitor:// scheme) and relay/tunnel traffic is TLS anyway.
allowMixedContent: true,
},
plugins: {
Keyboard: {
// 'none' leaves the WebView at full height; the UI follows the keyboard
// itself via the --oc-keyboard-inset CSS variable driven by keyboardWillShow
// (see useNativeMobileChrome). The built-in 'native' resize lands only after
// the keyboard animation finishes, which looked like a ~1.5s lag.
resize: 'none',
resizeOnFullScreen: true,
autoBackdropColor: 'dom',
},
StatusBar: {
overlaysWebView: true,
style: 'DEFAULT',
},
PushNotifications: {
// Never display an APNs alert while the app is foreground. The server always sends
// (no racy visibility gate); iOS suppresses the foreground banner, so there is no
// notification when the app is active. Background pushes are shown by iOS as usual.
presentationOptions: [],
},
},
};
export default config;