
Panel de inteligencia OSINT en tiempo real: 7 fuentes de datos en vivo (aeronaves, embarcaciones AIS, sismos, incendios, clima, eventos GDELT, noticias) en un globo interactivo. Motor de correlación, alertas puntuadas, modo de vigilancia. Renderizado con Bun + React 19 + Canvas 2D Web Worker. PWA con soporte sin conexión. https://sigint-5154d935429b.herokuapp.com/
Panel de OSINT en tiempo real con seguimiento en vivo de aeronaves, embarcaciones, actividad sísmica, incendios, clima y eventos en un globo interactivo. Construido con Bun, React 19 y un motor de renderizado personalizado en Canvas 2D + Web Worker. Instalable como PWA.

git clone https://github.com/iitoneloc/sigint.git
cd sigint
bun install
Crea un archivo .env en la raíz del proyecto que contenga como mínimo:
SIGINT_SERVER_SECRET=<output of openssl rand -hex 32>
Opcionalmente, añade claves para los datos de embarcaciones e incendios:
AISSTREAM_API_KEY=<your aisstream.io key>
FIRMS_MAP_KEY=<your NASA FIRMS key>
Consulta Despliegue para las opciones de desarrollo, producción y Heroku.
| Variable | Requerida | Descripción |
|---|---|---|
SIGINT_SERVER_SECRET | Sí | Clave de firma de tokens de autenticación. openssl rand -hex 32 |
AISSTREAM_API_KEY | No | Clave de aisstream.io para datos de embarcaciones en vivo |
FIRMS_MAP_KEY | No | Clave de NASA FIRMS para datos de incendios |
DOMAIN | No | Dominio para TLS de Let's Encrypt |
PORT | No | Puerto del servidor (predeterminado: 5500) |
| Capa | Fuente | Intervalo |
|---|---|---|
| Aeronaves | adsb.fi (barrido de teselas del lado del servidor, 37 teselas × 250 nm) | 240s |
| Embarcaciones | aisstream.io (WebSocket del servidor) | 300s |
| Sismos | USGS (del lado del cliente) | 420s |
| Incendios | NASA FIRMS (del lado del servidor) | 600s |
| Clima | NOAA (del lado del cliente) | 300s |
| Eventos | GDELT 2.0 (del lado del servidor) | 15m |
| Noticias | 6 fuentes RSS (del lado del servidor) | 10m |
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
Dos variables de entorno evitan las descargas de datos en vivo en desarrollo para que puedas trabajar con un estado congelado conocido. Ambas están condicionadas a NODE_ENV !== "production" y se ignoran en las compilaciones de producción.
| Variable de entorno | Fuente anulada | Etiquetas válidas |
|---|---|---|
CYCLONES_FIXTURE | /api/cyclones/latest (el servidor consulta NHC) | single-cat3, single-cat5, multi-storm, subtropical-example, tropical-depression, empty-out-of-season |
AIRCRAFT_FIXTURE | /api/aircraft/states (el servidor consulta el barrido de teselas de adsb.fi) | (ninguna incluida — captúrala mediante bun run scripts/capture-fixture.ts aircraft <label>) |
Las etiquetas deben coincidir con /^[a-z0-9-]+$/ (OWASP A01 — lista de permisos estricta antes de cualquier búsqueda de archivos) y se resuelven en tests/fixtures/<source>/<label>.json. Las etiquetas no válidas generan un error al iniciar; los archivos faltantes generan un error con la ruta resuelta. Para usarlas:
CYCLONES_FIXTURE=multi-storm bun run dev
AIRCRAFT_FIXTURE=conus-snapshot bun run dev
O mediante Docker Compose (docker-compose.dev.yml las transmite 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
SIGINT es instalable como una aplicación web progresiva (PWA). Tras visitar la aplicación desplegada: