Files
Meshtastic-Android/docs/roadmap.md

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:

  1. Tier 1: Core Wiring (Essential)
    • Complete Map integration (MapLibre or equivalent)
    • Verify all features accessible via navigation
    • Test navigation flows end-to-end
  2. Tier 2: Polish (High Priority)
    • Additional desktop-specific settings polish
    • Keyboard shortcuts
    • Window management
    • State persistence
  3. 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)

  1. core:testing module Done (established shared fakes for cross-module commonTest)
  2. Feature commonTest bootstrap Done (131 shared tests across all 7 features covering integration and error handling)
  3. Radio transport abstraction Done: Defined RadioTransport interface in core:repository/commonMain and replaced IRadioInterface; Next: continue extracting remaining platform transports from app/repository/radio/ into core modules
  4. feature:connections module Done: Extracted connections UI into KMP feature module with dynamic transport availability detection
  5. Navigation 3 parity baseline Done: shared TopLevelDestination in core:navigation; both shells use same enum; parity tests in core:navigation/commonTest and desktop/test
  6. iOS CI gate — add iosArm64()/iosSimulatorArm64() to convention plugins and CI (compile-only, no implementations)

Medium-Term Priorities (60 days)

  1. App module thinning — 63 files remaining (down from 90). Extracted ChannelViewModel, NodeMapViewModel, NodeContextMenu, EmptyDetailPlaceholder to shared modules. Remaining: extract service/worker/radio files from app to core:service/androidMain and core:network/androidMain
  2. Serial/USB transport — direct radio connection on Desktop via jSerialComm
  3. MQTT transport — cloud relay operation (KMP, benefits all targets)
  4. Desktop ViewModel auto-wiring — ensure Koin KSP generates ViewModel modules for JVM target; eliminate manual wiring in DesktopKoinModule
  5. KMP charting Done: Vico charts migrated to feature:node/commonMain using KMP artifacts; desktop wires them directly
  6. Navigation contract extraction Done: shared TopLevelDestination enum in core:navigation; icon mapping in core:ui; parity tests in place. Both shells derive from the same source of truth.
  7. Dependency stabilization — track stable releases for CMP, Koin, Lifecycle, Nav3

Longer-Term (90+ days)

  1. iOS proof target — declare iosArm64()/iosSimulatorArm64() in KMP modules; BLE via Kable/CoreBluetooth
  2. Map on Desktop — evaluate MapLibre for cross-platform maps
  3. core:api contract split — separate transport-neutral service contracts from Android AIDL packaging
  4. Native packaging Done: DMG, MSI, DEB distributions for Desktop via release pipeline
  5. Module maturity dashboard — living inventory of per-module KMP readiness

Design Principles

  1. Solve in commonMain first. If it doesn't need platform APIs, it belongs in commonMain.
  2. Interfaces in commonMain, implementations per-target. The repository pattern is established — extend it.
  3. Stubs are a valid first implementation. Every target starts with no-op stubs, then graduates to real implementations.
  4. Feature modules stay target-agnostic in commonMain. Platform UI goes in platform source sets.
  5. Transport is a pluggable adapter. BLE, serial, TCP, MQTT all implement RadioInterfaceService.
  6. CI validates every target. If a module declares jvm(), CI compiles it. No exceptions.
  7. Test in commonTest first. ViewModel and business logic tests belong in commonTest so every target runs them.