A real-time geopolitical command-center dashboard that aggregates open-source intelligence from public APIs and renders it on a 3D globe.
DISCLAIMER: KalView is an educational OSINT visualization MVP using public data sources only. It does not access classified, private, restricted, or non-public systems. Military and government asset labels are heuristic and based only on publicly visible transponder/AIS-style data. KalView must not be used for operational, tactical, financial, safety-critical, or emergency decision-making.
- 3D Globe — fullscreen CesiumJS globe with dark CARTO basemap (no Ion token needed)
- Military aircraft — filtered from OpenSky public state vectors by callsign heuristics
- Military vessels — filtered from AISStream by ship type / name heuristics
- Conflict events — ACLED and GDELT GEO 2.0 geocoded news feeds
- Humanitarian crises — ReliefWeb disasters API
- Natural disasters — NASA EONET open events + USGS real-time earthquake feed
- Breaking news — NewsAPI headlines with keyword geocoding
- Market ticker — Polygon.io stock and crypto snapshots
- Source health panel — live/cached/no-key/failed status per source
- Event detail drawer — click any pin or feed item for full details
- Filter panel — toggle layers by category, severity, and keyword
- Auto-poll — frontend refreshes every 45 s; backend refreshes every 5 min
- No database — pure in-memory cache, zero setup
| Layer | Technology |
|---|---|
| Backend | Python · FastAPI · HTTPX · Pydantic · Uvicorn |
| Frontend | React · Vite · TypeScript · CesiumJS · Tailwind |
| Source | Key Required | Category | Notes |
|---|---|---|---|
| NASA EONET | No | Natural disasters | Open EONET v3 events feed |
| ReliefWeb | No | Humanitarian crises | V2 reports API — situation reports and flash updates |
| GDELT GEO 2.0 | No | News / Conflict | Geocoded article mentions, 24 h rolling window |
| OpenSky Network | No | Military aircraft | Public state vectors filtered by callsign heuristics |
| USGS Earthquake API | No | Earthquakes | Real-time GeoJSON feed (M2.5+, past 24 h), not conflict |
| World Bank Indicators | No | Country context | Background indicators (GDP, population, etc.); not plotted |
| Polygon.io | Yes | Market data | Previous-day OHLCV for stocks and crypto |
| NewsAPI | Yes | Global headlines | Keyword-filtered global news |
| ACLED | Yes | Conflict data | Armed conflict location and event data |
| AISStream | Yes | Maritime AIS | WebSocket AIS stream filtered by vessel type |
Sources without a key run automatically. Sources that need a key show
NO KEY in the source health panel and return no data until configured.
cd KalViewcd backend
pip install -r requirements.txt
# Copy and optionally edit the env file
# Windows PowerShell: copy .env.example .env
cp .env.example .env
python -m uvicorn app.main:app --reload --port 8000Windows note: PowerShell does not support
&&. Run each command separately. Usepython -m uvicorn— the bareuvicorncommand may not be on PATH for Windows Store Python installations.
Visit http://localhost:8000/health — should return {"status":"ok", ...}.
cd frontend
npm install
# Copy env file
cp .env.example .env
npm run devOpen http://localhost:5173.
Edit backend/.env and fill in the values you have:
POLYGON_API_KEY=your_key_here
NEWSAPI_KEY=your_key_here
ACLED_EMAIL=you@example.com
ACLED_API_KEY=your_key_here
AISSTREAM_API_KEY=your_key_hereThen hit Force Refresh in the dashboard or POST http://localhost:8000/api/refresh.
| Key | URL |
|---|---|
| Polygon.io | https://polygon.io/dashboard/signup |
| NewsAPI | https://newsapi.org/register |
| ACLED | https://acleddata.com/register/ |
| AISStream | https://aisstream.io/ |
| Cesium Ion | https://cesium.com/ion/signin/ |
The Cesium Ion token goes in frontend/.env as VITE_CESIUM_ION_TOKEN.
Without it the globe uses CARTO dark tiles, which is fine for the MVP.
| Endpoint | Method | Description |
|---|---|---|
/health |
GET | Service health check |
/api/nexus |
GET | All events + assets + markets |
/api/events |
GET | Events (filterable by category etc.) |
/api/assets |
GET | Asset tracks (aircraft, vessels) |
/api/markets |
GET | Market snapshots |
/api/refresh |
POST | Trigger immediate re-fetch |
- OpenSky does not guarantee complete military aircraft coverage; the callsign heuristics produce false positives and miss real military flights.
- AIS classification (vessel military/government detection) is imprecise.
- GDELT GEO 2.0 uses the API's built-in geocoordinates, which are more precise than text-geocoding but still reflect where GDELT located the article, not necessarily the exact incident site.
- NewsAPI geocoding is approximate — articles are pinned to the country of their source outlet, not necessarily the event location.
- ACLED requires credentialed access and only returns the most recent 100 events per refresh.
- Polygon.io free tier has strict rate limits and may not return real-time prices during market hours on the basic plan.
- All data is cached in-memory; restarting the backend clears the cache.
- Alert / notification system for critical events