15 KiB
NAV-INTEGRATION-v4.md — Echo6 Navi Module
Status: Active
Created: 2026-04-17
Updated: 2026-04-19
Author: Matt + Claude
Repo: forge.echo6.co/matt/refactored-recon
System Context
- RECON — Backend of everything. Acquires, processes, enriches, embeds, files. Manages all data including Navi datasets.
- Aurora — Eyes, ears, and mouth. Speaks to humans via Open WebUI or mesh. Queries tools, synthesizes answers.
- Navi — Navigation module. Routing, geocoding, tiles, mesh bridge, weather, trail/land overlays.
- Kiwix — Offline internet. ZIM files via kiwix-serve. Aurora integration via tool-callable search.
- Library — files.echo6.co. PDFs across 21 domains.
Infrastructure
- VM 130 — 192.168.1.130 on data node (192.168.1.240)
- OS: Ubuntu 24.04 LTS (migrated from LXC to VM for Docker support)
- RAM: 16 GB
- vCPU: 4
- Boot disk: 80-100 GB
- Docker: Yes
- User: zvx
- Mounts:
- /mnt/library/ — ~67 GB library (virtiofs from data host /mnt/data/library/)
- /mnt/nav/ — ~200 GB nav data (virtiofs from data host /mnt/data/nav/)
- /mnt/kiwix/ — Kiwix ZIM storage (virtiofs from data host /mnt/data/kiwix/)
- /mnt/nas/ — pi-nas NFS share (192.168.1.245)
Completed Work
Phase H1a: Valhalla Routing Engine ✅
- Docker:
ghcr.io/valhalla/valhalla-scripted:latestv3.6.3 - Port: 8002
- Data: Idaho PBF, 540 tiles built
- Validated: Buhl → Boise (127.1 mi, 144 min, auto + pedestrian costing)
- Branch: feature/navi on forge.echo6.co/matt/recon
Phase H1b: Photon Geocoding ✅
- Service: systemd unit, Java jar, Xmx10g
- Port: 2322
- Data: Full planet import, 281.4M documents, 85 GB index
- Validated: Forward + reverse geocoding, worldwide coverage
Phase H2: Aurora Nav Tools ✅
- Files:
- /opt/recon/lib/nav_tools.py — route(), reverse_geocode()
- /opt/recon/lib/aurora_nav_tool.py — Open WebUI tool wrapper
- Registered: Navigation tool visible in Open WebUI
- Tested: 5/5 tests passing
Phase H2b: Semantic Query Router ✅
- Files:
- /opt/recon/lib/query_router.py — standalone router (38 example queries, 4 routes)
- recon_rag_tool.py v4.2.0 on cortex — router gate integrated into inlet()
- Routes:
- nav_route (0.735 confidence) → Valhalla directions, skip RAG
- nav_reverse_geocode (0.871) → Photon reverse, skip RAG
- direct_answer (0.877) → pass through, skip RAG
- rag_search (0.751) → full RAG pipeline
- Safety: TEI down → falls to RAG. Nav fails → falls to RAG.
- Expandable: Adding new routes = embed 10-20 examples, compute centroid, add to dict. No retraining.
Pi-nas Country Index ✅
- File: /export/data/nav/photon-country-index.txt (also as .md)
- Coverage: 282.5M lines indexed by country code
- US records: 52.8M starting at line 122,520,379
- Use: Enables regional Photon builds for Pi deployment
Active Services on VM 130
| Service | Type | Port | Status |
|---|---|---|---|
| recon.service | systemd (native) | 8420 (dashboard), 8888 (files) | Running |
| Valhalla | Docker | 8002 | Running (540 tiles, Idaho) |
| Photon | systemd (Java) | 2322 | Running (281M docs, 85 GB) |
Git Repos
| Repo | What | Language | Branch |
|---|---|---|---|
matt/recon |
Backend, pipeline, nav_tools, mesh_bridge, router | Python | feature/navi |
matt/refactored-recon |
Design docs, bibles, plans | Markdown | main |
matt/navi |
Web map frontend (TO CREATE) | JS/HTML/CSS | — |
matt/navi-mobile |
Ferrostar Android app (FUTURE) | Kotlin | — |
Priority Tiers (Revised)
HIGH — Core Proposition (DONE)
- ✅ Aurora gives turn-by-turn directions
- ✅ Semantic router for intelligent tool selection
- Meshtastic waypoint delivery (BLOCKED — needs hardware decisions)
MEDIUM — Enhanced Capabilities (IN PROGRESS)
- Address book in RECON — pre-Photon geocoding for saved locations
- Netsyms Address DB — 160M USPS-validated addresses, SQLite
- Web frontend — navi.echo6.co (NEW REPO: matt/navi)
- Ferrostar mobile app — Android turn-by-turn pointed at Valhalla
- TomTom traffic integration — routing-level, not just overlay
- Self-hosted weather (Open-Meteo)
- Selectable offline region downloads for designated AO
- Trail and land ownership overlays (USFS/BLM/PAD-US)
LOW — Future Enrichment
- Wilderness data layers (foraging, water, fauna)
Next Phases (Ordered)
Phase M-AB: Address Book + Netsyms Download
Goal: Saved locations resolve instantly without geocoding. Netsyms provides USPS-validated address precision.
Address Book:
- YAML or SQLite in /opt/recon/data/ or /opt/recon/config/
- Checked BEFORE Photon in nav_tools geocoding chain
- Feeds: Aurora web ("how do I get home"), mesh bridge ("nav home"), Navi frontend (starred locations)
- Structure: key, name, lat, lon, address, aliases[]
- Future expansion: contacts, callsigns, frequencies (RECON-managed rolodex)
Netsyms:
- Download: https://dl.netsyms.net/gis/addresses/2025/AddressDatabase2025.zip (11 GB compressed, 35 GB uncompressed)
- SHA256: 3deb85a37c6a4d027dd35fcbc1084e577b06a95be471042acc17fe21dedc3d8e
- Format: SQLite, 160M addresses (US + Canada), USPS ZIP+4 validated
- Schema: zipcode, number, street, street2, city, state, plus4, country, latitude, longitude, source
- Source data: National Address Database + OpenAddresses.io + USPS ZIP+4
- License: Public domain (facts cannot be copyrighted under US law)
- Comparison: Photon (OSM crowd-sourced) vs Netsyms (government records). Test side-by-side.
- Pi deployment: "lite" version at 6.7 GB compressed, no lat/lon, optimized for autocomplete
Photon vs Netsyms vs Address Book — geocoding chain:
- Address book → exact match on saved locations (instant, zero network)
- Netsyms SQLite → street address precision (local query, no service)
- Photon → place names, POIs, worldwide ("Boise Airport", "Sawtooth NF")
Phase M-WEB: Web Frontend (navi.echo6.co)
Goal: Google Maps-style web experience with self-hosted tiles, routing, search.
Repo: forge.echo6.co/matt/navi (new) Deploy: nginx on VM 130, port 8440, navi.echo6.co
Stack:
- MapLibre GL JS — map rendering
- PMTiles — vector tiles served by nginx with Range Requests
- Valhalla API at :8002 — routing with polyline + maneuvers
- Photon API at :2322 — search/geocode
- Netsyms SQLite — address autocomplete (via small API or direct query)
- TomTom traffic overlay — raster tiles via API key (visual only for now)
- Address book locations — starred markers on map
MVP Features:
- Search bar (Photon forward geocode)
- Click-to-route (two points → Valhalla → draw polyline + maneuver list)
- Mode selector (auto, pedestrian, bicycle)
- GPS dot (browser Geolocation API)
- TomTom traffic tile overlay
- Responsive mobile layout
Future Features:
- Layer switcher (street / topo / satellite)
- Saved locations from address book
- Turn-by-turn panel with voice (Web Speech API)
- Offline PWA with Service Worker caching
- USFS trail / BLM land / PAD-US overlays
- Contour/hillshade overlay
Tile Data (needs building):
- Basemap PMTiles from Planetiler or
pmtiles extractfrom Protomaps daily builds - Start with Idaho regional extract, expand to CONUS
- Contours from SRTM via phyghtmap (future)
Phase M-APP: Ferrostar Mobile App
Goal: Native Android turn-by-turn navigation app pointed at your Valhalla.
Repo: forge.echo6.co/matt/navi-mobile (future)
Stack:
- Ferrostar SDK (BSD license, Rust core, Kotlin/Jetpack Compose UI)
- Built-in Valhalla route provider:
WellKnownRouteProvider.Valhalla("http://192.168.1.130:8002/route/v1", "auto") - MapLibre Native for map rendering
- GPS snapping, off-route detection, automatic rerouting
- Voice guidance via SpokenInstructionObserver
- Your PMTiles for offline map tiles
Effort: Fork the Ferrostar demo app, swap three URLs (Valhalla, tile source, search). Half-day to functional, a few days to polish.
Phase M-TRAFFIC: TomTom → Valhalla Traffic Integration
Goal: Valhalla routes based on real-time traffic, not just static road speeds.
Architecture:
- Cron job (every 5 min while internet available) → poll TomTom Traffic Flow Segments API for AO
- Mapping service → translate TomTom segment IDs to Valhalla edge IDs (built once via
valhalla_ways_to_edges, stored as lookup table) - Traffic tile writer → pack speeds into Valhalla's binary traffic tile format → update traffic.tar
- Valhalla hot-reloads traffic data without restart
TomTom free tier: 2,500 requests/day — sufficient for single AO polled every 5 min during waking hours.
Key insight: Traffic-aware routing is a peacetime feature. Grid-down = no TomTom feed = Valhalla routes without traffic = fine (traffic patterns irrelevant without grid).
Effort: 2-3 CC sessions. Requires understanding Valhalla's internal edge ID system and binary traffic tile format.
Reference: Christian Beiwinkel's "Ultimate Guide to Traffic in Valhalla" and his "Valhalla Orbis Tools" for TomTom integration.
Phase H3: Meshtastic Mesh Bridge + Waypoints + Position Logging
BLOCKED on hardware decisions:
- Which physical Meshtastic node is the gateway?
- Gateway IP on LAN?
- Private nav channel PSK
Architecture (Option B — Aurora-mediated):
Mesh DM → mesh_bridge receives text
→ Injects sender GPS + context
→ Sends to Aurora (via Ollama API or Open WebUI API)
→ Semantic router classifies intent
→ Aurora calls appropriate tool (nav, RAG, weather, etc.)
→ Response formatted + compressed
→ Waypoints + text sent back over mesh DM
Fast-path bypass for n, next, cancel, sitrep — skip Aurora.
Position logging:
- Subscribe to POSITION_APP packets
- SQLite table: node_id, lat, lon, altitude, speed, heading, timestamp
- Enables: "get me home" (earliest position), breadcrumb trails, team tracking
Waypoint delivery:
- Sliding window (3 at a time, 6s pacing on MEDIUM_FAST)
- Compressed names ≤30 chars ("L Main St 0.3")
- Emoji icons per maneuver type
- 24h TTL expiry
- Private channel to avoid polluting public LongFast
Gateway config:
- Role: CLIENT or ROUTER_CLIENT
- TCP: Enabled :4403
- Channel 0: Public LongFast
- Channel 1: Private nav, PSK-protected, MEDIUM_FAST
- GPS: Enabled
Data Sources Available
Geocoding
| Source | Records | Size | Coverage | Best For |
|---|---|---|---|---|
| Photon (running) | 281M | 85 GB | Planet | Place names, POIs, worldwide |
| Netsyms (to download) | 160M | 35 GB | US + Canada | Street addresses, USPS precision |
| OpenAddresses.io | 600M+ | Varies | Worldwide | Future international expansion |
| Address book (to build) | User-defined | <1 MB | Personal | Saved locations, zero latency |
Trail and Land Data (Phase M future)
| Dataset | Source | License | Size as PMTiles |
|---|---|---|---|
| USFS NFS Trails | data.fs.usda.gov | Public domain | ~150-300 MB |
| USFS MVUM Roads | data.fs.usda.gov | Public domain | ~250-450 MB |
| USFS MVUM Trails | data.fs.usda.gov | Public domain | ~50-100 MB |
| PAD-US 4.1 | usgs.gov | Public domain | ~400-800 MB |
| BLM SMA | gbp-blm-egis.hub.arcgis.com | Public domain | ~80-150 MB |
| IDFG Hunt Units | idfg.idaho.gov | Free | ~10 MB |
| IDL State Trust | idl.idaho.gov | Free | ~20 MB |
| IDPR OHV/Snow Trails | idpr-data-idaho.hub.arcgis.com | Free | ~10 MB |
Conversion pipeline: shapefile → ogr2ogr (EPSG:4326) → tippecanoe → PMTiles → nginx Keep as display-only overlays. Do NOT merge into OSM PBF for routing.
Pi 5 Deployment Target
Everything built on the homelab should have a "Pi profile" — regional extracts, configurable scope, no 16+ GB RAM dependency.
| Component | Homelab | Pi 5 (8 GB) |
|---|---|---|
| Valhalla | CONUS (60 GB, Docker) | Regional (2-5 GB, native or Docker) |
| Geocoding | Photon planet (85 GB, JVM 10g) | Netsyms SQLite (35 GB, zero overhead) |
| Place names | Photon | Lightweight OSM place extract (~500 MB) |
| Tiles | CONUS PMTiles (15-20 GB) | Regional PMTiles (2-5 GB) |
| LLM | Qwen3 8B on cortex GPU | 1-3B model on CPU (slow but functional) |
| Embeddings | bge-m3 on cortex GPU | Dense-only, 256-dim, int8 |
| Meshtastic | TCP to gateway | USB serial to node |
| Weather | Open-Meteo (50-100 GB) | Subset or skip |
| Storage | 1 TB SSD shared | 1-2 TB NVMe |
Semantic Router — Current Routes
| Route | Confidence | Action | Expandable |
|---|---|---|---|
| nav_route | 0.735 | Valhalla directions, skip RAG | ✅ |
| nav_reverse_geocode | 0.871 | Photon reverse, skip RAG | ✅ |
| direct_answer | 0.877 | Pass through, skip RAG | ✅ |
| rag_search | 0.751 | Full RAG pipeline | ✅ |
| kiwix_search | — | PLANNED: kiwix-serve search | Add 10-20 examples |
| weather | — | PLANNED: Open-Meteo query | Add 10-20 examples |
| mesh_sitrep | — | PLANNED: node positions summary | Add 10-20 examples |
Storage Budget (Shared 938 GB SSD)
| Mount | Current | Planned Additions | Total |
|---|---|---|---|
| /mnt/library/ | 67 GB | — | 67 GB |
| /mnt/kiwix/ | ~40 GB | +110 GB (Wikipedia + others) | ~150 GB |
| /mnt/nav/ | ~111 GB (Valhalla 2 GB + Photon 85 GB + sources + PBF) | +35 GB Netsyms, +20 GB PMTiles, +60 GB CONUS Valhalla | ~226 GB |
| Other host data | ~400 GB | — | ~400 GB |
| Total | ~843 GB | ||
| Free | ~95 GB |
Action needed: Trim Photon to US-only to reclaim ~70 GB, bringing free to ~165 GB. Or accept planet coverage and manage tightly.
Risk Register
| Risk | Impact | Mitigation |
|---|---|---|
| Valhalla CONUS tile build OOMs | Expansion blocked | Build on cortex, rsync to data node |
| Photon 85 GB crowds out Kiwix ZIMs | Storage pressure | Trim to US-only (~15 GB), reclaim ~70 GB |
| TomTom free tier rate limit | Traffic routing degraded | Single AO polling only, cache aggressively |
| Meshtastic gateway TCP flaky | H3 degraded | Reconnect loop with backoff |
| Ferrostar SDK breaking changes (pre-1.0) | App maintenance | Pin SDK version, update deliberately |
| Netsyms lacks place names/POIs | "Boise Airport" fails | Keep Photon as fallback for non-address queries |
| Address book file not synced to cortex | OWUI can't use saved locations | Inline in Valve JSON or add HTTP endpoint |
Estimated Effort (Remaining)
| Phase | CC Sessions | Blocked By |
|---|---|---|
| M-AB: Address book + Netsyms | 1 | Nothing |
| M-WEB: Web frontend MVP | 2-3 | PMTiles built |
| M-APP: Ferrostar mobile | 1-2 | PMTiles built |
| M-TRAFFIC: TomTom → Valhalla | 2-3 | M-WEB validated |
| H3: Mesh bridge | 2-3 | Meshtastic hardware |
| Trail/land overlays | 1-2 | tippecanoe installed |
| Weather (Open-Meteo) | 1 | Nothing |
| Photon trim to US-only | 0.5 | Nothing |
| Expand Valhalla to CONUS | 0.5 | Cortex RAM for build |