home / skills / openclaw / skills / geospatial-osint
This skill helps you build real-time geospatial dashboards by integrating multiple data sources and rendering immersive, post-processed Worldview style visuals.
npx playbooks add skill openclaw/skills --skill geospatial-osintReview the files below or copy the command above to add this skill to your agents.
---
name: geospatial-osint
description: Open-source geospatial intelligence gathering and visualization dashboard. Use when building Worldview-style spy thriller dashboards, monitoring geopolitical events, or analyzing multi-source OSINT. Covers satellite tracking, live flights (commercial + military), maritime traffic, street cameras, seismic data, and real-time visualization with post-processing effects. Supports 3D globe rendering with CRT/NVG/thermal modes, time-based replay, and multi-agent development workflows.
---
# Geospatial OSINT / Worldview Dashboard
This skill covers building real-time geospatial intelligence dashboards inspired by Bilawal Sidhu's Worldview project.
## Quick Start
### Core Data Sources (Free)
| Source | API/URL | Use Case |
|--------|---------|----------|
| [ADS-B Exchange](https://www.adsbexchange.com/) | API, free key | Commercial flights |
| [ADS-B Exchange Military](https://www.adsbexchange.com/api/military/) | API | Military aircraft |
| [OpenSky Network](https://opensky-network.org/) | Free API | Flight data |
| [MarineTraffic](https://www.marinetraffic.com/) | Free tier | Ship positions |
| [CelesTrak](https://celestrak.org/) | TLE files | Satellite orbits |
| [n2yo.com](https://www.n2yo.com/) | Free API | Satellite passes |
| [GPSJam](https://gpsjam.org/) | Static | GPS jamming heatmaps |
| [Earthquakes](https://earthquake.usgs.gov/earthquakes/feed/) | GeoJSON | Seismic data |
| [Insecam](https://www.insecam.org/) | Public cams | CCTV cameras |
| [OpenStreetMap](https://www.openstreetmap.org/) | Overpass API | Road networks |
### Paid Options (Optional)
- Planet Labs (daily imagery)
- Maxar (high-res)
- Capella Space (SAR)
- MarineTraffic Pro
## Architecture
### Stack
```
Frontend: Cesium.js (3D globe) + Three.js (effects)
Data Layer: Polling APIs → WebSocket → Entity updates
Visual: Post-processing (bloom, CRT, NVG, thermal)
Development: Multi-agent CLI (OpenClaw, Claude, etc.)
```
### Visual Modes
Worldview supports multiple rendering modes:
```javascript
// Effect pipeline examples
const effects = {
// Night Vision Goggles (green tint + scanlines)
nvg: {
colorMatrix: [0,1,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1],
scanlines: true,
vignette: 0.3
},
// Thermal (heat map coloring)
thermal: {
colorMap: 'inferno',
threshold: true
},
// CRT (scanlines + curvature + glow)
crt: {
scanlines: 0.5,
curvature: 0.02,
bloom: 0.5
},
// Fluor (high contrast military green)
fluor: {
colorMatrix: [0,0.5,0,0, 0,1,0,0, 0,0.5,0,0, 0,0,0,1],
contrast: 1.5
}
};
```
### Data Layers
| Layer | Source | Update Freq |
|-------|--------|-------------|
| Satellites | CelesTrak TLE | Periodic refresh |
| Commercial flights | ADS-B / OpenSky | ~5 sec |
| Military flights | ADS-B Exchange military | ~5 sec |
| Ships | MarineTraffic | ~1 min |
| CCTV | Insecam | ~1 min |
| Road traffic | OSM + simulation | Static + particles |
| Earthquakes | USGS | Real-time |
| GPS jamming | GPSJam | Static/daily |
## Dashboard Template
### Basic Cesium Setup
```javascript
import * as Cesium from 'cesium';
const viewer = new Cesium.Viewer('container', {
terrainProvider: Cesium.createWorldTerrain(),
baseLayerPicker: false,
timeline: true,
animation: true,
sceneMode: Cesium.SceneMode.SCENE3D
});
// Enable 3D buildings
viewer.scene.primitives.add(Cesium.createOsmBuildings());
// Clock settings for replay
viewer.clock.shouldAnimate = true;
viewer.clock.multiplier = 60; // 60x speed
```
### Loading Flight Data
```javascript
async function loadFlights(bounds) {
const response = await fetch(
`https://opensky-network.org/api/states/all?lamin=${bounds.minLat}&lomin=${bounds.minLon}&lamax=${bounds.maxLat}&lomax=${bounds.maxLon}`
);
const data = await response.json();
data.states.forEach(flight => {
const [icao, callsign, .., lat, lon, alt, .., velocity, heading] = flight;
// Add entity to viewer
viewer.entities.add({
id: icao,
position: Cesium.Cartesian3.fromDegrees(lon, lat, alt),
point: { pixelSize: 5, color: getFlightColor(callsign) },
label: { text: callsign, font: '10px monospace' }
});
});
}
```
### Satellite Tracking
```javascript
// Load TLE and calculate positions
const satellites = await fetch('https://celestrak.org/NORAD/elements/gp.php?GROUP=visual&FORMAT=tle')
.then(r => r.text());
// Use satellite.js to propagate
import { propagate, eciToEcf } from 'satellite.js';
function updateSatellite(satrec, time) {
const position = propagate(satrec, time);
const gmst = satellite.gstime(time);
const positionEcf = eciToEcf(position.position, gmst);
return {
x: positionEcf.x * 1000,
y: positionEcf.y * 1000,
z: positionEcf.z * 1000
};
}
```
### CCTV Camera Overlay
```javascript
// Insecam - public cameras
async function loadCameras(bounds) {
const response = await fetch(
`https://www.insecam.org/en/by-country/XX/?page=1` // Filter by country
);
// Parse camera list, add as entities with video texture
}
// Project camera onto 3D geometry
cameraEntities.forEach(cam => {
viewer.entities.add({
position: cam.location,
billboard: {
image: cam.snapshot,
width: 320,
height: 240,
pixelOffset: new Cesium.Cartesian2(0, -120)
}
});
});
```
## Post-Processing Effects
```javascript
// Using Cesium's PostProcessStage
const bloom = viewer.scene.postProcessStages.bloom;
bloom.enabled = true;
bloom.threshold = 0.5;
bloom.strength = 0.5;
// Custom shader for CRT effect
const crtEffect = new Cesium.PostProcessStage({
name: 'crt',
fragmentShader: `
uniform sampler2D colorTexture;
varying vec2 v_textureCoord;
void main() {
vec4 color = texture2D(colorTexture, v_textureCoord);
// Scanlines
float scanline = sin(v_textureCoord.y * 800.0) * 0.04;
// Vignette
float vignette = 1.0 - length(v_textureCoord - 0.5) * 0.5;
gl_FragColor = vec4(color.rgb * (1.0 - scanline) * vignette, 1.0);
}
`
});
```
## Workflow: Building with AI Agents
### Multi-Agent Setup
Run multiple terminals in parallel:
```
Terminal 1: Core 3D globe + Cesium setup
Terminal 2: Data integration (flights, satellites)
Terminal 3: Visual effects (shaders, post-processing)
Terminal 4: UI controls + camera systems
```
### Prompt Template
```
Build a [feature] for my Cesium.js geospatial dashboard.
Requirements:
- [specific behavior]
- Integration with existing data layer
- Performance: handle [N] entities without lag
- Visual style: [CRT/NVG/thermal/none]
```
### Performance Tips
```javascript
// Sequential loading for large datasets
async function loadSequential(data, chunkSize = 1000) {
for (let i = 0; i < data.length; i += chunkSize) {
const chunk = data.slice(i, i + chunkSize);
chunk.forEach(addEntity);
await new Promise(r => setTimeout(r, 100)); // Yield to UI
}
}
// Use PointPrimitiveCollection for 10k+ points
const points = viewer.scene.primitives.add(new Cesium.PointPrimitiveCollection());
points.add({ position: ..., color: ... });
```
## Region Monitoring
### Automated Polling
```python
import requests
import schedule
from datetime import datetime
REGIONS = {
'iran': {'lat': 32.0, 'lon': 52.0, 'radius': 500},
'gulf': {'lat': 26.0, 'lon': 52.0, 'radius': 300},
}
def monitor():
for name, bounds in REGIONS.items():
flights = get_flights(bounds)
military = get_military(bounds)
if detect_anomaly(flights, military):
alert(f"Anomaly in {name}: {details}")
schedule.every(5).minutes.do(monitor)
```
### Alert Conditions
- Sudden flight rerouting
- New no-fly zones
- Unusual military activity
- Satellite coverage of area of interest
## References
- [Cesium.js](references/cesium-basics.md)
- [Rendering Stack](references/rendering-stack.md)
- [ADS-B API](references/adsb-api.md)
- [Satellite Passes](references/satellite-passes.md)
- [Post-Processing](references/effects.md)
This skill is an open-source geospatial OSINT dashboard for real-time intelligence gathering and cinematic visualization. It combines multi-source data (flights, satellites, ships, CCTV, seismic, GPS jamming) with a 3D globe, post-processing effects, and time-based replay for rapid situational awareness. The stack is designed for live monitoring, analysis, and multi-agent development workflows.
The system polls public and optional paid APIs (ADS‑B, OpenSky, MarineTraffic, CelesTrak, USGS, Insecam, etc.), normalizes feeds, and streams entity updates to a Cesium.js 3D globe. Visual layers include satellite propagation from TLEs, flight and ship positions, CCTV overlays, seismic events, and static heatmaps; post-processing shaders provide CRT/NVG/thermal looks and time-clamped replay. A WebSocket/data layer and agent-driven pipelines enable parallel development, sequential loading for large datasets, and alerting based on anomaly rules.
Can I use paid imagery (Planet, Maxar) with this dashboard?
Yes. The architecture supports optional paid imagery sources; integrate them as additional tile or imagery providers and respect vendor rate and licensing constraints.
How do I scale to tens of thousands of entities without UI lag?
Use GPU-backed primitives, chunked ingestion, level-of-detail filtering, and disable heavy post-processing for high-entity modes; stream updates via WebSocket rather than full state refreshes.