Appendix F: Audio Universe (Shop Manual)
Status: v1.0 submitted to App Store APR 25 2026 (submission ID 964e4428), awaiting review. GPL v3. Public repo at github.com/fluhartyml/Audio-Universe. Build-Along chapter: Part VII Build-Along 04. Audio Universe by Claude is a four-tab audio utility that puts four different Apple audio frameworks behind four self-contained surfaces. Each tab is a single-session tool — nothing is stored, nothing syncs, nothing has history. Output flows to other apps (Notes, Files, Messages, Mail) via the system share sheet.
What it is
One app, four feature tabs, each owning exactly one Apple audio kit:
- Stream — pick an Apple Music song, hear it play. Playback only, no output. (MusicKit.)
- Record — capture a short clip to temp storage, play it back, share the file. (AVFoundation.)
- Identify — tap Listen, ShazamKit matches the song, the match auto-adds to the user's "My Shazam Tracks" library, tapping the match opens it in Apple Music or the iTunes Store. (ShazamKit.)
- Transcribe — tap Start, talk, tap Stop, share the resulting text. (Speech framework.)
Plus an Under the Hood tab that lets the user browse every source file of the app inside the app. Five tabs total.
Architecture overview
SwiftUI plus four Apple audio frameworks. No SwiftData, no CloudKit, no custom networking. Each tab owns its kit and nothing else.
- App entry:
Claudes_Audio_UniverseApp.swift—@mainscene with oneWindowGrouphostingContentView. - Root:
ContentView.swift—TabViewwith the four feature tabs plus Under the Hood, wired throughAppShell.swiftfor shared chrome. - Feature tabs:
StreamView.swift— MusicKit:ApplicationMusicPlayer,MusicCatalogSearchRequest,MusicSubscription.RecordView.swift— AVFoundation:AVAudioRecorder,AVAudioPlayer,AVAudioSession(.playAndRecord).IdentifyView.swift— ShazamKit:SHManagedSession(iOS 15+ / macOS 12+),SHLibrary.default.addItems()(iOS 17+ / macOS 14+) for auto-save to "My Shazam Tracks."TranscribeView.swift— Speech:SFSpeechRecognizer,SFSpeechAudioBufferRecognitionRequest.
- Placeholders:
PlaceholderTab.swift— a generic "feature unavailable on this platform" view used when a kit doesn't have a Mac equivalent. - Auxiliary surfaces:
AboutView.swift(icon, version, credit),FeedbackView.swift(mail composer for Bug Report / Feature Request). - Under the Hood:
UnderTheHoodView.swift+UnderTheHoodContent.swift(in-app source browser with per-file callout sheets). - Lexicon Quick-Define:
LexiconContent.swift,LexiconSheet.swift,IdentifierTaggedSourceView.swift— same three-file pattern as Claude's Web Wrapper (Appendix J) and QuickNote (Appendix S). - Notes:
DeveloperNotes.swift— canonical reference; mirrors to the wiki's Developer-Notes.md page after every change.
The four kits, side by side
The teaching value of this app is that all four audio frameworks live in one project. Each *View.swift file is a complete, runnable example of its kit:
- MusicKit — user subscription gated, async search, queue-based playback.
- AVFoundation — the long-running standard. Records to a temporary file URL, plays back via
AVAudioPlayer, hands the file to the share sheet. - ShazamKit — microphone-only listening session that returns a recognized
SHMediaItemwith metadata and an Apple Music deep link. - Speech — live microphone transcription with on-device recognition when available, server-side fallback when not.
Reading the four files in order gives a working knowledge of where each kit fits in the system.
Permissions matrix
Three of the four tabs need microphone permission; one of those also needs speech-recognition permission. The Info.plist carries the matching strings:
NSMicrophoneUsageDescription— required by Record, Identify, and Transcribe.NSSpeechRecognitionUsageDescription— required by Transcribe specifically (the recognizer separate from raw mic access).NSAppleMusicUsageDescription— required by Stream and by Identify's "open in Apple Music" hand-off.
Each tab requests its permission on first use, not at launch. If the user denies a permission, the tab shows a "this needs X permission" inline state with a button that deep-links to Settings.
Session-only design
Nothing in this app persists across launches. A recorded clip lives in temp storage, gets played back if the user wants, gets shared if the user wants, and disappears when the tab is left or the app is quit. A transcribed conversation exists only as the in-memory string until the user shares it. A Shazam match goes into the user's system "My Shazam Tracks" library (an Apple service, not this app's storage); the in-app view of the match disappears on tab change.
That choice keeps the app's data surface near zero. There's no privacy policy to write about user data — there isn't any user data to write about. The share sheet is the explicit, user-driven hand-off to anywhere the user actually wants to keep something.
Build + deployment
- App name: Audio Universe by Claude (App Store).
- Platforms: iPhone + iPad universal. Mac via Designed for iPad. Some tabs degrade on Mac (ShazamKit's
SHLibraryauto-save is iOS-only; the Identify tab shows the Mac-fallback placeholder for that capability). - Frameworks: SwiftUI, MusicKit, AVFoundation, ShazamKit, Speech, MessageUI (feedback composer).
- Deployment floor: iOS 17+ / iPadOS 17+ / macOS 14+ — raised from the original v1.0 floor so the
SHLibrary.default.addItems()API is available. - Subscription disclosure: Apple Music subscription required for the Stream tab. Stated upfront in App Store copy.
Known gotchas
- ShazamKit's auto-save is iOS 17+ / macOS 14+ only. Pre-floor devices get the recognition but not the "added to My Shazam Tracks" hand-off. The app's deployment floor was raised specifically to make this feature consistent across all supported devices.
- AVAudioSession category matters.
Recorduses.playAndRecord; if any other tab sets a different category and the user switches tabs mid-session, the active recording can drop. The fix is to set the session category inRecordView'sonAppearand never assume a global state. - Stream needs an active Apple Music subscription. Without one,
MusicSubscription.currentreports inactive and the Stream tab shows a subscribe call-to-action. App Store users who don't subscribe should still see a working Stream tab UI — just locked. - The Under the Hood source is hand-mirrored. Same constraint as the Web Wrapper (Appendix J):
UnderTheHoodContent.swiftis updated by hand when project files change. The in-app source view mirrors the shipped binary, not the bleeding edge.
Sources
- Project source: github.com/fluhartyml/Audio-Universe (verified 2026-05-10).
- Canonical roadmap:
Claudes Audio Universe/DeveloperNotes.swiftin the project repo (mirrors to wiki Developer-Notes.md). - Build-Along chapter: Part VII Build-Along 04.
- Related Lexicon Quick-Define implementation: Appendix J (Claude's Web Wrapper) covers the same three-file pattern in detail.