# Plan – Backend erreichbar machen & App via Xcode aufs iPhone

## Ausgangslage (wichtig fürs Verständnis)
- Der **Voice-Worker verbindet sich nur ausgehend** zu LiveKit Cloud (Frankfurt). Das iPhone
  spricht direkt mit **LiveKit Cloud** (wss/HTTPS – für ATS unkritisch).
- Das iPhone braucht zusätzlich nur den **Token/Daten-Server** (`/token`, `/visits`, `/report`),
  aktuell `http://localhost:8787`.
- **Folge:** Für den Mobiltest muss **nur der Token-Server erreichbar** sein. Der Worker kann
  auf dem Mac weiterlaufen (kein eingehender Zugriff nötig).
- `baseURL` steht fest verdrahtet in `VoiceAgentApp/App/RootView.swift:8`.

---

## Drei Wege (von schnell zu dauerhaft)

### A) Gleiches WLAN → Mac-LAN-IP  (0 Zusatz-Tools)
- App-`baseURL` → `http://192.168.4.23:8787` (Mac-IP, iPhone + Mac im selben WLAN).
- Nötig: **ATS-Ausnahme** für Klartext-HTTP + **Local-Network-Berechtigung**
  (`NSLocalNetworkUsageDescription`, iOS fragt beim ersten Zugriff auf eine LAN-IP).
- Worker + Server laufen wie jetzt auf dem Mac.
- ➖ Nur im selben WLAN; IP ändert sich ggf. je Netz.

### B) Tunnel (ngrok) → öffentliche HTTPS-URL  **[Empfehlung fürs Testen]**
- `ngrok http 8787` → z. B. `https://xxxx.ngrok-free.app`; App-`baseURL` = diese URL.
- **HTTPS erfüllt ATS** → keine ATS-Ausnahme, kein Local-Network-Prompt.
- Funktioniert auch über **Mobilfunk** (realistischer Test unterwegs, „im Auto").
- ngrok ist bereits installiert (`/usr/local/bin/ngrok`).
- ➖ URL wechselt je Session (Gratis-Plan) → `baseURL` konfigurierbar machen lohnt sich.

### C) Cloud-Deploy (Token-Server **und** Worker)  [Weg Richtung Go-Live]
- Beide als je 1 Prozess/Container auf **Fly.io / Render / Railway / kleiner VPS**:
  - `web`: `tsx src/server/http.ts` (HTTPS-Endpunkt, Port aus `PORT`).
  - `worker`: `tsx src/voice/worker.ts` (long-running, verbindet zu LiveKit Cloud).
- Secrets als Env (`LIVEKIT_*`, `XAI_API_KEY`, `LLM_*`, `VOICE_*`).
- **Daten:** Fixtures aus `data/` mit deployen oder auf ein Volume legen (`DATA_DIR`).
- ➖ Mehr Setup; für reines PoC-Testen (A/B) nicht nötig.

---

## Empfehlung
**B (ngrok)** für den mobilen End-to-End-Test: eine öffentliche HTTPS-URL, keine ATS-/WLAN-Hürden,
läuft auch mobil. Worker + Server bleiben lokal auf dem Mac. **C** heben wir uns für den echten
Go-Live auf (siehe Kosten-/Deployment-Notiz).

## Umzusetzende Änderungen (für B, gering)
1. **`baseURL` konfigurierbar** statt hart auf localhost:
   - Neuer Info.plist-Key `ADVA_BASE_URL` (via `INFOPLIST_KEY_ADVA_BASE_URL` in `project.yml`),
     in `RootView` mit Fallback `http://localhost:8787` auslesen.
   - Vorteil: Simulator bleibt auf localhost, Gerät bekommt die ngrok-URL – **ohne Codeänderung**
     je Test, nur Build-Setting bzw. eigenes Schema.
2. **Xcode aufs iPhone:**
   - iPhone per Kabel, in Xcode als Ziel wählen; **Automatically manage signing** an,
     eigenes Team (Apple-ID reicht – Free Provisioning, 7-Tage-Gültigkeit), Bundle-ID
     bleibt `de.emg.adva.app`.
   - Auf dem iPhone: Entwickler-Zertifikat unter *Einstellungen › Allgemein › VPN & Geräteverwaltung* vertrauen; Entwicklermodus aktivieren.
   - Mikrofon-/Standort-Beschreibung sind bereits gesetzt.
3. **Vor dem Test starten:** Token-Server (läuft), Worker (läuft), `ngrok http 8787`,
   ngrok-URL als `ADVA_BASE_URL` setzen, Run auf dem Gerät.

## Falls A gewünscht (zusätzlich)
- `project.yml`: ATS `NSAllowsLocalNetworking = YES` (oder Exception Domain für die IP) +
  `INFOPLIST_KEY_NSLocalNetworkUsageDescription`.

## Verifikation
- App auf dem iPhone startet, Liste lädt (→ Server erreichbar), ein Besuch → Doku startet,
  Voice verbindet (→ Worker/LiveKit ok), Bericht erscheint. xAI zählt pro Sekunde → zügig beenden.
