d0f9355553
General #1/#2 (closed-app notifications): the desktop app now CLOSES TO TRAY instead of quitting, keeping its chat WebSocket alive so calls/messages still notify. Tray icon + menu (Open / Quit), single-instance lock, first-close hint. Guest #4 (lobby/admit): meetings can require the host to admit guests joining by link. Setting on the schedule form ("Guests must be admitted by the host", default on) + ad-hoc default. Guests wait on a "waiting to be let in" screen; the host gets an Admit/Deny prompt; auto-cleanup on leave. Logged-in members always join directly. Guest #5 (speaker): headphones/speaker output picker in the meeting (setSinkId), remembered and applied to every tile. Guest #3 (link expiry): guest link/token dies ~2h after a scheduled meeting's end (HTTP 410) with a clear message; live-room links expire when the room empties. RC #4 (mobile): touch→mouse mapping so a phone/tablet viewer can control (tap=click, drag=move). Uses the same letterbox-correct coordinate mapping. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Biz Connect — Desktop client
Electron shell that loads the live Connect web UI and adds native screen capture. See the overall plan in ../CLIENTS.md.
Run (dev = local testing)
npm install
npm start # dev auto-targets http://localhost:8090 (your local server)
SERVER_URL=https://remote.bizgaze.com npm start # …or point dev at production to compare
npm start IS the local desktop test — no separate "local" installer needed. In dev (unpackaged)
the shell defaults to the local server; a PACKAGED installer defaults to production. SERVER_URL
overrides either. (Bash/Git-Bash syntax above; in PowerShell: $env:SERVER_URL='…'; npm start.)
Build installers
npm run dist # electron-builder → Win NSIS / Mac dmg / Linux AppImage
Signed, trusted installers need certificates:
- Windows: an EV (or OV) code-signing certificate.
- macOS: Apple Developer ID cert + notarization (
CSC_LINK,APPLE_ID,APPLE_APP_SPECIFIC_PASSWORD).
Notes
- The window loads
${SERVER_URL}/home; relative/apiand/wsURLs work because the origin is the server itself — no web-code changes. setDisplayMediaRequestHandlerinmain.jsis what makes "Share Screen" work in Electron; it currently defaults to the primary display. Swap in a source-picker for production.- The session is persisted (
persist:bizconnect) so login survives restarts. window.__NATIVE__ === 'desktop'is exposed for the web UI to feature-detect.