DealDeck Native (iOS)
Summary
Native iOS rebuild of DealDeck — a card-collecting game that gamifies venture capital deal discovery. Built with Swift 6 + SwiftUI, connecting to the existing Supabase backend shared with the Expo/React Native version.
Status: Active — M0-M9 mostly complete, 40 files, builds clean
- Repo: ~/projects/dealdeck-native
- PM Vault: ~/topaz/projects/dealdeck-native/
- Related: ~/projects/dealdeck (Expo v2), ~/topaz/projects/dealdeck/ (Expo PM)
Tech Stack
- Language: Swift 6
- UI: SwiftUI (iOS 17+)
- Architecture: MVVM with @Observable (Observation framework)
- Persistence: SwiftData (local) + Supabase (remote)
- Backend: Existing Supabase project (shared with Expo app)
- Auth: Supabase Swift SDK — Email OTP, Sign in with Apple, Google Sign-In
- Networking: Supabase Swift SDK (supabase-swift)
- Push: APNs (native) — requires edge function update for APNs path
- Package Manager: Swift Package Manager
Architecture Decisions
| Decision | Choice | Rationale |
|---|---|---|
| Min iOS | 17.0 | @Observable, SwiftData, ScrollView improvements |
| State | @Observable classes | Cleaner than Combine, first-class SwiftUI support |
| Local persistence | SwiftData | Native, declarative, replaces Core Data |
| Navigation | NavigationStack + TabView | Native iOS patterns, deep link support |
| Gestures | SwiftUI DragGesture | No third-party library needed |
| Card transitions | matchedGeometryEffect | Fluid hero animations between card states |
| Logos | AsyncImage + logo.dev | Native caching, no expo-image needed |
| Haptics | UIImpactFeedbackGenerator | Native, responsive feedback on card actions |
iOS-Native Features to Leverage
- Live Activities: Pack countdown timer on lock screen
- WidgetKit: Home screen card showcase / portfolio stats
- Context Menus: Long-press on cards (native, not custom)
- ShareLink: Native share sheet for cards
- Dynamic Type: Accessibility-first typography
- SF Symbols: System icons throughout
- Pull-to-refresh: Native .refreshable modifier
- Spotlight: Index saved cards for system search
Backend Changes Required
- Push notifications: Add APNs support to edge functions (currently Expo Push only)
- Card data delivery: Decide between bundled JSON vs fetching from card_catalog table
- No other backend changes — all RPCs, RLS, tables work as-is
Key Metrics
- ~590 company cards, ~15 legend cards, 10 sets
- Shared Supabase project with Expo app (parallel TestFlight)
- Same user accounts work across both apps