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

DecisionChoiceRationale
Min iOS17.0@Observable, SwiftData, ScrollView improvements
State@Observable classesCleaner than Combine, first-class SwiftUI support
Local persistenceSwiftDataNative, declarative, replaces Core Data
NavigationNavigationStack + TabViewNative iOS patterns, deep link support
GesturesSwiftUI DragGestureNo third-party library needed
Card transitionsmatchedGeometryEffectFluid hero animations between card states
LogosAsyncImage + logo.devNative caching, no expo-image needed
HapticsUIImpactFeedbackGeneratorNative, 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

  1. Push notifications: Add APNs support to edge functions (currently Expo Push only)
  2. Card data delivery: Decide between bundled JSON vs fetching from card_catalog table
  3. 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