
リアルタイムOSINTインテリジェンスダッシュボード: インタラクティブな地球儀上に7つのライブデータソース(航空機、AIS船舶、地震、火災、気象、GDELTイベント、ニュース)を表示。相関エンジン、スコア化されたアラート、ウォッチモードを搭載。Bun + React 19 + Canvas 2D Web Workerレンダリング。オフライン対応のPWA。https://sigint-5154d935429b.herokuapp.com/
インタラクティブな地球儀上で航空機、船舶、地震、火災、天気、イベントをリアルタイム追跡するOSINTダッシュボード。Bun、React 19、カスタムCanvas 2D + Web Workerレンダリングエンジンで構築。PWAとしてインストール可能。

git clone https://github.com/iitoneloc/sigint.git
cd sigint
bun install
プロジェクトルートに.envファイルを最低限以下の内容で作成します:
SIGINT_SERVER_SECRET=<output of openssl rand -hex 32>
船舶・火災データ用のキーを任意で追加します:
AISSTREAM_API_KEY=<your aisstream.io key>
FIRMS_MAP_KEY=<your NASA FIRMS key>
開発、本番、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
開発中にライブデータ取得をショートサーキットする2つの環境変数で、既知の固定状態に対して作業できます。どちらもNODE_ENV !== "production"でゲートされ、本番ビルドでは無視されます。
ラベルは/^[a-z0-9-]+$/に一致し(OWASP A01 — ファイル参照前の厳格な許可リスト)、tests/fixtures/<source>/<label>.jsonに解決されます。無効なラベルは起動時に例外をスローし、ファイルが存在しない場合は解決されたパスとともに例外をスローします。使用例:
CYCLONES_FIXTURE=multi-storm bun run dev
AIRCRAFT_FIXTURE=conus-snapshot bun run dev
またはDocker Compose経由(docker-compose.dev.ymlが両方をそのまま渡します):
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はプログレッシブWebアプリ(PWA)としてインストールできます。デプロイ済みアプリを訪問した後:
サービスワーカーはオフラインブート用にアプリシェルをキャッシュします。オフライン時にはライブデータをIndexedDBから読み込みます。接続が失われるとオフラインインジケーターバーが表示され、タッチデバイスではRETRYボタンとプル・トゥ・リフレッシュが利用できます。アップデートが利用可能な場合、バナーがリロードを促します — セッション中のサイレントなコード差し替えはありません。
アーキテクチャ、データフロー、機能システム、ペインシステム、レンダリング、キャッシング、検索、制約事項を網羅した完全な技術ドキュメントはdocs/にあります。
デュアルライセンス:
| 変数 | 必須 | 説明 |
|---|
SIGINT_SERVER_SECRET | はい | 認証トークン署名キー。openssl rand -hex 32 |
AISSTREAM_API_KEY | いいえ | ライブ船舶データ用のaisstream.ioキー |
FIRMS_MAP_KEY | いいえ | 火災データ用のNASA FIRMSキー |
DOMAIN | いいえ | Let's Encrypt TLS用ドメイン |
PORT | いいえ | サーバーポート(デフォルト: 5500) |
| レイヤー | ソース | ポーリング |
|---|
| 航空機 | adsb.fi(サーバー側タイルスイープ、37タイル × 250海里) | 240s |
| 船舶 | aisstream.io(サーバーWebSocket) | 300s |
| 地震 | USGS(クライアント側) | 420s |
| 火災 | NASA FIRMS(サーバー側) | 600s |
| 天気 | NOAA(クライアント側) | 300s |
| イベント | GDELT 2.0(サーバー側) | 15m |
| ニュース | 6つのRSSフィード(サーバー側) | 10m |
| 環境変数 | 上書きするソース | 有効なラベル |
|---|
CYCLONES_FIXTURE | /api/cyclones/latest(サーバーがNHCを取得) | single-cat3, single-cat5, multi-storm, subtropical-example, tropical-depression, empty-out-of-season |
AIRCRAFT_FIXTURE | /api/aircraft/states(サーバーがadsb.fiタイルスイープを取得) | (同梱なし — bun run scripts/capture-fixture.ts aircraft <label>でキャプチャ) |