Songbird Mobile
Mobile foundation for the Songbird DAW — iOS and Android apps built with Tauri v2, sharing the same React UI and Rust audio engine as the desktop app.Architecture
Why Tauri v2 (not React Native / Flutter / Capacitor)
| Criterion | Tauri v2 | React Native | Flutter | Capacitor |
|---|---|---|---|---|
| UI code reuse | 100% (same React app) | 0% (rewrite) | 0% (Dart) | ~90% (wrapper) |
| Audio engine | Shared Rust crates | FFI bridge needed | FFI bridge needed | JS bridge (slow) |
| Binary size | ~10MB | ~30MB+ | ~15MB+ | ~20MB+ |
| Latency | Native (Rust → cpal) | JS bridge overhead | Dart FFI overhead | JS bridge overhead |
| Already using | Yes (desktop app) | No | No | No |
Project Structure
Getting Started
Prerequisites
iOS (requires macOS):- Xcode 16+ with iOS 16+ SDK
- Rust with
aarch64-apple-iostarget:rustup target add aarch64-apple-ios - Tauri CLI:
cargo install tauri-cli - CocoaPods (if using Swift plugins):
gem install cocoapods
- Android Studio with SDK 26+ (Android 8.0 Oreo)
- Android NDK (installed via Android Studio SDK Manager)
- Rust with Android targets:
- Tauri CLI:
cargo install tauri-cli - Set
ANDROID_HOMEandNDK_HOMEenvironment variables
Build & Run
Desktop Development
The mobile app crates can also be compiled and run on the desktop host for rapid iteration without a simulator:Mobile-Specific IPC Commands
These commands extend the shared desktop command set with mobile-only functionality:| Command | Description | Platform |
|---|---|---|
get_device_info | Screen metrics, audio capabilities, thermal state | Both |
configure_audio_session | Set audio category (playback/record), sample rate, buffer size | Both |
trigger_haptic | Fire haptic feedback (light/medium/heavy/selection/success) | Both |
songbird-mobile-shared::commands and are used by both iOS and Android apps.
Only get_device_info is platform-specific (returns different defaults per platform).
Audio Session Lifecycle
iOS (AVAudioSession)
Android (AudioManager)
Workspace & Dependency Graph
The mobile crates live in their own Cargo workspace (mobile/Cargo.toml) that
references the core rust/ crates via path dependencies. This keeps a single
Cargo.lock for mobile while sharing the same engine code:
Roadmap
Phase 1: Foundation (this PR)
- Mobile workspace structure with iOS + Android Tauri apps
- Shared mobile crate (audio session, haptics, platform, IPC commands)
- Shared IPC commands — no duplication between iOS and Android
- iOS Xcode project scaffold + Swift AudioSessionPlugin
- Android Gradle project scaffold + Kotlin AudioSessionPlugin
- Build scripts:
utils/build-ios.sh,utils/build-android.sh
Phase 2: Audio Engine Integration
- cpal audio output on iOS (CoreAudio via AVAudioSession)
- cpal audio output on Android (AAudio/Oboe)
- Background audio playback (iOS UIBackgroundMode, Android ForegroundService)
- Audio interruption handling (phone calls, Siri, alarms)
- MIDI device support (CoreMIDI on iOS, android.media.midi on Android)
Phase 3: Touch UI Adaptations
- Responsive layout: phone vs tablet detection
- Touch-optimized piano roll (larger hit targets, pinch-to-zoom)
- Touch-optimized mixer (swipe between tracks, gesture faders)
- Safe area insets for notch/home indicator/nav bar
- Haptic feedback integration for note entry and controls
Phase 4: Platform Features
- AUv3 plugin hosting on iOS (load third-party Audio Unit plugins)
- Inter-app audio on iOS
- Files app integration (iOS) / SAF integration (Android)
- .bird file type association (open Songbird files from Files/file manager)
- Share sheet support (export stems, share projects)
Phase 5: Release
- App Store submission (iOS)
- Play Store submission (Android)
- App icon and launch screen assets
- In-app purchase integration (if applicable)