174 lines
6.7 KiB
Markdown
174 lines
6.7 KiB
Markdown
# 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*
|