mirror of
https://github.com/meshtastic/Meshtastic-Android.git
synced 2026-03-27 10:11:48 -04:00
6.7 KiB
6.7 KiB
Roadmap
Last updated: 2026-03-12
Forward-looking priorities for the Meshtastic KMP multi-target effort. For current state, see kmp-status.md. For the full gap analysis, see decisions/architecture-review-2026-03.md.
Architecture Health (Immediate)
These items address structural gaps identified in the March 2026 architecture review. They are prerequisites for safe multi-target expansion.
| Item | Impact | Effort | Status |
|---|---|---|---|
Purge java.util.Locale from commonMain (3 files) |
High | Low | ✅ |
Replace ConcurrentHashMap in commonMain (3 files) |
High | Low | ✅ |
Create core:testing shared test fixtures |
Medium | Low | ✅ |
Add feature module commonTest (settings, node, messaging) |
Medium | Medium | ✅ |
Desktop Koin checkModules() integration test |
Medium | Low | ❌ |
| Auto-wire Desktop ViewModels via KSP (eliminate manual wiring) | Medium | Low | ❌ |
Active Work
Desktop Feature Completion (Phase 4)
Objective: Complete desktop wiring for all features and ensure full integration.
Current State (March 2026):
- ✅ Settings: ~35 screens with real configuration, including theme/about parity and desktop language picker support
- ✅ Nodes: Adaptive list-detail with node management
- ✅ Messaging: Adaptive contacts with message view + send
- ✅ Connections: Dynamic discovery of platform-supported transports (TCP)
- ❌ Map: Placeholder only, needs MapLibre or alternative
- ⚠️ Firmware: Placeholder wired into nav graph; native DFU not applicable to desktop
- ⚠️ Intro: Onboarding flow (may not apply to desktop)
Implementation Steps:
- Tier 1: Core Wiring (Essential)
- Complete Map integration (MapLibre or equivalent)
- Verify all features accessible via navigation
- Test navigation flows end-to-end
- Tier 2: Polish (High Priority)
- Additional desktop-specific settings polish
- Keyboard shortcuts
- Window management
- State persistence
- Tier 3: Advanced (Nice-to-have)
- Performance optimization
- Advanced map features
- Theme customization
- Multi-window support
| Transport | Platform | Status |
|---|---|---|
| TCP | Desktop (JVM) | ✅ Done — shared StreamFrameCodec + TcpTransport in core:network |
| Serial/USB | Desktop (JVM) | ❌ Next — jSerialComm |
| MQTT | All (KMP) | ❌ Planned — Ktor/MQTT (currently Android-only via Eclipse Paho) |
| BLE | Desktop | ❌ Future — Kable (JVM) |
| BLE | iOS | ❌ Future — Kable/CoreBluetooth |
Desktop Feature Gaps
| Feature | Status |
|---|---|
| Settings | ✅ ~35 real screens (7 desktop-specific) + desktop locale picker with in-place recomposition |
| Node list | ✅ Adaptive list-detail with real NodeDetailContent |
| Messaging | ✅ Adaptive contacts with real message view + send |
| Connections | ✅ Unified shared UI with dynamic transport detection |
| Metrics logs | ✅ TracerouteLog, NeighborInfoLog, HostMetricsLog |
| Map | ❌ Needs MapLibre or equivalent |
| Charts | ✅ Vico KMP charts wired in commonMain (Device, Environment, Signal, Power, Pax) |
| Debug Panel | ✅ Real screen (mesh log viewer via shared DebugViewModel) |
| About | ✅ Shared commonMain screen (AboutLibraries KMP produceLibraries + per-platform JSON) |
| Packaging | ✅ Done — Native distribution pipeline in CI (DMG, MSI, DEB) |
Near-Term Priorities (30 days)
core:testingmodule — ✅ Done (established shared fakes for cross-modulecommonTest)- Feature
commonTestbootstrap — ✅ Done (131 shared tests across all 7 features covering integration and error handling) - Radio transport abstraction — ✅ Done: Defined
RadioTransportinterface incore:repository/commonMainand replacedIRadioInterface; Next: continue extracting remaining platform transports fromapp/repository/radio/into core modules feature:connectionsmodule — ✅ Done: Extracted connections UI into KMP feature module with dynamic transport availability detection- Navigation 3 parity baseline — ✅ Done: shared
TopLevelDestinationincore:navigation; both shells use same enum; parity tests incore:navigation/commonTestanddesktop/test - iOS CI gate — add
iosArm64()/iosSimulatorArm64()to convention plugins and CI (compile-only, no implementations)
Medium-Term Priorities (60 days)
- App module thinning — 63 files remaining (down from 90). Extracted ChannelViewModel, NodeMapViewModel, NodeContextMenu, EmptyDetailPlaceholder to shared modules. Remaining: extract service/worker/radio files from
apptocore:service/androidMainandcore:network/androidMain - Serial/USB transport — direct radio connection on Desktop via jSerialComm
- MQTT transport — cloud relay operation (KMP, benefits all targets)
- Desktop ViewModel auto-wiring — ensure Koin KSP generates ViewModel modules for JVM target; eliminate manual wiring in
DesktopKoinModule - KMP charting — ✅ Done: Vico charts migrated to
feature:node/commonMainusing KMP artifacts; desktop wires them directly - Navigation contract extraction — ✅ Done: shared
TopLevelDestinationenum incore:navigation; icon mapping incore:ui; parity tests in place. Both shells derive from the same source of truth. - Dependency stabilization — track stable releases for CMP, Koin, Lifecycle, Nav3
Longer-Term (90+ days)
- iOS proof target — declare
iosArm64()/iosSimulatorArm64()in KMP modules; BLE via Kable/CoreBluetooth - Map on Desktop — evaluate MapLibre for cross-platform maps
core:apicontract split — separate transport-neutral service contracts from Android AIDL packaging- Native packaging — ✅ Done: DMG, MSI, DEB distributions for Desktop via release pipeline
- Module maturity dashboard — living inventory of per-module KMP readiness
Design Principles
- Solve in
commonMainfirst. If it doesn't need platform APIs, it belongs incommonMain. - Interfaces in
commonMain, implementations per-target. The repository pattern is established — extend it. - Stubs are a valid first implementation. Every target starts with no-op stubs, then graduates to real implementations.
- Feature modules stay target-agnostic in
commonMain. Platform UI goes in platform source sets. - Transport is a pluggable adapter. BLE, serial, TCP, MQTT all implement
RadioInterfaceService. - CI validates every target. If a module declares
jvm(), CI compiles it. No exceptions. - Test in
commonTestfirst. ViewModel and business logic tests belong incommonTestso every target runs them.