feat(clients): scaffold mobile (Capacitor) + desktop (Electron) shells

Plan + decisions in CLIENTS.md (parallel mobile+desktop; desktop = technician
client + existing remote-control agent host; mobile = Capacitor wrap).

- desktop/: Electron technician client — loads the live Connect UI, native
  screen capture via setDisplayMediaRequestHandler, persisted session, external
  links to browser; electron-builder config for Win/Mac/Linux installers.
- mobile/: Capacitor project — server.url loads Connect UI, push/camera/status-bar
  plugins declared, www splash fallback; iOS/Android added via `cap add`.
- Reuses the existing /api/v1 + Bearer auth backend; no web-code changes.
- .gitignore: ignore generated mobile/android, mobile/ios platform dirs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Cette révision appartient à :
2026-06-30 17:49:41 +05:30
Parent f517c153c1
révision 593a4677b6
10 fichiers modifiés avec 332 ajouts et 0 suppressions
+39
Voir le fichier
@@ -0,0 +1,39 @@
# Biz Connect — Mobile app (Capacitor)
A Capacitor shell that loads the live Connect web UI (`server.url` in
`capacitor.config.json`) and adds native push, camera/mic, and store distribution. See the
overall plan in [../CLIENTS.md](../CLIENTS.md).
## Prerequisites
- Node + `npm install` here.
- **Android:** Android Studio + SDK.
- **iOS:** macOS + Xcode (+ an Apple Developer account to run on device / ship).
## Setup
```bash
npm install
npx cap add android
npx cap add ios # macOS only
npx cap sync
```
## Run / build
```bash
npx cap open android # build & run from Android Studio
npx cap open ios # build & run from Xcode
```
## Server origin
The app loads `server.url` from `capacitor.config.json` (default
`https://remote.bizgaze.com`). For a local device test against a dev server, set it to your
machine's LAN URL (and allow cleartext for plain http).
## Native push (next step)
Native push uses the Capacitor Push Notifications plugin (FCM on Android, APNs on iOS) and a
server endpoint to register device tokens — tracked in [../CLIENTS.md](../CLIENTS.md) Phase B.
This is separate from the existing Web Push (VAPID) the PWA already uses. Needs Google/Apple
credentials to test end-to-end.
## Shipping (gated on accounts)
- **Google Play:** one-time $25; upload an AAB; signing key.
- **App Store:** Apple Developer $99/yr; archive via Xcode; App Store Connect listing.
+15
Voir le fichier
@@ -0,0 +1,15 @@
{
"appId": "com.bizgaze.connect",
"appName": "Biz Connect",
"webDir": "www",
"server": {
"url": "https://remote.bizgaze.com",
"cleartext": false,
"androidScheme": "https"
},
"plugins": {
"PushNotifications": {
"presentationOptions": ["badge", "sound", "alert"]
}
}
}
+22
Voir le fichier
@@ -0,0 +1,22 @@
{
"name": "biz-connect-mobile",
"version": "0.1.0",
"description": "Biz Connect mobile app — Capacitor shell loading the Connect web UI",
"scripts": {
"sync": "cap sync",
"android": "cap open android",
"ios": "cap open ios"
},
"dependencies": {
"@capacitor/android": "^6.1.0",
"@capacitor/app": "^6.0.0",
"@capacitor/camera": "^6.0.0",
"@capacitor/core": "^6.1.0",
"@capacitor/ios": "^6.1.0",
"@capacitor/push-notifications": "^6.0.0",
"@capacitor/status-bar": "^6.0.0"
},
"devDependencies": {
"@capacitor/cli": "^6.1.0"
}
}
+25
Voir le fichier
@@ -0,0 +1,25 @@
<!doctype html>
<!-- Capacitor requires a webDir with an index. At runtime the app loads the live Connect UI
via server.url in capacitor.config.json, so this is only a launch splash / offline
fallback. To ship fully-bundled (offline-launch) later, copy ../server/public here and
drop server.url. -->
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>Biz Connect</title>
<style>
html,body{height:100%;margin:0;background:#0f1830;color:#fff;font-family:system-ui,Segoe UI,Roboto,sans-serif;}
.wrap{height:100%;display:grid;place-items:center;text-align:center;padding:2rem;}
h1{font-size:1.4rem;margin:.4rem 0;} p{opacity:.7;font-size:.9rem;}
</style>
</head>
<body>
<div class="wrap">
<div>
<h1>Biz <span style="color:#f5b301">Connect</span></h1>
<p>Connecting…</p>
</div>
</div>
</body>
</html>