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
42 lines
1.5 KiB
TypeScript
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;
|