
PWA anti-vigilância de ALPR. O arquivo da câmera fica no dispositivo.
eles observando. nós observando de volta.
Uma PWA de contravigilância com foco em Android que informa ao motorista onde estão os leitores automáticos de placas de veículos, antes que ele passe por eles.
Ela fornece alertas de proximidade em tempo real contra um arquivo de câmeras com capacidade offline, histórico local de exposição, uma fila no dispositivo de relatórios de câmeras assinados e encadeados por hash, e contexto de registros públicos com fontes sobre as agências que operam câmeras ao seu redor.
O aplicativo implantado não possui endpoint de envio de relatórios. Os relatórios permanecem no IndexedDB hoje. Um gateway de submissão existe como código de operador e não é uma rota implantada; essa distinção é intencional ao longo de todo este README.
Ele deliberadamente não faz uma sexta coisa: não consulta o sistema de nenhum fornecedor, e os valores das placas de veículos nunca saem do 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
A pilha LoRa é a do próprio Meshtastic, sem modificações: este projeto não compila nenhum firmware
e pareia com um nó padrão. packages/api-client permanece um placeholder; a PWA de produção não o
utiliza.
O produto implantado é uma PWA estática mais Cloudflare Pages Functions: a rota de tiles de câmeras,
a API pública sob /api/v1/ (veja API pública), e duas rotas administrativas
protegidas por Access no host de desenvolvimento privado. Ele não possui processo FastAPI, banco de
dados Postgres, API de presença ou endpoint de relatórios implantado; o único caminho de escrita,
POST /api/v1/submit, abre um pull request público em vez de escrever em qualquer coisa.
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
Os tiles de câmeras são requisitados da mesma origem em /cameras/*, servidos a partir do binding
R2 CAMERA_TILES, e armazenados em cache para uso offline. Os arquivos de mapa base e de velocidade
são requisições de intervalo de origem cruzada para o host público de tiles operado pelo projeto.
darkroute.ai é o aplicativo público. As Functions administrativas ficam inteiramente fora desta
distribuição.
As ferramentas de curadoria e o gateway de submissão são código de operador, mantidos fora desta distribuição. Nenhum deles é um servidor de execução implantado, e nada neste repositório depende de qualquer um deles: o aplicativo compila, executa, testa e audita sem eles.
O cálculo geoespacial fica em packages/core; as telas consomem stores e adaptadores. A
correspondência de placas, o histórico de viagens e a cadeia de evidências dos relatórios permanecem
no dispositivo.
O arquivo é legível por qualquer pessoa, sem chave, em https://darkroute.ai/api/v1/, também
servido como https://api.darkroute.ai/v1/ e https://api.darkroute.ai/api/v1/ através do proxy do
developer console. O contrato legível por máquina é GET /api/v1/openapi.json; a documentação em
prosa é docs/public/API.md §1.3; o console para experimentá-la é
api.darkroute.ai.
| Rota | O que ela responde |
|---|---|
GET /api/v1/cameras | câmeras em uma bbox (≤ 1.5° por lado, ≤ 24 tiles, ≤ 1000 linhas), filtro opcional owner |
GET /api/v1/stats | tamanho do arquivo, geração, build e timestamps upstream |
GET /api/v1/abuse | casos documentados e data de geração; fips de condado opcional |
GET /api/v1/news | manchetes sobre ALPR coletadas automaticamente, links de fontes e status de coleta |
GET /api/v1/atlas | agências e fornecedores do EFF Atlas por condado, com datas de recuperação/verificação; fips opcional |
GET /api/v1/monitoring | inventários de equipamentos de monitoramento de vias; kind e bbox opcionais |
GET /api/v1/monitoring/image?id=... | uma foto disponível do publicador para a câmera de tráfego selecionada |
GET /api/v1/place | uma consulta de local nos EUA/PR, com proxy para que o geocodificador nunca veja o endereço do motorista |
GET /api/v1/route | uma rota de condução que evita até 60 pontos; nunca armazenada em cache |
GET /api/v1/doc/{name} | um documento publicado do espelho público, em Markdown |
POST /api/v1/submit | uma correção, transformada em um pull request [unreviewed], nada é escrito no arquivo |
PUT /api/v1/photo | uma fotografia à qual uma submissão se refere, indexada pelos seus bytes; GET /api/v1/photo/{key} a serve de volta |