Maps owned by the people who use them.
Turn-by-turn navigation, live traffic, place search, transit, and offline maps β shared directly between devices instead of a corporate cloud.
Features Β· How it works Β· Architecture Β· Getting started
![]() Search that stays out of the way |
![]() Satellite, traffic, and transit layers |
![]() Maps that work without a signal |
Google Maps and Apple Maps are remarkable products β but they work by funneling the world's location data through a single company's servers. Polaris Maps inverts that model. Your device doesn't just consume map data; it contributes it. Traffic speeds, place information, map tiles, street imagery β all shared directly between devices over an encrypted peer-to-peer mesh.
The result is a mapping app that gets better the more people use it, where no company owns the data, and where the whole thing keeps working even when the internet doesn't.
Every feature heading links to the technical README for that service β architecture diagrams, file maps, data flows, and design notes.
Turn-by-turn directions via Valhalla with GPS snap-to-route, off-route detection, automatic rerouting, and park-and-ride suggestions that combine driving + transit. Route ETAs adjust in real time based on live traffic from both commercial feeds and peer-reported congestion.
Color-coded congestion overlays fused from TomTom traffic flow, open feeds, and crowd-sourced speed probes broadcast by nearby peers. Once onboarding is complete and traffic telemetry is on, your phone contributes anonymous speed data on geohash topic channels. Reports are Schnorr-signed, shared over the peer mesh (with a Nostr relay fallback), verified and de-duplicated by receivers, and surfaced as map markers plus a non-blocking warning ahead when you're navigating. When significant congestion builds up ahead on your route, Polaris suggests a faster route instead of rerouting silently.
π Places & POI β
A 3-phase search that returns results in milliseconds: local Overture Maps SQLite first, then parallel Overpass + Overture network queries, then Nominatim fallback. Apple MapKit enriches selected POIs with phone, hours, and photos on iOS. Zoom-adaptive spatial filtering keeps the map readable at every zoom level.
Natural-language queries ("coffee shops open now near me") are parsed for brand, cuisine, and modifier hints, then run in parallel across local FTS5 indexes, Photon geocoding, Overpass, and address search. Results stream in by stage, are deduplicated, and are scored 0β100 by distance, name similarity, category match, and popularity.
π Public Transit β
Multi-modal trip planning via OpenTripPlanner with route line rendering, stop departures, and dedicated integrations for Amtrak and MBTA. An endpoint registry maps geographic regions to the correct OTP deployment automatically.
π₯ Offline Regions β
Download region packs (vector tiles, Overture places, routing graphs, geocoding indexes) and use them without connectivity. Downloaded regions are automatically seeded back to the P2P network so nearby peers can grab them from you instead of a CDN. Canonical pack keys come from signed manifests, with peer-discovered manifests verified before merge.
Capture geotagged street photos with automatic interval shooting, privacy blur, and Schnorr-signed metadata. Images are appended to your Hypercore feed and discoverable by other peers through Gun.js spatial queries. An online street-view layer also merges Google Street View, Panoramax, and Mapillary panoramas.
Curate place lists with full CRUD, import from Google Maps Takeout (CSV, JSON, GeoJSON, KML, GPX), sync across iOS devices via iCloud, and set Home/Work favorites. Shared lists replicate over Gun.js with per-list keys and revoke-by-rotation.
βοΈ OSM Editing β
Edit OpenStreetMap directly β OAuth 2.0 + PKCE login, fetch live node state, edit tags (name, hours, wheelchair access, Wi-Fi, cuisine, etc.), and submit changesets via OSM API v0.6.
π CarPlay β
Navigation state, maneuvers, lane guidance, traffic, incidents, and search forwarded to CarPlay templates in real time β including the Dashboard and instrument-cluster scenes, a phone-style route preview, and an add-stop search flow.
Polaris treats every running instance as a node in a decentralized physical infrastructure network (DePIN). There are three interlocking P2P systems, each chosen for what it does best:
Your phone Nearby phones
β β
ββ SHA-256(geohash4) βββΊ topic βββ SHA-256(geohash4) ββ€
β "u4pr" "u4pr" β
β β
βββββ encrypted connection ββββββββββββββββββββββββββββ
(traffic probes, POI updates)
Hyperswarm runs inside a Bare worklet via react-native-bare-kit, giving us a full DHT-based peer discovery layer on a phone. Devices join geohash4 topic channels (~39 km cells) β if you're in the same metro area, you'll find each other.
Once connected, peers exchange traffic probes (anonymous GPS-derived speed packets), POI edits, and attestations over encrypted streams. Communication is bidirectional and direct β no relay server in the loop.
When Hyperswarm peer count drops below 3, Polaris seamlessly falls back to Nostr relays (event kind 20100) to maintain data flow with full Schnorr signature verification. The network degrades gracefully rather than failing.
When you download a region pack (tiles, routing graphs, place data), your device starts seeding it via Hyperdrive β the same way a BitTorrent client seeds after downloading. Other nearby peers can then download the region directly from you rather than hitting a CDN.
This creates an organic content delivery network where popular regions (say, the SF Bay Area) are served by dozens of local devices, while the CDN only handles cold starts for rarely-requested areas.
A Node.js sidecar process (nodejs-assets/) manages Hyperdrive feeds, tar extraction, and bridge IPC with the React Native layer.
Gun.js handles all structured data that needs eventual consistency across the network: POI edits, reviews, ratings, attestations, and reputation scores. Its CRDT (Conflict-free Replicated Data Type) model means two users can edit the same cafΓ©'s hours simultaneously without conflicts β both edits merge deterministically.
Gun runs with an MMKV storage adapter for fast local persistence and discovers relay peers automatically for data propagation beyond the local swarm.
There are no usernames, passwords, or account servers. On first launch, Polaris generates a secp256k1 keypair using a cryptographic random number generator and stores it in the OS secure enclave (iOS Keychain / Android Keystore). Your public key is your identity.
Every action you take β editing a POI, submitting a review, broadcasting a traffic probe β is Schnorr-signed with your private key. Other peers can verify authorship without trusting any central authority. Reputation scores are computed from your contribution history (edits, confirmations, traffic probe accuracy) and stored in Gun.js with signature verification.
Proof-of-presence attestation lets you cryptographically prove you were within 100 meters of a POI β confirming a business exists at its claimed location without revealing your exact position.
All outbound actions (probes, edits, reviews) are queued in MMKV (capped at 500 entries) when offline and replayed automatically when connectivity returns. Combined with offline region packs and local FTS5 search, Polaris is fully functional without an internet connection β and catches back up when you're online.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Expo Router (app/) React Native UI β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββ β
β β (tabs) β β poi/ β β regions/ β βimagery/β β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Components src/components/ β
β map Β· navigation Β· search Β· poi Β· regions β
β imagery Β· dashboard Β· places Β· common β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β State Zustand stores β
β map Β· traffic Β· osmPoi Β· navigation β
β transit Β· poi Β· placeList Β· peer β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Services src/services/ β
β traffic Β· routing Β· geocoding Β· poi Β· search β
β transit Β· imagery Β· regions Β· sync Β· identity β
β osm Β· carplay Β· places Β· favorites Β· icloud β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β P2P Bridge β
β nodejs-assets/ β Hyperdrive (file replication) β
β backend/ β Hyperswarm (Bare worklet, DHT) β
β Gun.js β CRDT sync (edits, reviews, rep) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β External APIs (fallback / enrichment) β
β P2P peers Β· open feeds Β· TomTom (cold-start) β
β Valhalla Β· Overpass Β· Nominatim Β· Photon Β· Nostr β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
| Layer | Technology |
|---|---|
| Framework | React Native 0.86.0 + Expo SDK 57 (bare workflow) |
| Language | TypeScript ~6.0.3 (strict) |
| Navigation | Expo Router (SDK 57) + React Navigation 7 |
| Maps | MapLibre React Native 10 + OpenFreeMap tiles |
| Imagery | USGS NAIP Β· Sentinel-2 cloudless (EOX) Β· regional orthophotos |
| State | Zustand 5 |
| Storage | expo-sqlite (FTS5) Β· react-native-mmkv Β· expo-secure-store |
| Identity | @noble/curves secp256k1 Β· @noble/hashes SHA-256 |
| P2P | Hyperswarm Β· Hyperdrive Β· Hypercore Β· Gun.js |
| Traffic | P2P probes Β· free open feeds Β· TomTom (optional cold-start) |
| Routing | Valhalla (online + offline graph tiles) |
| Geocoding | FTS5 local Β· Photon Β· Nominatim |
| Transit | OpenTripPlanner Β· MBTA V3 Β· Amtrak BTS |
| Testing | Jest 29 Β· @testing-library/react-native 13 |
- Node.js β₯ 20
- pnpm β₯ 9
- Xcode 16 (iOS) or Android Studio (Android)
- CocoaPods (iOS:
sudo gem install cocoapods)
git clone https://github.com/nicepolarismaps/polaris-maps.git
cd polaris-maps
pnpm install
# iOS only
cd ios && pod install && cd ..pnpm ios # iOS Simulator
pnpm android # Android Emulator
pnpm start # Metro bundler onlyCreate a .env file in the project root (never commit):
# Optional β TomTom is a bounded cold-start traffic bridge only.
EXPO_PUBLIC_TOMTOM_API_KEY=
# Optional β free open traffic feeds (comma-separated URLs).
# EXPO_PUBLIC_OPEN_TRAFFIC_FEEDS=https://example.gov/traffic.jsonpnpm test # Unit tests
pnpm test:integration # Integration tests
pnpm test:benchmark # Performance benchmarks
pnpm typecheck # TypeScript
pnpm lint # ESLint
pnpm check # All of the aboveFull OWASP Top 10:2025 audit with 50 regression tests. See the Security Review for findings, fixes, and reproduction steps.


