MusicWall is an iOS app that integrates with Apple Music to help users curate and visualize their album collection.
- Apple Music Integration: Full integration with Apple MusicKit API for searching and playing music
- Dual Search Capability: Search both your personal music library and the Apple Music catalog
- Flexible Layouts: Switch between grid and list views for different browsing experiences
- Smart Sorting: Sort albums by artist, title, or release year with ascending/descending options
- Persistent Storage: Album collections are saved locally using UserDefaults with backup recovery
- One-Tap Playback: Play albums directly from the app using SystemMusicPlayer
- SwiftUI: Modern declarative UI framework
- Observable Pattern: Using
@Observablemacro for reactive state management - MVVM-inspired: Clean separation of concerns with view models and service layers
- SwiftUI: User interface framework
- MusicKit: Apple Music API integration
- Image caching for optimized album artwork loading
- State management with SwiftUI's
@Stateand@Environment - Snackbar notifications for user feedback
MusicWall/
├── MusicWallApp.swift # App entry point
├── ContentView.swift # Main view with authorization handling
├── HomePageView.swift # Primary album display interface
├── AlbumSearchView.swift # Album search and selection
├── Album.swift # Data models and album management
├── MusicService.swift # Apple Music API service layer
├── LayoutViews.swift # Grid and list layout implementations
├── ImageCache.swift # Album artwork caching
├── Core/PreferencesStore.swift # Persistence protocol
├── Adapters/UserDefaultsPreferencesStore.swift
└── SnackbarView.swift # User notification component
- iOS 17.0+
- Xcode 15.0+
- Swift 5.9+
- Apple Music subscription (for catalog access)
- Apple Developer account (for MusicKit entitlements)
GitHub Actions on macos-26 (Xcode 26 default) with Fastlane and match:
| Event | Workflow | Result |
|---|---|---|
Pull request / push to main |
ci-tests.yml |
Simulator unit tests (fastlane ci_tests) |
| Pull request (default, when CI Tests pass) | testflight-release.yml |
TestFlight internal build |
PR with label no-deploy |
testflight-release.yml |
Skip TestFlight upload |
Tag v* (e.g. v1.2.0) |
app-store-release.yml |
App Store upload + submit for review |
Design and setup: docs/specs/2026-05-24-ios-cicd-design.md. Agent conventions: Agent.md.
On PRs, testflight-release.yml is triggered by successful completion of CI Tests.
Local Fastlane (after bundle install):
bundle exec fastlane match appstore --readonly
bundle exec fastlane ci_build
bundle exec fastlane ci_testsThis work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

