
PWA anti-sorveglianza ALPR. L'archivio della fotocamera risiede sul dispositivo.
loro guardano. noi guardiamo indietro.
Una PWA di contro-sorveglianza pensata prima di tutto per Android che indica a un conducente dove si trovano i lettori automatici di targhe, prima che li superi alla guida.
Fornisce avvisi di prossimità in tempo reale basati su un archivio di telecamere utilizzabile offline, una cronologia locale delle esposizioni, una coda sul dispositivo di segnalazioni firmate e concatenate tramite hash, e un contesto di documenti pubblici con fonti citabili sulle agenzie che gestiscono le telecamere intorno a te.
L'app distribuita non ha un endpoint per il caricamento delle segnalazioni. Le segnalazioni oggi restano in IndexedDB. Esiste un gateway di invio come codice operatore e non è una rotta distribuita; questa distinzione è intenzionale in tutto questo README.
Deliberatamente non fa una sesta cosa: non interroga il sistema di alcun fornitore, e i valori delle targhe non lasciano mai il dispositivo.
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
Lo stack LoRa è quello di Meshtastic, non modificato: questo progetto non compila alcun firmware e si abbina a un nodo standard. packages/api-client resta un segnaposto; la PWA di produzione non lo utilizza.
Il prodotto distribuito è una PWA statica più Cloudflare Pages Functions: la rotta delle tile delle telecamere, l'API pubblica sotto /api/v1/ (vedi API pubblica), e due rotte amministrative protette da Access sull'host di sviluppo privato. Non ha alcun processo FastAPI, database Postgres, API di presenza o endpoint di segnalazione distribuito; l'unico percorso di scrittura, POST /api/v1/submit, apre una pull request pubblica invece di scrivere su qualsiasi cosa.
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
Le tile delle telecamere sono richieste dallo stesso origin /cameras/*, servite dal binding R2 CAMERA_TILES, e memorizzate nella cache per l'uso offline. Gli archivi della mappa di base e della velocità sono richieste cross-origin con range all'host pubblico di tile gestito dal progetto. darkroute.ai è l'app pubblica. Le Functions amministrative vivono interamente al di fuori di questa distribuzione.
Gli strumenti di curatela e il gateway di invio sono codice operatore, tenuto fuori da questa distribuzione. Nessuno dei due è un server di runtime distribuito, e nulla in questo repository dipende da essi: l'app si compila, si esegue, si testa e si verifica senza di essi.
Il calcolo geospaziale vive in packages/core; le schermate consumano store e adapter. La corrispondenza delle targhe, la cronologia dei viaggi e la catena di prove delle segnalazioni restano sul dispositivo.
L'archivio è leggibile da chiunque, senza chiave, su https://darkroute.ai/api/v1/, servito anche come https://api.darkroute.ai/v1/ e https://api.darkroute.ai/api/v1/ tramite il proxy della developer console. Il contratto leggibile dalla macchina è GET /api/v1/openapi.json; la prosa è in docs/public/API.md §1.3; la console per provarla è api.darkroute.ai.
| Rotta | A cosa risponde |
|---|---|
GET /api/v1/cameras | telecamere in un bbox (≤ 1.5° per lato, ≤ 24 tile, ≤ 1000 righe), filtro opzionale owner |
GET /api/v1/stats | dimensione dell'archivio, generazione, timestamp di build e upstream |
GET /api/v1/abuse | casi documentati e data di generazione; fips di contea opzionale |
GET /api/v1/news | titoli ALPR raccolti automaticamente, link alle fonti e stato della raccolta |
GET /api/v1/atlas | agenzie e fornitori dell'EFF Atlas per contea, con date di recupero/verifica; fips opzionale |
GET /api/v1/monitoring | inventari di apparecchiature di monitoraggio stradale; kind e bbox opzionali |
GET /api/v1/monitoring/image?id=... | una foto disponibile dell'editore per la telecamera del traffico selezionata |
GET /api/v1/place | una ricerca di località USA/PR, in proxy affinché il geocoder non veda mai l'indirizzo di un conducente |
GET /api/v1/route | un percorso di guida che evita fino a 60 punti; mai memorizzato in cache |
GET /api/v1/doc/{name} | un documento pubblicato dal mirror pubblico, in Markdown |
POST /api/v1/submit | una correzione, trasformata in una pull request [unreviewed], nulla viene scritto nell'archivio |
PUT /api/v1/photo | una fotografia a cui fa riferimento una segnalazione, indicizzata per i suoi byte; GET /api/v1/photo/{key} la restituisce |