# 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*