Skip to content

feat: CarPlay audio app redesign with browse grid, artwork, and Siri search#121

Merged
formatBCE merged 10 commits intomusic-assistant:mainfrom
hayupadhyaya:carplay-app
Feb 24, 2026
Merged

feat: CarPlay audio app redesign with browse grid, artwork, and Siri search#121
formatBCE merged 10 commits intomusic-assistant:mainfrom
hayupadhyaya:carplay-app

Conversation

@hayupadhyaya
Copy link
Copy Markdown
Contributor

@hayupadhyaya hayupadhyaya commented Feb 24, 2026

Summary

Complete redesign of CarPlay interface with single root template, 7-category browse grid, dynamic artwork loading, and SiriKit integration for voice-driven search and playback.

Changes

  • Single Root Template: Replaced CPTabBarTemplate with CPListTemplate (avoids iOS 18+ constraints)
  • Browse Categories: CPGridTemplate with Artists, Albums, Tracks, Playlists, Audiobooks, Podcasts, Radio
  • Adaptive Icons: Dark/light mode rendering with theme colors (#404378/#C0C1FF dark, #E0DEFF/#575992 light)
  • Artwork System: NSCache-backed CarPlayImageLoader with async loading and in-place updates
  • Recommendation Folders: CPListImageRowItem with thumbnails (up to 8 per folder)
  • SiriKit Integration: INPlayMediaIntentHandling for voice search/playback (in-process, no extension)
  • KmpHelper Bridge: All data fetch methods exposed to Swift (iOS-only in iosMain)
  • Documentation: Full architecture guide in .claude/carplay.md

Files Changed

  • CarPlaySceneDelegate.swift — Complete redesign
  • CarPlayContentManager.swift — Expanded fetch + mapping
  • iOSApp.swift — Intent handler routing
  • SiriIntentHandler.swift — NEW, INPlayMediaIntentHandling
  • Info.plist — Siri usage + intents
  • CarPlay.entitlements — Siri capability
  • project.pbxproj — Register new file
  • KmpHelper.kt — All category + search methods
  • .claude/carplay.md — NEW, architecture docs
  • README.md — Remove duplicate section

Test Plan

  • Build succeeds
  • CarPlay connects on simulator
  • Browse grid displays all 7 categories
  • Category lists load with artwork
  • Item selection plays media
  • Recommendation folders load async
  • Dark/light mode icons work
  • Siri search resolves (needs physical device)

Notes

  • iOS-only changes — no shared Kotlin modifications
  • In-process intent handling avoids KMP re-initialization
  • Koin initialization timing guard (CarPlay may connect before MainViewController)
  • Siri not yet triggering — tracked in TODO (may need intent donations or physical device test)

Hay Upadhyaya and others added 10 commits February 24, 2026 01:02
- Replace 3-tab layout (Home/Library/Search) with single Library root
- Browse section uses CPListImageRowItem with themed category icons
  (Albums, Playlists, Audiobooks, Radio) matching app's purple theme
- Recently Played section loads async below Browse
- Add Audiobooks and Radio category navigation
- Add KmpHelper bridge methods for audiobooks and radio stations
- Expand search to include AUDIOBOOK and RADIO media types
- Add AppDelegate for CarPlay scene routing
- Defer CarPlay template setup until Koin/KMP is initialized
- Register CarPlay files and entitlements in Xcode project
- Fix CarPlayContentManager item mapping to use KMP subtitle property

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add .claude/carplay.md with template constraints, file map, and patterns
- Update project.md and project-structure.md to reference CarPlay docs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add async image loading with NSCache for CarPlay list items, replacing
SF Symbol placeholders with actual album/playlist artwork from the server.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace single "Recently Played" section with per-folder image rows
(Recently Added Tracks, Random Albums, etc.). Each folder renders as a
CPListImageRowItem with up to 8 artwork thumbnails. Empty folders and
items without a playable URI are filtered out.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use UIImageAsset to register both light and dark variants of browse
category images so they update automatically on appearance change.
Light: #E0DEFF bg / #575992 icon. Dark: #404378 bg / #C0C1FF icon.
Replace image row browse with a CPListItem that pushes a CPGridTemplate
showing all 7 categories (Artists, Albums, Tracks, Playlists, Audiobooks,
Podcasts, Radio). Grid adapts to any CarPlay screen size. Icons rendered
without background at 80% size for clarity.
Wire up in-process INPlayMediaIntentHandling so Siri can search and
play media. Adds Siri entitlement, Info.plist keys, and AppDelegate
intent routing. Siri not yet triggering — tracked in TODO.
Copy link
Copy Markdown
Collaborator

@formatBCE formatBCE left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great!

@formatBCE formatBCE merged commit 97b1fd6 into music-assistant:main Feb 24, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants