mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-22 09:46:42 +02:00
Mukke is a local, offline-first music player for iOS. Songs are imported from iCloud/local files via document picker, stored on device, and played with expo-audio including background playback and lock screen controls. Stack: Expo SDK 55, expo-audio, expo-sqlite, expo-document-picker, @missingcore/audio-metadata, Zustand, NativeWind, Expo Router with NativeTabs. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2.3 KiB
2.3 KiB
CLAUDE.md - Mukke
Offline-first iOS Music Player. Songs aus iCloud/lokalen Dateien importieren, lokal auf dem Gerät speichern, abspielen.
Project Structure
apps/mukke/
├── package.json # Orchestrator (name: mukke)
├── apps/
│ └── mobile/ # @mukke/mobile (Expo SDK 54)
│ ├── app/ # Expo Router screens
│ │ ├── (tabs)/ # 4 Tab-Screens (Bibliothek, Playlists, Suche, Settings)
│ │ ├── player.tsx # Full-Screen Player (modal)
│ │ ├── queue.tsx # Queue Ansicht (modal)
│ │ ├── album/[id] # Album Detail
│ │ ├── artist/[id] # Artist Detail
│ │ └── playlist/ # Playlist Detail + New
│ ├── components/ # UI components
│ ├── contexts/ # AudioContext (expo-audio)
│ ├── stores/ # Zustand stores (player, library, playlist)
│ ├── services/ # Business logic (DB, import, audio, library, playlist)
│ └── utils/ # Theme system
└── packages/
└── mukke-types/ # @mukke/types (shared interfaces)
Commands
pnpm dev:mukke:mobile # Start Expo app
Tech Stack
- Audio: expo-audio (background via UIBackgroundModes: ["audio"])
- Import: expo-document-picker (iCloud + lokale Dateien)
- Storage: expo-file-system (documentDirectory)
- Metadata: @missingcore/audio-metadata (ID3v2.3/v2.4)
- DB: expo-sqlite (SQLite für Songs, Playlists)
- State: Zustand
- Navigation: Expo Router + NativeTabs
- Styling: NativeWind / Tailwind
Architecture
- No backend - pure offline, local-only app
- SQLite for structured data (songs, playlists, playlist_songs)
- Albums/Artists/Genres derived from songs table via queries (no separate tables)
- File storage: documentDirectory/music/ + documentDirectory/artwork/
- Audio playback: expo-audio with background mode
- MiniPlayer: persistent above tab bar
Import Flow
- User taps Import → expo-document-picker opens (iCloud + local)
- Files copied to documentDirectory/music/{uuid}.ext
- Metadata extracted via @missingcore/audio-metadata
- Cover art saved to documentDirectory/artwork/{uuid}.jpg
- Song entry created in SQLite