Mobile support: expand plan with Flutter + Tauri details
Clarify mobile phase goals and add concrete, actionable steps to get both Flutter and Tauri GUIs building on Android and iOS. The update highlights iOS requiring macOS, lists known blockers (desktop-only packages and incompatible crates), provides Android/iOS prerequisites and build commands, and adds feature checklists and deliverables to guide implementation and CI setup.
This commit is contained in:
parent
120b5bf83c
commit
376191aee2
152
PLAN.md
152
PLAN.md
|
|
@ -749,73 +749,147 @@ WorkspaceConfig {
|
||||||
|
|
||||||
## Phase 4: Mobile Basic Support
|
## Phase 4: Mobile Basic Support
|
||||||
|
|
||||||
**Goal**: Get app running on iOS and Android ASAP, validate architecture
|
**Goal**: Get both GUIs building and running on Android and iOS, validate cross-platform architecture
|
||||||
|
|
||||||
### Why Early Mobile?
|
### Why Early Mobile?
|
||||||
- De-risk mobile builds early in development
|
- De-risk mobile builds early in development
|
||||||
- Test cross-platform architecture sooner
|
- Test cross-platform architecture sooner
|
||||||
- Tauri v2 has first-class mobile support — same codebase as desktop
|
|
||||||
- Get mobile-specific feedback early
|
- Get mobile-specific feedback early
|
||||||
- Can dogfood on mobile while building desktop features
|
- Can dogfood on mobile while building desktop features
|
||||||
|
|
||||||
### Architecture
|
### Hard Constraint: iOS Requires macOS
|
||||||
|
|
||||||
#### Mobile Build Setup (Tauri v2 Mobile)
|
iOS builds require Xcode, which only runs on macOS. Android builds work fine on Linux. Options for iOS CI:
|
||||||
|
- **GitHub Actions** `macos-latest` runner (free for public repos, paid minutes for private)
|
||||||
|
- **Codemagic / Bitrise** — dedicated mobile CI services
|
||||||
|
- A physical Mac
|
||||||
|
|
||||||
Tauri v2 supports iOS and Android natively. The same Svelte frontend and Rust backend are used, with platform-specific configuration.
|
All Android work can be done locally on Linux. iOS must go through CI or a Mac.
|
||||||
|
|
||||||
**iOS**:
|
---
|
||||||
- Tauri generates Xcode project
|
|
||||||
- Bundle identifier: `com.onyx.app`
|
|
||||||
- Target: `aarch64-apple-ios`
|
|
||||||
|
|
||||||
**Android**:
|
### Flutter GUI (Priority Path)
|
||||||
- Tauri generates Gradle project
|
|
||||||
- Min SDK: 26 (Android 8.0)
|
|
||||||
- NDK handles Rust compilation
|
|
||||||
|
|
||||||
#### Mobile Adaptation
|
Flutter + flutter_rust_bridge was designed for mobile from the start and is the lower-risk path.
|
||||||
|
|
||||||
|
#### Known Blockers
|
||||||
|
|
||||||
|
**`window_manager` is desktop-only** (`pubspec.yaml` line 13). This package crashes or fails to compile on mobile. Must be gated behind `Platform.isDesktop` checks before any mobile build will succeed.
|
||||||
|
|
||||||
|
**No platform directories exist yet.** `apps/flutter/android/` and `apps/flutter/ios/` have not been generated. Run `flutter create --platforms android,ios .` from `apps/flutter/` to scaffold them.
|
||||||
|
|
||||||
|
#### Android Prerequisites
|
||||||
|
|
||||||
|
1. Android Studio + NDK installed, `ANDROID_HOME` and `NDK_HOME` set
|
||||||
|
2. `cargo install cargo-ndk`
|
||||||
|
3. Rust Android targets: `rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android`
|
||||||
|
|
||||||
|
flutter_rust_bridge invokes cargo-ndk automatically during `flutter build apk` — no manual cross-compilation step needed.
|
||||||
|
|
||||||
|
#### Build Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Android
|
||||||
|
cd apps/flutter
|
||||||
|
flutter build apk # release APK
|
||||||
|
flutter build apk --debug # debug APK for sideloading
|
||||||
|
|
||||||
|
# iOS (macOS CI only)
|
||||||
|
flutter build ios --no-codesign # unsigned build for simulator
|
||||||
|
flutter build ipa # signed IPA for TestFlight
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Features
|
||||||
|
|
||||||
|
- [ ] Gate `window_manager` behind `Platform.isDesktop` checks
|
||||||
|
- [ ] Generate Android platform (`flutter create --platforms android .`)
|
||||||
|
- [ ] Generate iOS platform (`flutter create --platforms ios .`)
|
||||||
|
- [ ] Install cargo-ndk + Android Rust targets (Android prereqs)
|
||||||
|
- [ ] Confirm `flutter build apk` succeeds locally
|
||||||
|
- [ ] Set up macOS CI for iOS builds
|
||||||
|
- [ ] Confirm `flutter build ios` succeeds on CI
|
||||||
|
- [ ] Basic smoke test: app launches, workspace setup, create a task
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Tauri GUI
|
||||||
|
|
||||||
|
Tauri v2 has mobile support but it's newer and less mature. Requires more code surgery than Flutter.
|
||||||
|
|
||||||
|
#### Known Blockers
|
||||||
|
|
||||||
|
**`notify` crate doesn't compile for mobile.** The file-watcher subsystem (`notify` + `notify-debouncer-mini` in `Cargo.toml`) does not support Android or iOS targets. The entire file-watcher initialization path must be gated behind `#[cfg(not(mobile))]` before cross-compilation will succeed.
|
||||||
|
|
||||||
|
**Desktop-only window config.** `tauri.conf.json` has `decorations: false` and `transparent: true` — these are ignored on mobile but may cause confusion. Mobile uses full-screen native WebViews.
|
||||||
|
|
||||||
|
**No mobile init done.** `gen/android/` and `gen/ios/` Gradle/Xcode projects have not been generated yet.
|
||||||
|
|
||||||
|
#### Android Prerequisites
|
||||||
|
|
||||||
|
1. Android Studio + NDK r26+ installed, `ANDROID_HOME` and `NDK_HOME` set
|
||||||
|
2. Rust Android targets: `rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android`
|
||||||
|
|
||||||
|
#### Build Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd apps/tauri
|
||||||
|
|
||||||
|
# Android
|
||||||
|
npm run tauri android init # first time: generates gen/android/
|
||||||
|
npm run tauri android dev # dev build with hot reload
|
||||||
|
npm run tauri android build # release APK/AAB
|
||||||
|
|
||||||
|
# iOS (macOS CI only)
|
||||||
|
npm run tauri ios init # first time: generates gen/ios/
|
||||||
|
npm run tauri ios dev
|
||||||
|
npm run tauri ios build
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Features
|
||||||
|
|
||||||
|
- [ ] Gate file-watcher initialization behind `#[cfg(not(mobile))]`
|
||||||
|
- [ ] Install Android Studio + NDK, configure env vars
|
||||||
|
- [ ] Add Android Rust targets
|
||||||
|
- [ ] `npm run tauri android init` (generates `gen/android/`)
|
||||||
|
- [ ] Confirm `npm run tauri android build` succeeds
|
||||||
|
- [ ] Set up macOS CI for iOS builds
|
||||||
|
- [ ] `npm run tauri ios init` (generates `gen/ios/`)
|
||||||
|
- [ ] Confirm `npm run tauri ios build` succeeds on CI
|
||||||
|
- [ ] Basic smoke test: app launches, workspace setup, create a task
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Shared Mobile Adaptation (Both GUIs)
|
||||||
|
|
||||||
**Touch Support**:
|
**Touch Support**:
|
||||||
- Tailwind responsive utilities for mobile-friendly layouts
|
|
||||||
- Larger touch targets (44pt minimum)
|
- Larger touch targets (44pt minimum)
|
||||||
- Mobile-specific Svelte components where needed
|
- Mobile-responsive layouts
|
||||||
- Test on real devices
|
- Test on real devices
|
||||||
|
|
||||||
**File System Access**:
|
**File System Access**:
|
||||||
- iOS: App sandbox documents directory + Tauri file dialog plugin
|
- iOS: App sandbox documents directory + file dialog plugin
|
||||||
- Android: Scoped storage + Tauri file dialog plugin
|
- Android: Scoped storage + file dialog plugin
|
||||||
|
|
||||||
#### First Run on Mobile
|
**First Run on Mobile**:
|
||||||
- Show folder picker on first launch
|
- Show folder picker on first launch
|
||||||
- Suggest locations: Documents, iCloud Drive (iOS), Google Drive (Android)
|
- Suggest: Documents, iCloud Drive (iOS), Google Drive (Android)
|
||||||
- User selects folder, path stored in preferences
|
- User selects folder, path stored in preferences
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
- [ ] Tauri v2 iOS build pipeline setup
|
|
||||||
- [ ] Tauri v2 Android build pipeline setup
|
|
||||||
- [ ] Mobile-responsive Svelte/Tailwind layout
|
|
||||||
- [ ] File system access on iOS
|
|
||||||
- [ ] File system access on Android
|
|
||||||
- [ ] Folder picker for mobile
|
|
||||||
- [ ] Basic task CRUD on mobile
|
|
||||||
- [ ] Test on real devices
|
|
||||||
|
|
||||||
### Deliverables
|
### Deliverables
|
||||||
|
|
||||||
- [ ] App launches on iOS
|
- [ ] Flutter APK builds locally on Linux (Android)
|
||||||
- [ ] App launches on Android
|
- [ ] Tauri APK builds locally on Linux (Android)
|
||||||
- [ ] Can create and view tasks on mobile
|
- [ ] Flutter iOS builds on macOS CI
|
||||||
|
- [ ] Tauri iOS builds on macOS CI
|
||||||
|
- [ ] Basic task CRUD works on mobile (both GUIs)
|
||||||
- [ ] Validates cross-platform architecture
|
- [ ] Validates cross-platform architecture
|
||||||
- [ ] Foundation for future mobile polish
|
|
||||||
|
|
||||||
### Distribution
|
### Distribution
|
||||||
|
|
||||||
- iOS: .ipa for TestFlight (early access)
|
|
||||||
- Android: .apk (direct install / sideloading)
|
- Android: .apk (direct install / sideloading)
|
||||||
|
- iOS: .ipa for TestFlight (early access)
|
||||||
|
|
||||||
**Note**: This phase prioritizes getting mobile working, even with a simple UI. Polish comes in Phase 6.
|
**Note**: This phase prioritizes getting mobile building and launching, even with a simple UI. Touch polish comes in Phase 6.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -983,6 +1057,6 @@ This project is free and open-source software licensed under GPL v3.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Last Updated**: 2026-03-30
|
**Last Updated**: 2026-04-01
|
||||||
**Document Version**: 4.0
|
**Document Version**: 4.1
|
||||||
**Status**: Ready to Implement - Milestone-Driven Plan
|
**Status**: Ready to Implement - Milestone-Driven Plan
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue