A modern iOS app for creating and managing music shortlists using Apple's MusicKit and CloudKit. Build curated collections of your favorite albums, organize them by year, and share your musical discoveries.
- 🎵 MusicKit Integration: Search and discover music using Apple's MusicKit framework
- ☁️ CloudKit Sync: Your shortlists sync across all your devices using iCloud
- 📱 Modern SwiftUI Interface: Beautiful, responsive design with dark mode support
- 🔍 Advanced Search: Search by artist to discover albums and add them to your shortlists
- 📊 Visual Grid Layout: See your shortlists as beautiful album artwork grids
- 📧 Sharing: Export your shortlists via email or copy to clipboard
- 🎨 Customizable Ordering: Sort shortlists by year or creation date
- ⚡ Real-time Updates: Changes sync instantly across devices
This project uses Swift Package Manager (SPM) for dependency management. The following packages are included:
- SkeletonUI (2.0.2) - Loading skeleton animations
- swift-custom-dump (1.3.3) - Enhanced debugging output
- swift-snapshot-testing (1.18.5) - Snapshot testing framework
- swift-syntax (601.0.1) - Swift syntax parsing
- xctest-dynamic-overlay (1.6.0) - Dynamic test utilities
- MusicKit - Music discovery and search
- CloudKit - iCloud data synchronization
- SwiftUI - Modern UI framework
- Foundation - Core system services
- Xcode 15.0+ (for iOS 17.0+ support)
- iOS 17.0+ target device or simulator
- Apple Developer Account (for MusicKit and CloudKit capabilities)
- iCloud Account (for data synchronization)
git clone https://github.com/yourusername/ShortlistMusic.git
cd ShortlistMusicopen Shortlist/Shortlist.xcodeprojThe app requires the following capabilities to be enabled in your Apple Developer account:
- Add
NSAppleMusicUsageDescriptionto Info.plist - Request music authorization in your app
- Enable CloudKit capability in Xcode
- Configure CloudKit container:
iCloud.com.dus.shortList - Set up CloudKit schema with the following record types:
Shortlists(name, year, id, createdTimestamp)Albums(title, artist, artwork, rank, shortlistId, upc)
- Select your target device or simulator
- Press
Cmd + Rto build and run - Grant necessary permissions when prompted
Shortlist/
├── CloudKit Manager/ # CloudKit data management
├── Helpers/ # Utility classes and extensions
├── Models/ # Data models (Shortlist, ShortlistAlbum)
├── Sections/ # Main app sections
│ ├── Album Details/ # Album detail views
│ ├── Collections/ # Shortlist management
│ └── Search/ # Music search functionality
├── Theme/ # App theming
└── MusicPermission/ # Music authorization handling
- CloudKitManager: Handles all CloudKit operations
- Record Types: Shortlists and Albums with proper relationships
- Sync Strategy: Real-time synchronization across devices
- Error Handling: Comprehensive error management
- Search: Artist and album discovery
- Authorization: Proper music library access
- Data Models: Integration with Apple Music catalog
- SwiftUI: Modern declarative UI
- MVVM Pattern: Clean separation of concerns
- Custom Components: Reusable UI elements
- Accessibility: Full VoiceOver support
- Standard development build
- Uses development CloudKit container
- Includes debug logging
- Production build for App Store
- Uses production CloudKit container
- Optimized performance
id(String): Unique identifiername(String): Shortlist nameyear(String): Year of the shortlistcreatedTimestamp(Date): Creation date
id(String): Album identifiertitle(String): Album titleartist(String): Artist nameartwork(String): Artwork URLrank(Int): Position in shortlistshortlistId(String): Reference to parent shortlistupc(String): Universal Product Code
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Apple MusicKit for music discovery
- Apple CloudKit for data synchronization
- SkeletonUI for loading animations
- Point-Free for testing utilities