DashNav

DashNav
Turn-by-turn navigation, mirrored live to a KTM motorcycle’s Gen3 TFT dashboard.
Project Overview
DashNav is a premium iOS navigation companion for KTM riders: it mirrors turn-by-turn guidance straight onto the motorcycle’s own Gen3 TFT dashboard over Bluetooth, so the next turn is in front of the rider, not buried in a phone mount. Google Maps stays the planning tool — a rider shares a route into DashNav, it downloads once, and the ride runs completely offline from there: no signal needed on the road.
The standout engineering work is the KTM BCCU protocol itself — reverse-engineered, reimplemented from scratch in native Swift, and verified by rendering live encrypted turn icons, distances, and road names on a real KTM Adventure 250’s dashboard.
Features Built
My Responsibilities
- Full product build: 24+ milestones end to end — BLE discovery, protocol reverse-engineering, an offline navigation engine, a route library, native iOS integrations, a premium design pass, and a navigation redesign — from a single Flutter + Swift codebase.
- Reverse-engineered the KTM BCCU protocol: implemented the challenge/response handshake, AES-128-CBC control-plane encryption, and SHA-512 session-key derivation natively in Swift, matching the real dashboard byte-for-byte and proven by rendering live encrypted content on the TFT.
- Offline-first navigation engine: a pure-Dart
NavigationEnginedrives turn-by-turn guidance, off-route detection with automatic rerouting, and route progress tracking — entirely on-device once a route is downloaded, no network required. - Native iOS integration layer: CoreBluetooth and CoreLocation in Swift (Flutter never touches CoreBluetooth directly), a WidgetKit home-screen widget, ActivityKit Live Activities, App Intents for Siri & Shortcuts, and Home Screen Quick Actions — all funneling through one shared pending-action pipeline so a voice command, a widget tap, and a quick action can never disagree.
- Backend: a Node/Express service that proxies Google’s motorcycle-aware Routes API, keeping the Google API key server-side and never shipping it in the app.
- Design system & UX: a dark-only Material 3 theme with a KTM-orange accent, custom
CustomPaintermaneuver glyphs instead of generic map icons, and a bottom tab-bar navigation redesign with a regrouped, decluttered Settings screen. - Monetization iteration: shipped, tested, and ultimately retired two different paid models (a one-time unlock, then credit-metered routing) before landing on a fully free app, with the dormant purchase code cleanly left in place rather than ripped out mid-flight.
- Release engineering: App Store submission under the DashNav brand, privacy manifest, TestFlight, and a live, published, free release.
Tech Stack
| Category | Tools / Libraries |
|---|---|
| Frontend | Flutter, Dart, Material 3, go_router (StatefulShellRoute), custom CustomPainter graphics |
| State & Persistence | flutter_bloc / Cubit, HydratedBloc, equatable |
| Native iOS | Swift, CoreBluetooth, CoreLocation, WidgetKit, ActivityKit, App Intents, AVSpeechSynthesizer |
| Backend | Node.js (Express) on cPanel, Google Routes API (Compute Routes) |
| Protocol | Reverse-engineered KTM BCCU BLE protocol, AES-128-CBC, SHA-512 key derivation |
| Diagnostics | Firebase Crashlytics, Analytics, Remote Config |
| Dev Tools | flutter analyze, widget & unit tests, Xcode, xcrun simctl |
Architecture Highlights
- Strict ownership boundary: Flutter owns UI, state, and the navigation engine; Swift owns CoreBluetooth and the KTM protocol; a backend owns the Google API key. Flutter never talks to CoreBluetooth or Google directly.
- One pending-action pipeline: Siri, the home-screen widget, Live Activities, and Quick Actions all funnel into the same coordinator, so every entry point resolves a destination identically.
- Protocol discipline: every BLE finding is labeled Confirmed / Observed / Hypothesized / Unknown rather than assumed, and verified on real hardware before being marked complete.
- Documented decision log: 50+ dated architecture decisions with reasoning and consequences, kept append-only so the “why” behind a design never gets lost as the app evolves.
- Offline-first by construction: once a route downloads, guidance, rerouting, and progress tracking need nothing from the network.
Outcome / Highlights
- Shipped and free: published on the App Store as DashNav — for KTM Gen3 TFT, with no purchase, subscription, or account required.
- Proven on real hardware: BLE pairing, the encrypted handshake, and live turn-by-turn rendering all confirmed on a KTM Adventure 250’s Gen3 TFT dashboard.
- Genuinely offline: a downloaded route navigates fully without a signal — background BLE and location keep the dashboard updating with the phone locked and pocketed.
- Reliability-first: automatic reconnect after a dropped connection, offline rerouting on deviation, and a documented turn-arrival hold tuned from real ride feedback.
Skills Demonstrated
- Reverse-engineering and reimplementing a proprietary hardware protocol from captured traffic and reference research, verified on physical hardware
- Building offline-first navigation engines with real-time rerouting and progress tracking, entirely on-device
- Integrating deep native iOS capabilities — BLE, widgets, Live Activities, Siri, Quick Actions — behind one consistent app-level abstraction
- Iterating a monetization model in production and retiring it cleanly without breaking what already shipped
- Designing and redesigning UX with a documented, decision-logged rationale rather than ad hoc changes
Work With Me
I specialize in Flutter apps with deep native integrations — Bluetooth hardware, background location, and polished, offline-first mobile experiences.
Let’s build your next Flutter appDescription
Eachut
July 2026