BusinessCard/ROADMAP.md

174 lines
6.7 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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