
Real-time OSINT intelligence dashboard: 7 live data sources (aircraft, AIS vessels, seismic, fires, weather, GDELT events, news) on an interactive globe. Correlation engine, scored alerts, watch mode. Bun + React 19 + Canvas 2D Web Worker rendering. PWA with offline support. https://sigint-5154d935429b.herokuapp.com/
Tableau de bord OSINT en temps réel avec suivi en direct des avions, navires, sismiques, incendies, météo et événements sur un globe interactif. Construit avec Bun, React 19 et un moteur de rendu Canvas 2D + Web Worker personnalisé. Installable en tant que PWA.

git clone https://github.com/iitoneloc/sigint.git
cd sigint
bun install
Créez un fichier .env à la racine du projet avec au minimum :
SIGINT_SERVER_SECRET=<sortie de openssl rand -hex 32>
Ajoutez éventuellement des clés pour les données de navires et d'incendies :
AISSTREAM_API_KEY=<votre clé aisstream.io>
FIRMS_MAP_KEY=<votre clé NASA FIRMS>
Voir Déploiement pour les options de développement, production et Heroku.
bun test # exécute tous les tests
bun test --watch # mode surveillance
bun run docker:test # exécuter dans Docker
bun run docker:dev:up # https://localhost (certificat auto-signé)
bun run docker:dev:down # arrêter
Deux variables d'environnement court-circuitent les récupérations de données en direct en développement afin que vous puissiez travailler sur un état figé connu. Les deux sont conditionnées par NODE_ENV !== "production" et ignorées dans les builds de production.
Les étiquettes correspondent à /^[a-z0-9-]+$/ (OWASP A01 — liste d'autorisation stricte avant toute recherche de fichier) et résolvent en tests/fixtures/<source>/<label>.json. Les étiquettes invalides lèvent une erreur au démarrage ; les fichiers manquants lèvent une erreur avec le chemin résolu. Pour les utiliser :
CYCLONES_FIXTURE=multi-storm bun run dev
AIRCRAFT_FIXTURE=conus-snapshot bun run dev
Ou via Docker Compose (docker-compose.dev.yml transmet les deux) :
CYCLONES_FIXTURE=single-cat5 bun run docker:dev:up
bun run docker:prod:up # http://localhost:5500
bun run docker:prod:down # arrêter
DOMAIN=sigint.example.com bun run docker:prod:tls:up
bun run docker:prod:tls:down # arrêter
git push heroku main
bun run docker:clean:all # supprime conteneurs, volumes, images
SIGINT est installable en tant qu'application web progressive (PWA). Après avoir visité l'application déployée :
Le service worker met en cache le shell de l'application pour un démarrage hors ligne. Les données en direct sont chargées depuis IndexedDB lorsqu'elles sont hors ligne. Une barre d'indication hors ligne apparaît lorsque la connexion est perdue, avec un bouton RÉESSAYER et un pull-to-refresh sur les appareils tactiles. Lorsqu'une mise à jour est disponible, une bannière invite l'utilisateur à recharger — pas de changement de code silencieux en cours de session.
Documentation technique complète dans docs/ couvrant l'architecture, le flux de données, le système de fonctionnalités, le système de panneaux, le rendu, la mise en cache, la recherche et les contraintes.
Sous double licence :
| Variable | Requis | Description |
|---|
SIGINT_SERVER_SECRET | Oui | Clé de signature du jeton d'authentification. openssl rand -hex 32 |
AISSTREAM_API_KEY | Non | Clé aisstream.io pour les données de navires en direct |
FIRMS_MAP_KEY | Non | Clé NASA FIRMS pour les incendies |
DOMAIN | Non | Domaine pour le TLS Let's Encrypt |
PORT | Non | Port du serveur (par défaut : 5500) |
| Couche | Source | Intervalle |
|---|
| Avions | adsb.fi (balayage de tuiles côté serveur, 37 tuiles × 250 nm) | 240 s |
| Navires | aisstream.io (WebSocket côté serveur) | 300 s |
| Sismiques | USGS (côté client) | 420 s |
| Incendies | NASA FIRMS (côté serveur) | 600 s |
| Météo | NOAA (côté client) | 300 s |
| Événements | GDELT 2.0 (côté serveur) | 15 min |
| Actualités | 6 flux RSS (côté serveur) | 10 min |
| Variable d'env. | Source qu'elle remplace | Étiquettes valides |
|---|
CYCLONES_FIXTURE | /api/cyclones/latest (le serveur récupère le NHC) | single-cat3, single-cat5, multi-storm, subtropical-example, tropical-depression, empty-out-of-season |
AIRCRAFT_FIXTURE | /api/aircraft/states (le serveur récupère le balayage adsb.fi) | (aucune fournie — capturer via bun run scripts/capture-fixture.ts aircraft <label>) |