Navigate beyond surveillance.
Ghostway is a free, open-source turn-by-turn navigation web app that — by default — routes you around known automated license plate reader (ALPR) cameras, including Flock Safety's. Your drive stays yours.
Live demo: https://deseretsaint.github.io/ghostway/ (best experienced on a phone — it's an installable PWA)
Mission: get people where they need to go without being logged by mass surveillance cameras.
| Route options — ETA + camera count before you pick | Turn-by-turn with live camera counter |
|---|---|
![]() |
![]() |
ALPRs (Flock Safety and others) photograph every passing vehicle and log its location, time, and identifying features, then share that data with thousands of agencies — usually without a warrant. Ghostway uses the open DeFlock camera map (130,000+ known cameras nationwide) to keep you off those roads by default.
- 100% open source — GPL-3.0-or-later
- No API keys, no account, free forever
- No telemetry, no tracking, no analytics — your routes never leave your device except as requests to the open servers listed below
- Camera-aware routing engine — Ghostway builds its own road graph from OpenStreetMap with camera exposure baked into every road segment, then runs A* on-device. No third-party routing service decides where you go.
- Three avoidance modes: Strict (bend over backwards for zero cameras), Moderate (avoid most, keep the detour sensible), Off (fastest). Per-mode ETA + camera count shown before you pick.
- Route options — Clearest / Balanced / Fastest with distance, ETA, and camera count on each, Magic Earth style.
- Live traffic — Utah: UDOT open incidents (closures, roadwork) slow affected road segments. Nationwide: a daily-refreshed harvest of every state's open WZDx work-zone feed adds work zones and avoids hard closures outside Utah. No key required anywhere.
- Turn-by-turn navigation — voice guidance (offline, Web Speech API), distance countdown, next-step preview, speed limits, live GPS speed.
- Follow mode — heading-up 3D driving camera, pan to look around, tap 🧭 to recenter. Off-route auto re-routes through the camera-aware engine.
- Camera-ahead warnings — voice + red banner flash ~250 m before a camera you'll pass, and a live 📷 counter of cameras passed on the trip.
- Over-speed alerts — GPS speed vs the posted limit.
- Waypoint drag — drag the orange handle on any route preview to reroute through a point of your choosing.
- Report-a-camera — spotted one we don't know about? Drop a pin. It protects routes immediately on your device, and you can publish it to OpenStreetMap (anonymous, no account) so the DeFlock map grows.
- Installable PWA — add to home screen; the app shell, map tiles, and camera data cache for offline use.
| Tier | Engine | Coverage | Notes |
|---|---|---|---|
| 1 | Ghostway's own graph | Wasatch Front (SLC → Santaquin), 550k road edges | On-device A*, camera + traffic costs, 9–300 ms per route |
| 2 | Valhalla (public demo) | Worldwide | Key-free, CORS-open; camera avoidance via exclude_locations |
| 3 | BRouter + OSRM | Worldwide | Legacy fallback of last resort (flaky public servers) |
Tier selection is automatic per corridor. Self-hosting Valhalla for higher
limits is documented in docs/valhalla-docker.md —
point CONFIG.valhallaUrl at it and nothing else changes.
- OpenStreetMap roads are filtered to drivable ways and compiled into a
compact binary graph (
engine/build-graph.mjs, ~7 MB gzipped for the Wasatch Front). - Every DeFlock camera is scored onto nearby road segments: ALPR brands (Flock, Motorola, Rekor, …) and traffic-facing cameras get full weight, other surveillance half weight.
- A* routes with a cost of
travel time + junction delay + camera exposure × mode weight. Strict mode weights exposure ~10× higher than Moderate. - Community-reported cameras are merged into the exposure at plan time, so they protect routes immediately.
| Need | Source | License |
|---|---|---|
| Base map | OpenStreetMap via OpenFreeMap | ODbL |
| Cameras | DeFlock (OSM + volunteers) | ODbL / CC-BY |
| Live traffic (state DOTs) | Each state's own open feed where available: UDOT events (UT), Idaho 511 WZDx, AZ511 WZDx, NV Roads WZDx, CDOT event reports (CO) — auto-activated for every state your route touches; registry in src/data/dot-feeds.js |
public |
| Work zones (national) | Every state's open WZDx feed (data.transportation.gov registry) | public |
| Search | Photon (OSM) | AGPL |
| World routing | Valhalla demo | MIT |
| Map engine | MapLibre GL JS | BSD-3 |
The camera snapshot, national work-zone snapshot, and graph data refresh
automatically via GitHub Actions (camera-refresh.yml,
wzdx-national-refresh.yml). No proprietary tile servers anywhere.
npm install
npm run dev # http://localhost:5173Build a static, self-hostable bundle:
npm run build # -> dist/
npm run previewServe dist/ from any HTTPS origin — that's all it needs (HTTPS is required
for geolocation and PWA install on mobile). The repo's
.github/workflows/deploy.yml publishes every push to main to GitHub
Pages automatically.
Optional data chores (both also run monthly in CI):
node scripts/fetch-cameras.mjs # refresh camera snapshots (app fallback + graph input)
node engine/build-graph.mjs # rebuild the road graph from the Utah OSM extractEverything swappable lives in src/config.js:
valhallaUrl— point at a self-hosted Valhalla for national routing without public-demo rate limitsosmNotesUrl— community-report publishing endpointdonate.*— your Ko-fi / GitHub Sponsors / Liberapay / wallet addresses (the donate prompt encourages but never blocks)
Ghostway ships an Android Auto-compatible Android app (android/), built
automatically on every push to src/, dist/, or android/ (workflow
android-apk.yml → the android-latest release, refreshed automatically),
plus a nightly 04:00 UTC build as a safety net. Install it without the
Play Store: sideload the APK, enable developer mode in the Android Auto
app (tap the version number ~10×), and turn on "Unknown sources" — full
steps in docs/android-auto-setup.md. v1 shows
Ghostway on the head unit with the full phone app (routing, Strict camera
avoidance, voice) running in the phone WebView; native turn-by-turn
templates are next.
CarPlay (iPhone) requires Apple's com.apple.developer.carplay-maps
entitlement — no sideload path exists; plan in docs/android-auto-carplay.md.
Ghostway stores nothing about you. Camera reports live in your browser's localStorage until you choose to publish them — and publishing is an anonymous OpenStreetMap note, no account. Searches and routes go only to the public open-source servers above. There is no analytics and never will be.
20 automated suites (scripts/*.mjs) cover routing, avoidance, the full UI
with real mouse hit-testing, simulated GPS drive-throughs, traffic, ETA
accuracy, and the report flow. Run any of them after npm run build;
smoke.mjs and interact-check.mjs are the fast core pair.
GPL-3.0-or-later. Built to stay free.

