
Anti-ALPR-Überwachungs-PWA. Das Kameraarchiv befindet sich auf dem Gerät.
they watching. we watching back.
Eine Android-first-Counter-Surveillance-PWA, die einem Fahrer sagt, wo die automatisierten Kennzeichenleser stehen, bevor er an ihnen vorbeifährt.
Sie bietet Echtzeit-Näherungswarnungen gegen ein offline-fähiges Kameraarchiv, lokale Expositionshistorie, eine geräteseitige Warteschlange signierter und hash-verketteter Kameraberichte sowie quellenbelegten Kontext aus öffentlichen Aufzeichnungen über die Behörden, die Kameras in deiner Umgebung betreiben.
Die bereitgestellte App hat keinen Endpunkt zum Hochladen von Berichten. Berichte bleiben derzeit in IndexedDB. Ein Übermittlungs-Gateway existiert als Betreibercode und ist keine bereitgestellte Route; diese Unterscheidung ist in dieser README durchgängig beabsichtigt.
Sie tut bewusst kein sechstes Ding: Sie fragt kein System eines Anbieters ab, und Kennzeichenwerte verlassen niemals das Gerät.
darkroute/
├── apps/
│ ├── pwa/ React 19 + TypeScript + Vite PWA
│ ├── desktop/ developer console at api.darkroute.ai; its functions/ proxy /v1 and /api/v1 to the apex
│ └── android/ buildable Android Trusted Web Activity shell
├── packages/
│ ├── core/ pure geometry and alert engine; no DOM or I/O
│ └── api-client/ empty placeholder; the live contract is GET /api/v1/openapi.json
├── functions/
│ ├── cameras/ same-origin camera tiles from the CAMERA_TILES R2 binding
│ └── api/
│ ├── v1/ the public API: reads, /submit (opens a PR), /photo, openapi.json, _middleware
│ └── admin/ Cloudflare Access tester allowlist (private dev host only)
├── scripts/ camera pipeline, deploy, asset and policy checks
├── docs/ implementation, operations and public documentation
├── the design-gap ledger unresolved design decisions and stand-ins
└── installer.sh
Der LoRa-Stack ist Meshtastics eigener, unverändert: Dieses Projekt baut keine Firmware und wird mit
einem Standard-Node gekoppelt. packages/api-client bleibt ein Platzhalter; die Produktions-PWA
verwendet ihn nicht.
Das bereitgestellte Produkt ist eine statische PWA plus Cloudflare Pages Functions: die
Kamera-Tile-Route, die öffentliche API unter /api/v1/ (siehe Öffentliche API)
und zwei Access-geschützte administrative Routen auf dem privaten Dev-Host. Es gibt keinen
FastAPI-Prozess, keine Postgres-Datenbank, keine Presence-API und keinen bereitgestellten
Berichts-Endpunkt; der einzige Schreibpfad, POST /api/v1/submit, öffnet einen öffentlichen Pull
Request, statt irgendwohin zu schreiben.
flowchart LR
OSM["OpenStreetMap"] --> PIPE["scheduled Node camera pipeline"]
PIPE --> R2[("R2 camera archive")]
R2 --> CAM["/cameras/* Pages Function"]
subgraph device["Browser or Android TWA"]
GPS["geolocation + other adapters"] --> CORE["packages/core alert engine"]
CORE --> UI["DRIVE / map / reports"]
UI <--> IDB[("IndexedDB + service-worker cache")]
end
CAM --> IDB
MAP["project tile host (PMTiles)"] --> UI
Kamera-Tiles werden von same-origin /cameras/* angefordert, aus dem CAMERA_TILES-R2-Binding
ausgeliefert und für die Offline-Nutzung zwischengespeichert. Basemap- und Speed-Archive sind
Cross-Origin-Range-Requests an den projektbetriebenen öffentlichen Tile-Host. darkroute.ai ist die
öffentliche App. Die administrativen Functions liegen vollständig außerhalb dieser Distribution.
Die Kurations-Tooling und das Übermittlungs-Gateway sind Betreibercode und werden aus dieser Distribution herausgehalten. Keines von beiden ist ein bereitgestellter Laufzeitserver, und nichts in diesem Repository hängt von einem von beiden ab: Die App baut, läuft, testet und auditiert ohne sie.
Geospatiale Berechnung liegt in packages/core; Screens konsumieren Stores und Adapter.
Kennzeichenabgleich, Fahrtenhistorie und die Beweiskette der Berichte bleiben auf dem Gerät.
Das Archiv ist für jeden ohne Schlüssel lesbar unter https://darkroute.ai/api/v1/, ebenfalls
bereitgestellt als https://api.darkroute.ai/v1/ und https://api.darkroute.ai/api/v1/ über den
Proxy der Developer Console. Der maschinenlesbare Vertrag ist GET /api/v1/openapi.json; die Prosa
steht in docs/public/API.md §1.3; die Konsole zum Ausprobieren ist
api.darkroute.ai.
| Route | Was sie beantwortet |
|---|---|
GET /api/v1/cameras | Kameras in einer bbox (≤ 1,5° pro Seite, ≤ 24 Tiles, ≤ 1000 Zeilen), optionaler owner-Filter |
GET /api/v1/stats | Archivgröße, Generation, Build- und Upstream-Zeitstempel |
GET /api/v1/abuse | dokumentierte Fälle und Generierungsdatum; optionaler County-fips |
GET /api/v1/news | automatisch gesammelte ALPR-Schlagzeilen, Quellenlinks und Sammelstatus |
GET /api/v1/atlas | EFF-Atlas-Behörden und -Anbieter nach County, mit Abruf-/Prüfdaten; optionaler fips |
GET /api/v1/monitoring | Inventare von Straßenüberwachungsgeräten; optional kind und bbox |
GET /api/v1/monitoring/image?id=... | ein verfügbares Herausgeberfoto für die ausgewählte Verkehrskamera |
GET /api/v1/place | eine US/PR-Ortssuche, proxied, damit der Geocoder niemals die Adresse eines Fahrers sieht |
GET /api/v1/route | eine Fahrroute, die bis zu 60 Punkte umfährt; niemals zwischengespeichert |
GET /api/v1/doc/{name} | ein veröffentlichtes Dokument aus dem öffentlichen Mirror, als Markdown |
POST /api/v1/submit | eine Korrektur, umgewandelt in einen [unreviewed]-Pull-Request, nichts wird ins Archiv geschrieben |
PUT /api/v1/photo | ein Foto, auf das sich eine Übermittlung bezieht, adressiert über seine Bytes; GET /api/v1/photo/{key} liefert es zurück |