Skip to content

About

The people's map: turn-by-turn navigation and live traffic owned by users, not a corporate cloud. Every device is a node.

Resources

Security policy

Stars

1 star

Watchers

0 watching

Forks

Latest commit

Β 

History

677 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Polaris Maps app icon

Polaris Maps

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.

iOS Android Expo SDK 57 TypeScript License: MIT

Features Β· How it works Β· Architecture Β· Getting started

Search and category results
Search that stays out of the way
Satellite map with place markers
Satellite, traffic, and transit layers
Offline region download screen
Maps that work without a signal

πŸ’‘ Why Polaris?

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.


✨ Features

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.

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.

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.

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.

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.


🌐 How the P2P Layer Works

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:

Hyperswarm β€” Real-Time Peer Discovery

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.

Hyperdrive β€” File Replication

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 β€” Conflict-Free Data Sync

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.

Identity Without Accounts

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.

Offline Resilience

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.


πŸ— Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  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        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Tech Stack

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

πŸš€ Getting Started

Prerequisites

  • Node.js β‰₯ 20
  • pnpm β‰₯ 9
  • Xcode 16 (iOS) or Android Studio (Android)
  • CocoaPods (iOS: sudo gem install cocoapods)

Install

git clone https://github.com/nicepolarismaps/polaris-maps.git
cd polaris-maps
pnpm install
# iOS only
cd ios && pod install && cd ..

Run

pnpm ios          # iOS Simulator
pnpm android      # Android Emulator
pnpm start        # Metro bundler only

Environment Variables

Create 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.json

Testing

pnpm test                 # Unit tests
pnpm test:integration     # Integration tests
pnpm test:benchmark       # Performance benchmarks
pnpm typecheck            # TypeScript
pnpm lint                 # ESLint
pnpm check                # All of the above

πŸ”’ Security

Full OWASP Top 10:2025 audit with 50 regression tests. See the Security Review for findings, fixes, and reproduction steps.


πŸ“„ License

MIT

About

The people's map: turn-by-turn navigation and live traffic owned by users, not a corporate cloud. Every device is a node.

Resources

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages