
Dashboard di intelligence OSINT in tempo reale: 7 fonti di dati live (aeromobili, imbarcazioni AIS, eventi sismici, incendi, meteo, eventi GDELT, notizie) su un globo interattivo. Motore di correlazione, avvisi con punteggio, modalità sorveglianza. Rendering con Bun + React 19 + Canvas 2D Web Worker. PWA con supporto offline. https://sigint-5154d935429b.herokuapp.com/
Dashboard OSINT in tempo reale con tracciamento live di aeromobili, imbarcazioni, attività sismica, incendi, meteo ed eventi su un globo interattivo. Realizzato con Bun, React 19 e un motore di rendering personalizzato Canvas 2D + Web Worker. Installabile come PWA.

git clone https://github.com/iitoneloc/sigint.git
cd sigint
bun install
Crea un file .env nella root del progetto contenente come minimo:
SIGINT_SERVER_SECRET=<output of openssl rand -hex 32>
Aggiungi opzionalmente le chiavi per i dati di imbarcazioni e incendi:
AISSTREAM_API_KEY=<your aisstream.io key>
FIRMS_MAP_KEY=<your NASA FIRMS key>
Consulta Distribuzione per le opzioni di sviluppo, produzione ed 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
Due variabili d'ambiente bypassano i fetch dei dati live in sviluppo, così puoi lavorare su uno stato congelato noto. Entrambe sono condizionate a NODE_ENV !== "production" e ignorate nelle build di produzione.
Le etichette corrispondono a /^[a-z0-9-]+$/ (OWASP A01 — allowlist rigorosa prima di qualsiasi accesso ai file) e si risolvono in tests/fixtures/<source>/<label>.json. Le etichette non valide sollevano un'eccezione all'avvio; i file mancanti sollevano un'eccezione con il percorso risolto. Per usarle:
CYCLONES_FIXTURE=multi-storm bun run dev
AIRCRAFT_FIXTURE=conus-snapshot bun run dev
Oppure tramite Docker Compose (docker-compose.dev.yml le passa entrambe):
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 è installabile come Progressive Web App. Dopo aver visitato l'app distribuita:
Il service worker mette in cache la shell dell'app per l'avvio offline. I dati live vengono caricati da IndexedDB quando si è offline. Quando si perde la connettività, appare una barra indicatrice dello stato offline con un pulsante RETRY e pull-to-refresh sui dispositivi touch. Quando è disponibile un aggiornamento, un banner invita l'utente a ricaricare — nessuno scambio di codice silenzioso a metà sessione.
Documentazione tecnica completa in docs/ che copre architettura, flusso di dati, sistema delle feature, sistema dei pannelli, rendering, caching, ricerca e vincoli.
Doppia licenza:
| Variabile | Obbligatoria | Descrizione |
|---|
SIGINT_SERVER_SECRET | Sì | Chiave di firma del token di autenticazione. openssl rand -hex 32 |
AISSTREAM_API_KEY | No | Chiave aisstream.io per i dati live delle imbarcazioni |
FIRMS_MAP_KEY | No | Chiave NASA FIRMS per i dati sugli incendi |
DOMAIN | No | Dominio per TLS Let's Encrypt |
PORT | No | Porta del server (default: 5500) |
| Layer | Fonte | Polling |
|---|
| Aeromobili | adsb.fi (scansione tile lato server, 37 tile × 250 nm) | 240s |
| Imbarcazioni | aisstream.io (WebSocket lato server) | 300s |
| Sismico | USGS (lato client) | 420s |
| Incendi | NASA FIRMS (lato server) | 600s |
| Meteo | NOAA (lato client) | 300s |
| Eventi | GDELT 2.0 (lato server) | 15m |
| Notizie | 6 feed RSS (lato server) | 10m |
| Variabile d'ambiente | Fonte che sovrascrive | Etichette valide |
|---|
CYCLONES_FIXTURE | /api/cyclones/latest (il server interroga NHC) | single-cat3, single-cat5, multi-storm, subtropical-example, tropical-depression, empty-out-of-season |
AIRCRAFT_FIXTURE | /api/aircraft/states (il server esegue la scansione tile adsb.fi) | (nessuna inclusa — acquisiscile tramite bun run scripts/capture-fixture.ts aircraft <label>) |