
Painel de inteligência OSINT em tempo real: 7 fontes de dados ao vivo (aeronaves, embarcações AIS, sismos, incêndios, clima, eventos GDELT, notícias) em um globo interativo. Mecanismo de correlação, alertas com pontuação, modo de observação. Renderização com Bun + React 19 + Canvas 2D + Web Worker. PWA com suporte offline. https://sigint-5154d935429b.herokuapp.com/
Painel OSINT em tempo real com rastreamento ao vivo de aeronaves, embarcações, atividade sísmica, incêndios, clima e eventos em um globo interativo. Construído com Bun, React 19 e um mecanismo de renderização personalizado em Canvas 2D + Web Worker. Instalável como PWA.

git clone https://github.com/iitoneloc/sigint.git
cd sigint
bun install
Crie um arquivo .env na raiz do projeto com, no mínimo:
SIGINT_SERVER_SECRET=<output of openssl rand -hex 32>
Opcionalmente, adicione chaves para dados de embarcações e incêndios:
AISSTREAM_API_KEY=<your aisstream.io key>
FIRMS_MAP_KEY=<your NASA FIRMS key>
Consulte Implantação para opções de desenvolvimento, produção e Heroku.
bun test # run all tests
bun test --watch # watch mode
bun run docker:test # run in Docker
bun run docker:dev:up # https://localhost (self-signed cert)
bun run docker:dev:down # stop
Duas variáveis de ambiente contornam as buscas de dados ao vivo em desenvolvimento para que você possa trabalhar com um estado congelado conhecido. Ambas são condicionadas a NODE_ENV !== "production" e ignoradas em builds de produção.
Os rótulos correspondem a /^[a-z0-9-]+$/ (OWASP A01 — allowlist rigorosa antes de qualquer consulta a arquivos) e resolvem para tests/fixtures/<source>/<label>.json. Rótulos inválidos geram erro na inicialização; arquivos ausentes geram erro com o caminho resolvido. Para usar:
CYCLONES_FIXTURE=multi-storm bun run dev
AIRCRAFT_FIXTURE=conus-snapshot bun run dev
Ou via Docker Compose (docker-compose.dev.yml repassa ambas):
CYCLONES_FIXTURE=single-cat5 bun run docker:dev:up
bun run docker:prod:up # http://localhost:5500
bun run docker:prod:down # stop
DOMAIN=sigint.example.com bun run docker:prod:tls:up
bun run docker:prod:tls:down # stop
git push heroku main
bun run docker:clean:all # remove containers, volumes, images
O SIGINT é instalável como um Progressive Web App. Após visitar o aplicativo implantado:
O service worker armazena em cache o shell do aplicativo para inicialização off-line. Os dados ao vivo são carregados do IndexedDB quando off-line. Uma barra indicadora de off-line aparece quando a conectividade é perdida, com um botão RETRY e puxar para atualizar em dispositivos com tela de toque. Quando há uma atualização disponível, um banner solicita que o usuário recarregue — sem trocas silenciosas de código no meio da sessão.
Documentação técnica completa em docs/ cobrindo arquitetura, fluxo de dados, sistema de recursos, sistema de painéis, renderização, cache, busca e restrições.
Licenciamento duplo:
| Variável | Obrigatória | Descrição |
|---|
SIGINT_SERVER_SECRET | Sim | Chave de assinatura do token de autenticação. openssl rand -hex 32 |
AISSTREAM_API_KEY | Não | Chave do aisstream.io para dados de embarcações em tempo real |
FIRMS_MAP_KEY | Não | Chave do NASA FIRMS para dados de incêndios |
DOMAIN | Não | Domínio para TLS do Let's Encrypt |
PORT | Não | Porta do servidor (padrão: 5500) |
| Camada | Fonte | Intervalo |
|---|
| Aeronaves | adsb.fi (varredura de tiles no servidor, 37 tiles × 250 nm) | 240s |
| Embarcações | aisstream.io (WebSocket no servidor) | 300s |
| Sismos | USGS (no cliente) | 420s |
| Incêndios | NASA FIRMS (no servidor) | 600s |
| Clima | NOAA (no cliente) | 300s |
| Eventos | GDELT 2.0 (no servidor) | 15m |
| Notícias | 6 feeds RSS (no servidor) | 10m |
| Variável de ambiente | Fonte substituída | Rótulos válidos |
|---|
CYCLONES_FIXTURE | /api/cyclones/latest (o servidor busca dados da NHC) | single-cat3, single-cat5, multi-storm, subtropical-example, tropical-depression, empty-out-of-season |
AIRCRAFT_FIXTURE | /api/aircraft/states (o servidor faz a varredura de tiles do adsb.fi) | (nenhum incluído — capture via bun run scripts/capture-fixture.ts aircraft <label>) |