# BusinessCard Roadmap

This document tracks planned features and their implementation status.

## ✅ Completed Features

### High Priority (Core User Value)

- [x] **Dynamic contact fields system** - Unlimited fields with custom ordering
  - New `ContactField` SwiftData model for flexible field storage
  - `ContactFieldType` struct with 30+ field types across 8 categories
  - Drag-to-reorder support with haptic feedback
  - Sheet-based field editor with type-specific keyboards and placeholders
  - Multiple fields of the same type allowed (e.g., multiple emails)

- [x] **Custom social icons** - Brand-colored icons from asset catalog
  - Custom `.symbolset` assets for all major platforms
  - LinkedIn, X/Twitter, Instagram, Facebook, TikTok, Threads
  - Bluesky, Mastodon, Reddit, Twitch, YouTube, Discord
  - GitHub, Telegram, Slack, Matrix, Patreon, Ko-fi
  - Proper `Image()` vs `Image(systemName:)` handling via `iconImage()` helper

- [x] **Extended name fields** - Prefix, maiden name, pronouns
  - Expandable name section in editor
  - Prefix (Dr., Mr., Mrs., etc.)
  - Maiden name with parentheses formatting in display name
  - Preferred name with quotes formatting
  - Pronouns displayed next to name on card

- [x] **Accreditations as tags** - Tag bubble UI with inline editing
  - Horizontal ScrollView of tag chips
  - Tap to edit, check to save, x to delete
  - Comma-separated storage for vCard compatibility

- [x] **Clickable contact fields** - Deep linking to apps and actions
  - Email → mailto:
  - Phone → tel:
  - Social links → app deep links or web fallback
  - Address → Maps
  - Website → Safari

- [x] **More card fields** - Social media links, custom URLs, pronouns, bio
  - Added: pronouns, bio, LinkedIn, Twitter/X, Instagram, Facebook, TikTok, GitHub
  - Added: 2 custom link slots (title + URL)
  - vCard payload includes social profiles
  
- [x] **Profile photo support** - PhotosPicker integration
  - Added PhotosPicker to CardEditorView
  - Photos stored as Data with `@Attribute(.externalStorage)`
  - Photos display on cards, in editor preview, and contact avatars
  
- [x] **Contact notes/annotations** - Add notes, tags, follow-up reminders
  - Added: notes field (free text)
  - Added: tags (comma-separated, displayed as chips)
  - Added: follow-up date with overdue indicators
  - Added: "where you met" field
  - Added: email and phone for received contacts
  - Full ContactDetailView for editing annotations
  
- [x] **Save received cards** - Scan a QR to add someone else's card
  - Added QRScannerView with camera integration
  - Parses vCard data from scanned QR codes
  - Creates contacts marked as `isReceivedCard`
  - "Scan Card" button in Contacts toolbar

- [x] **watchOS companion app** - Show default card QR code on Apple Watch
  - Full-screen default card display (no card picker)
  - QR codes pre-generated on iPhone (CoreImage not available on watchOS)
  - Syncs via WatchConnectivity framework
  - Automatic sync when cards created, edited, or deleted on iPhone

---

## 🔲 Planned Features

### High Priority (Photo Sharing via App Clip)

- [ ] **App Clip for instant card sharing** - Recipients get full card with photo, no app install
  - Solves the QR code size limitation for photos
  - Recipient scans QR → App Clip loads instantly → "Add to Contacts" with photo
  - Uses CloudKit for ephemeral card storage (auto-deletes after save)
  
  **Implementation phases:**
  
  1. **CloudKit Setup**
     - [ ] Enable CloudKit capability
     - [ ] Create `SharedCard` record type (name, role, company, vCard data, photo asset)
     - [ ] Add `expiresAt` field for auto-cleanup
     - [ ] Implement upload function in main app
     - [ ] Implement cleanup (delete expired cards on app launch)
  
  2. **App Clip Target**
     - [ ] Create App Clip target (<15MB)
     - [ ] Configure Associated Domains (`appclips:yourapp.com`)
     - [ ] Build minimal UI: card preview + "Add to Contacts" button
     - [ ] Fetch card from CloudKit using URL parameter
     - [ ] Use `CNContactStore` to save contact with photo
     - [ ] Call delete/mark-complete on CloudKit after save
  
  3. **Main App Integration**
     - [ ] New "Share via App Clip" option in ShareCardView
     - [ ] Upload card to CloudKit on share
     - [ ] Generate QR code with App Clip URL
     - [ ] Show QR code for scanning
  
  4. **App Store Configuration**
     - [ ] Configure App Clip experience in App Store Connect
     - [ ] Set up App Clip Code or Smart App Banner (optional)
     - [ ] Test invocation URLs

### Lower Priority (Advanced)

- [ ] **Real NFC** - Write card to NFC tags
  - Requires NFC entitlements
  - Requires physical NFC cards/tags
  - Write vCard data to NFC
  
- [ ] **Apple Wallet** - Add card to Wallet
  - Requires PKPass generation
  - May need backend for signing passes
  - Display QR in Wallet app
  
- [ ] **Team features** - Shared team cards
  - Requires user accounts
  - Requires backend infrastructure
  - Team branding, shared templates
  
- [ ] **Track share recipients** - Record who you shared your card with
  - Add contact entry when sharing
  - Track share date, method, and recipient info
  - View share history per card

---

## 🔧 Technical Improvements

### Completed

- [x] **SwiftData persistence** with CloudKit sync
- [x] **Bedrock integration** - Design system, QR code generator
- [x] **iOS-Watch sync** via WatchConnectivity framework
  - ⚠️ App Groups do NOT work for iPhone ↔ Watch (different devices)
  - Uses `updateApplicationContext` for persistent sync
  - Watch app must be embedded in iOS app with "Code Sign On Copy" checked
- [x] **Unit tests** for models, stores, and new features
- [x] **Fixed data persistence** - Removed aggressive store deletion on startup
- [x] **Custom symbol assets** - Brand icons in asset catalog with proper rendering
- [x] **Drag-and-drop reordering** - Using `draggable` and `dropDestination` modifiers
- [x] **Single source of truth for names** - Removed legacy `displayName` property
  - `fullName` computed from individual name fields (prefix, firstName, lastName, etc.)
  - `vCardName` for plain vCard export
  - No stored displayName that can get out of sync

### Planned

- [ ] **WidgetKit extension** - Real home screen widgets
- [ ] **Spotlight indexing** - Search cards from iOS search
- [ ] **Siri shortcuts** - "Share my work card"
- [ ] **App Intents** - iOS 17+ action button support

---

## 📝 Notes

- Features marked with 🔲 are planned but not yet implemented
- Features requiring backend are deferred until infrastructure is available
- Priority may shift based on user feedback
- watchOS uses WatchConnectivity (NOT App Groups) - see `Agents.md` for details
- `fullName` is computed, not stored - never add a `displayName` property

---

*Last updated: January 10, 2026*
