
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.
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.
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:
El service worker almacena en caché el app shell para el arranque sin conexión. Los datos en vivo se cargan desde IndexedDB cuando no hay conexión. Cuando se pierde la conectividad, aparece una barra indicadora sin conexión con un botón REINTENTAR y deslizar para actualizar en dispositivos táctiles. Cuando hay una actualización disponible, un banner le pide al usuario que recargue — no hay intercambios de código silenciosos a mitad de sesión.
Documentación técnica completa en docs/ que cubre arquitectura, flujo de datos, sistema de funcionalidades, sistema de paneles, renderizado, almacenamiento en caché, búsqueda y limitaciones.
Licencia dual:
| 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 |
| 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>) |