Sponic iOS — dinner-host client
Status: BLOCKED on Apple Developer Program
This work cannot start until an active Apple Developer Program account is enrolled. Individual accounts approve in ~1–2 days; organization accounts need a D-U-N-S number first (~1 week if you don't have one) and add ~24–48h of Apple review. Cost: $99/year. Once approved, the dev work is ~3.5–4 days — can run in parallel with Android Phase 4.
TL;DR
Why iOS: the Agentic Gathering host architecture (LiveKit room + token Edge Function + agent persistence) is platform-agnostic. Phases 1–3 + 5 of ai-host-livekit all support iOS clients with zero backend changes. Adding iOS just means a second mobile client.
Why now (in spec form): getting the spec into git unblocks a developer to start the moment Apple approves — no rediscovery of decisions. Also surfaces the prerequisites (Apple Developer Program, D-U-N-S, etc.) early so the human work can run in parallel with Android.
Scope: match Android feature-for-feature for the Agentic Gathering host flow. Not attempting feature parity with the live-translation feature in this iOS spec — that's a separate (much larger) port.
What this app does (matches Android)
- Sign in with Google — obtain ID token to call
/livekit-token - Talk to your AI host screen — tap Start interview, the app asks Supabase for a LiveKit token, joins the room, publishes the mic, plays the agent's audio response
- Tap End — disconnect from the room. The agent (server-side) writes the transcript to
app_users.dinner_profile - Profile screen — same fields the Android app exposes today (firstName, lastName, phone, bio, gender, jobTitle, personalUrl, displayName)
Architecture (matches Android)
iPhone (SwiftUI) Backend Agent
+---------------+ +---------------+ +-----------------+
| Google Sign-In| --ID tok--> | /livekit-token| --JWT-----> | dinner-host |
| LiveKitSDK | <--URL+JWT-- (Edge Function)| | (Python, Phoenix)|
| AVAudioSession| | | |
+---------------+ <--LiveKit room (WebRTC)--> | +-----------------+
v |
Supabase app_users |
dinner_profile JSONB <------/
(via /dinner-profile-save)
Stack
| Layer | Choice | Why |
|---|---|---|
| UI framework | SwiftUI | Modern, declarative, matches the Android app's minimal-screen pattern. Avoids UIKit boilerplate. |
| Min iOS target | iOS 16 | Covers ~95% of in-use iPhones. Lets us use modern SwiftUI APIs (NavigationStack, @Observable, etc.). |
| Real-time audio | LiveKit Swift SDK | Same vendor as Android; protocol-identical. Add via Swift Package Manager (SPM). |
| Auth | Google Sign-In iOS SDK | Mirrors Android's Google Sign-In. ID token sent to /livekit-token. |
| Networking | URLSession + async/await | Built-in; no Alamofire needed for two endpoints. |
| Local persistence | UserDefaults | Mirrors Android's SharedPreferences for profile fields. |
| Distribution | TestFlight | Free, supports up to 100 internal + 10k external testers. |
Apple Developer Program prerequisites
Block this list before any code starts. None of these are coding tasks — they're admin work that gates everything.
- Decide individual vs organization account. Individual: faster (~1–2 days), shows your name in App Store metadata, $99/yr. Organization: slower (~2 weeks if no D-U-N-S), shows "Sponic Gardens" in metadata, $99/yr. Recommend organization for brand presentation; tolerate the extra time.
- Get a D-U-N-S number (organization accounts only). Apple uses Dun & Bradstreet to verify business identity. Free at developer.apple.com/support/D-U-N-S. Takes ~5–14 business days for a new application.
- Enroll in Apple Developer Program at developer.apple.com/programs/enroll. $99/year. Apple reviews ~24–48h after submission.
- Reserve bundle ID in App Store Connect:
com.sponicgardens.dinnerhost(or unify with Android:com.sponicgardens.sponic). Decide before the app is created — renaming is painful. - Create App Store Connect record — app name, primary language, bundle ID. ~30 min.
- Configure Apple Sign-In if we want it as a login option later (App Store now requires it as an alternative if you offer Google Sign-In). For the prototype, Google-only is fine; add Apple Sign-In before public release.
Build phases (after Apple approval)
Phase i.1 — New app scaffold (~0.5–1 day)
- Create Xcode project at
apps/mobile-ios/Sponic.xcodeproj(sibling toapps/mobile) - SwiftUI app, iOS 16+ deployment target, bundle ID
com.sponicgardens.dinnerhost - App icon, launch screen using existing Sponic brand assets (sage green, leaf motif)
- Info.plist:
NSMicrophoneUsageDescription(required, will crash without it),UIBackgroundModes = ["audio"](so the app doesn't get killed mid-call when the screen locks) - App Transport Security defaults (don't disable; LiveKit uses HTTPS/WSS)
Phase i.2 — Google Sign-In (~0.5 day)
- Add GoogleSignIn-iOS via SPM
- Configure OAuth client ID in Google Cloud Console, add reversed-client-ID URL scheme to Info.plist
SignInScreen: tap button → Google's picker → receive ID token- Persist the ID token in UserDefaults (or Keychain if we care about cross-launch security; UserDefaults is fine for prototype)
- Mirror Android's profile-fetching flow: extract email, name, photo URL from the Google response
Phase i.3 — LiveKit integration + dinner-host screen (~1 day)
- Add
LiveKit-Swift-Client-SDKvia SPM (pin same major version as Android to avoid client-server-side surprises) DinnerHostScreen:- Start button: POST
/livekit-tokenwith Google ID token → receive{url, token, room} - Configure
AVAudioSessionfor.playAndRecord,.voiceChatmode Room.connect(url:token:)→ publish local mic track → subscribe to remote agent track- Status indicator (connecting / listening / speaking)
- End button:
room.disconnect(), deactivate audio session
- Start button: POST
- Handle interruptions: phone call comes in mid-session, AirPods disconnect, app backgrounded
Phase i.4 — Profile screen (~0.5 day)
- Mirror Android's profile fields:
firstName, lastName, phone, bio, gender, jobTitle, personalUrl, displayName - Persist to UserDefaults (matches Android's SharedPreferences scope — on-device only for now)
- No backend sync in this iteration — matches Android's current state
Phase i.5 — TestFlight + smoke test (~0.5 day)
- Archive and upload via Xcode
- Add internal testers (developers + you)
- Smoke test: sign in, start Agentic Gathering host, talk for 30 seconds, end, verify
app_users.dinner_profilegot the transcript - If passing, invite external testers (~24h Apple beta review for the first build)
Costs
| Item | Cost | Frequency |
|---|---|---|
| Apple Developer Program | $99 | Annual |
| D-U-N-S number | $0 | One-time |
| TestFlight distribution | $0 | Included |
| Per-session backend cost | ~$0.20 | Per 10-min interview, identical to Android |
What's NOT in this spec
- Live translation feature — the Android app's translation client is its primary feature; porting it to iOS is a separate (much larger) project. This spec covers the Agentic Gathering host flow only.
- Apple Sign-In — required by App Store guidelines if we offer Google Sign-In and want to ship to the public store. Not required for TestFlight prototype. Add before public submission.
- Push notifications — future. Adds APNs setup, certificates, server-side push provider work.
- Public App Store submission — review process is ~24–48h, requires App Store screenshots, privacy disclosures, content rating, etc. Defer until after prototype validates.
Decisions parked for the developer
- Bundle ID: separate (
com.sponicgardens.dinnerhost) or unified with Android (com.sponicgardens.sponic)? Unified is simpler for branding; separate keeps the Agentic Gathering host scope distinct in case the apps diverge. - Min iOS version: iOS 16 vs iOS 17. iOS 16 covers more devices; iOS 17 lets us use newer SwiftUI APIs. Default is iOS 16.
- Repository layout:
apps/mobile-ios/(parallel to Android) vs Kotlin Multiplatform (KMP) shared module. KMP is a much bigger lift — recommend starting with parallel native apps. - Brand voice on TestFlight description: short marketing blurb? Internal-only language? Coordinate with marketing before first external test.
How to start (when Apple approves)
- Read this whole doc.
- Read ai-host-livekit.html for backend context (token endpoint, save endpoint, agent architecture).
- Pull the latest
apps/mobileAndroid code as a feature-by-feature reference for what to mirror. - Confirm Apple Developer Program is active, bundle ID reserved, App Store Connect record exists.
- Run the phases in order. After each phase, commit + ship a TestFlight build for fast feedback.
Last updated 2026-05-06. Update this doc when Apple approves, when bundle ID is decided, and when the first TestFlight build ships.