An open-source Flutter client for the MeshCore LoRa mesh network — a companion app for tracker/radio devices like the Seeed T1000-E that pair over BLE and exchange messages over the local mesh. Offline-first, theme-driven, with a hyperlocal radar grid, per-channel chat, 1:1 DMs, and a device-first → phone-fallback location model.
Status — in development. Source is here for review and contribution; there's no public release channel yet. 125 widget/unit tests passing,
flutter analyzeclean on Android + iOS Dart paths. Android FGS path for R17 is implemented but unverified on-device in our sandbox
Honest UI mockups in the SEELE Monolith default theme. Real builds will look the same modulo platform fonts.
The UX design brief covers the six concept themes (NERV, AG-HUD, Hyperlocal, SEELE, DR Pop, Recon) with palette anchors and per-theme rendering plans.
- Design brief (Markdown):
meshmore-sns-UX-brief.md - Design brief (HTML — has the per-theme SVG grid mockups):
meshmore-sns-UX-brief.html
The full requirements list (R1–R27) and UX plan (U0–U15) live in:
- Requirements spec:
meshmore-sns-spec.md - UX implementation spec:
meshmore-sns-UX-spec.md
Highlights of what's already shipping:
- Companion protocol over BLE end-to-end: APP_START handshake, contact/advert ingestion, channel & DM send/receive, SET_ADVERT_NAME / SET_ADVERT_LATLON / SET_OTHER_PARAMS, auto-reconnect with backoff (R17), Android foreground service for background keep-alive.
- Per-channel chat (R6) + 1:1 DMs (R6 extended) with persisted history, per-message Reply/Copy/Delete (R20), per-channel TTS toggle (R5).
- Hyperlocal grid (R18 / U9) — radial range-rings with hybrid GPS → RSSI → hash-bearing positioning, recency-fade brightness, pulse for known, rapid blink for favourite, anonymous-channel ripple, reduce-motion fallback, tap-to-select detail sheet, Pause/Play with selectable interval, six-stop Range slider (Room → Wide).
- Device-first / phone-fallback location (R22) —
SelfInfo.latitude/longitudepopulatemc.ownLocationdirectly; if the device reports(0, 0)we fall back to a one-shotgeolocatorfix. Dashboard surfaces source + coordinates; Nodes rows show inline distance estimates. - First-run permissions UX (R21) with proactive Bluetooth ask, just-in-time Notifications (only when "Stay connected in background" is enabled), and a fully-supported offline mode.
- Per-theme presets wired through tokens (
lib/theme/mm_tokens.dart); the brief covers the visual identity per theme. - Diagnostics screen with a bounded RAW FRAME LOG scroll (R23) for live protocol inspection.
Forward-looking but already speccd (not built):
- R24 per-channel notification settings.
- R25 reverse-geocoded equal-grid map view.
- R26 XR data streaming via private temp-URL reverse proxy.
- R27 Globe.GL macro view inside a WebView with a pre-cached macro basemap.
cd meshmore_sns_app/responsive_starter_app
flutter pub get
flutter run # debug on a connected device
flutter analyze # static analysis
flutter test # 125 tests at time of writingSubmodule note — the meshcore codec lives at
meshmore_sns_app/packages/meshcore and is consumed via a path:
dependency in pubspec.yaml. Tests in the responsive app reach the
codec directly.
meshmore-sns/
├── README.md ← this file
├── meshmore-sns-spec.md ← R1–R27 requirements
├── meshmore-sns-UX-spec.md ← U0–U15 implementation plan
├── meshmore-sns-UX-brief.md/.html ← visual design brief
├── brand/ ← logo work + mockup generators
│ ├── _app_screens.py ← regenerates screens/*.svg
│ ├── _grid_mockup.py ← per-theme grid mockups in the brief
│ ├── _render_plan.py ← per-theme rendering plan in the brief
│ └── _apply_headers.py ← MIT/SPDX header sweep
├── screens/ ← README screen mockups
└── meshmore_sns_app/ ← the Flutter project (git submodule)
├── packages/meshcore/ ← pure-Dart protocol codec
└── responsive_starter_app/ ← Flutter app
├── lib/ ← all controllers, screens, theme, perms…
├── test/ ← 125 widget/unit tests
├── android/ ← FGS manifest, BLE perms
└── ios/ ← Info.plist usage strings
- MeshCore project: https://github.com/ripplebiz/MeshCore — the LoRa
mesh-network protocol + firmware that runs on the radio devices this app
pairs with (T1000-E etc.). Our
packages/meshcore/is a Dart re-implementation of the companion-protocol codec, written against the public source. - Hardware reference: Seeed Studio T1000-E tracker device used as the primary on-device test target.
| Package | Use |
|---|---|
flutter |
Framework + Material widgets |
provider |
State + DI |
go_router |
Routing |
flutter_blue_plus |
BLE link to the MeshCore device |
permission_handler |
OS permissions (Bluetooth, notifications, location) |
geolocator |
Phone-GPS one-shot fallback (R22) |
flutter_foreground_task |
Android connectedDevice FGS for background keep-alive (R17 / U8) |
flutter_tts |
Text-to-speech for inbound channel messages (R5) |
shared_preferences |
Local prefs (theme, favourites, known set, first-run, chat history) |
flutter_native_splash |
Launch splash |
cupertino_icons |
iOS-style glyphs |
responsive_toolkit |
Breakpoint helpers |
package_info_plus, device_info_plus |
App/device introspection (About screen, Diagnostics) |
intl |
Locale + formatting |
flutter_localizations |
L10n scaffolding (R4) |
flutter_lints |
Lint config (dev) |
flutter_launcher_icons |
Build-time icon generation (dev) |
- Globe.GL — referenced by R27 (future Globe macro view inside a WebView).
- OpenStreetMap raster tiles — one candidate basemap source for R25 (future reverse-geocoded equal-grid map).
- Natural Earth, GeoNames — public data sources we'd consider for a custom minimal tile DB (R25 alternative path).
The brief's six concept themes draw aesthetic inspiration from a range of
cultural / industrial sources. No copyrighted assets are used — palette
anchors, glyph language, and motifs are our own implementation in Flutter
tokens (lib/theme/mm_tokens.dart); the names below are credits for the
visual lineage:
- NERV Terminal / SEELE Monolith — Neon Genesis Evangelion (Khara).
- AG-HUD Velocity — Aegis-class combat-system HUDs (generic naval / pilot HUD idiom).
- Hyperlocal Field — sonar / hydrology display conventions.
- DR Pop / Pure Phase — halftone-pop poster idiom; the shipped logo builds from this concept.
- Tactical Recon / Codec — Metal Gear codec-screen idiom (Konami).
Fonts default to the platform's system family (no bundled fonts).
Some test vectors under packages/meshcore/test/vectors/ are captured from
public MeshCore traffic between reference firmware builds, used as
known-good interop fixtures. The captures are byte-for-byte
deterministic and contain no PII.
MIT — Copyright (c) 2026 IoTone, Inc.
The protocol codec at meshmore_sns_app/packages/meshcore/ is published under the
same MIT license; see its LICENSE.