CHRONOVISOR v0.6.0
Multi-Source Satellite Intelligence Platform
for Change Detection & Anomaly Analysis
Problem Statement: Automatic Change Detection in Synthetic Aperture Radar (SAR) Satellite Images
Ministry: National Technical Research Organisation (NTRO) | PS ID: SIH1563 | Category: Software | Theme: Space Technology
A platform that takes a location on a map and tells you whether the changes you're seeing in satellite imagery are man-made or natural. It pulls data from 24 different sources — SAR radar, optical, thermal, soil, seismic, magnetic, historical archives — and fuses them into a single score with confidence rating.
The core problem it solves: SAR change detection gives you a change map, but 40%+ of those "changes" are just floods, vegetation, or snow. This filters those out.
"Change detection between two SAR images is straightforward if co-registered — the difference or ratio gives the change map. But such maps invariably have many natural changes (water body extent, flood extent, snow cover, forest cover). Our interest is to detect only man-made changes and avoid natural changes."
— NTRO, Smart India Hackathon 2025
So the challenge isn't "can you detect changes" — it's "can you ignore the noise." That's what this project does.
The main thing is a 7-component weighted scoring engine. When you scan a location, it pulls data from multiple sources and combines them:
┌─────────────────────────────────────┐
│ MULTI-SOURCE FUSION ENGINE │
│ (Weighted 7-Layer Scoring) │
└─────────────────────────────────────┘
│
┌─────────────┼─────────────┐
│ │ │
SAR Change Optical/ Environmental
Detection Thermal Context
│ │ │
└─────────────┼─────────────┘
│
┌─────────────▼─────────────┐
│ FUSED SCORE: 0-100% │
│ + Confidence rating │
│ + GeoJSON export │
└───────────────────────────┘
The 7 components and their weights:
| Component | Weight | What it does |
|---|---|---|
| Satellite anomalies | 35% | NDVI/thermal/SAR patterns from Sentinel-1/2 |
| Soil preservation | 20% | Clay content, pH, organic carbon — clay preserves structures, sand doesn't |
| Seismic filter | 10% | Penalizes active fault zones (geological noise) |
| Water table | 10% | Shallow water distorts thermal readings |
| OSM historical | 10% | Known sites = confirmed man-made |
| Temporal consistency | 10% | Real structures persist, natural changes don't |
| Web archive evidence | 5% | Academic papers = validated sites |
There are also stacking modifiers: high clay content adds 35%, active seismic zones subtract 25%, nearby archaeological sites add 30%.
This is the most important part — every requirement from the problem statement has a corresponding implementation:
| NTRO Requirement | What I Built |
|---|---|
| SAR change detection between co-registered images | Sentinel-1 GRD backscatter time series + NDVI change detection |
| Filter out natural changes (floods, vegetation, snow) | Seismic filter, soil preservation, water table, OSM context |
| Detect man-made changes only | 7-component weighted fusion with environmental modifiers |
| User-adjustable thresholds | Configurable in config.py + UI controls |
| Polygon output (GeoJSON/Shapefile) | /api/export/json returns GeoJSON with polygons |
| Scalable for large areas | Async FastAPI + parallel fetches + GEE backend |
| GUI for area specification | Leaflet map with click-to-scan, radius, date range |
| Runs on Google Earth Engine | GEE integration with demo fallback |
I'm pulling from 24 different free/public APIs. Here's what each one does:
- Sentinel-1 SAR (10m) — radar backscatter, the core signal for PS1563
- Sentinel-2 (10m) — optical, vegetation stress, crop marks
- Landsat 8 (30m) — thermal, surface temperature anomalies
- ISRIC SoilGrids — clay/sand/silt/pH at 250m
- USGS Earthquakes — seismic activity nearby
- NOAA WMM — magnetic field intensity (nT)
- NASA POWER — solar radiation baseline
- Open-Elevation — SRTM 30m terrain
- Open-Meteo — historical weather
- ESA WorldCover — land use at 10m
- WorldPop — population density
- Wikidata (Pleiades) — ancient sites, temples
- GBIF — species occurrences
- Wayback Machine — prior research
- OpenStreetMap — historic buildings & heritage
- NASA VIIRS — nighttime lights
- Macrostrat — geological formations
All of these are free. No paid APIs.
9 tabs in a dark terminal-themed UI:
| Tab | What's in it |
|---|---|
| Map | Leaflet dark tiles, click-to-scan, place search, configurable satellite source/radius/date, export |
| Analysis | Fused score (0-100%), NDVI/thermal charts, anomaly detection with "Explain" buttons, structural analysis |
| Environment | Soil data, geological context, water proximity, lightning, space weather |
| Intelligence | NDVI change detection between two periods, elevation profiles, nearby places |
| Archives | Wayback Machine, OSM historic, archaeological databases, suitability scoring |
| Terrain | 3D elevation model (SRTM 30m) with wireframe overlay and anomaly markers |
| Signals | Magnetic gradient, SAR backscatter, solar radiation, FFT analysis, EM field heatmap |
| AI Analyst | Full scan interpretation, anomaly explanations (3 hypotheses), investigation plan, chat |
| History | Scan history (200 scans), compare scans, batch scan + rank by suitability |
70+ endpoints. Here are the important ones:
GET /api/mega-scan Full spectrum (15 parallel sources)
GET /api/sar/backscatter Sentinel-1 VV/VH time series
GET /api/site/ndvi-change Vegetation change between periods
POST /api/satellite/anomalies Anomaly detection + classification
GET /api/export/json GeoJSON export with polygons
GET /api/env/soil ISRIC SoilGrids
GET /api/env/faults USGS earthquake data
GET /api/arch/pleiades Ancient sites (Wikidata SPARQL)
GET /api/arch/crossref Cross-reference all databases
POST /api/arch/batch Batch scan + rank locations
POST /api/gemini/analyze Full AI interpretation
POST /api/gemini/explain-anomaly 3 ranked hypotheses per anomaly
POST /api/gemini/chat Conversational AI with scan context
GET /api/llm/status Provider/model status
Full interactive docs at http://localhost:8500/docs (auto-generated by FastAPI)
Backend: Python 3.9+, FastAPI, NumPy, SciPy
Frontend: Leaflet, Plotly.js, Three.js, GSAP
AI: Cerebras GOPT-120B (or OpenRouter/Groq/Gemini)
SAR: Google Earth Engine (Sentinel-1 GRD)
Data: 24 free public APIs, zero paid dependencies
Frontend (HTML/JS/CSS — dark terminal aesthetic)
│
│ 70+ HTTP endpoints + WebSocket
▼
FastAPI Server (backend/api/main.py — 1,294 lines)
│
├── SatelliteEngine ──── Google Earth Engine (Sentinel-1/2, Landsat 8)
├── AIReconstructor ◄── scipy/numpy (the brain)
│ └── fuse_all_data() ← 7-component weighted fusion
├── DataIngestion ───── NOAA, NASA POWER, Open-Elevation, OSM
├── EnvironmentalData ─ ISRIC SoilGrids, USGS Earthquakes, WorldPop
├── ArchaeologicalDB ── Wikidata SPARQL, GBIF, NOAA WMM, VIIRS
├── HistoricalWeb ───── Internet Archive CDX, OSM Overpass
├── SignalProcessor ─── scipy FFT, spectrogram, interpolation
└── GeminiAnalyzer ──── Multi-provider LLM (Cerebras/Groq/OpenRouter/Gemini)
8 backend modules, each handling a specific pipeline stage. The main.py file (1,294 lines) wires everything together with 70+ FastAPI routes.
| What | Lines | Where |
|---|---|---|
| Backend (all modules) | 5,371 | backend/ |
| Frontend JS | 1,496 | frontend/js/app.js |
| Frontend CSS | 1,323 | frontend/css/style.css |
| Frontend HTML | 749 | frontend/index.html |
| Tests | 170 | tests/test_api.py |
| Notebooks | 438 | notebooks/ |
| Total | 9,547 |
git clone https://github.com/subhansh-dev/chronovisor.git
cd chronovisor
pip install -e .
cp .env.example .env # add CEREBRAS_API_KEY (free tier available)
python run.py
# → http://localhost:8500Demo mode: All 70+ endpoints work without GEE authentication. I built a synthetic satellite data generator that produces realistic timeseries with seasonal patterns. This means the demo never fails — no API keys needed for the demo.
Production with real satellite data (GEE):
The service account key is at backend/credentials/gee-service-account.json. For local use, it's already configured in .env.
For Render deployment:
- Go to Render Dashboard → Your Service → Environment
- Add env var
GOOGLE_APPLICATION_CONTENTSwith the full JSON content of the service account key - The app auto-detects this and authenticates with GEE on startup
pip install -r requirements.txt
uvicorn backend.api.main:app --host 0.0.0.0 --port $PORTFirst request after idle: ~30-50s wake-up. After that: fast.
Most teams solving this problem submit a Jupyter notebook with Sentinel-1 differencing. That gives you a change map with 40%+ false alarms.
This is a full-stack web application that:
- Pulls from 24 sources instead of 1
- Fuses them with a weighted scoring engine
- Has a GUI that non-technical users can actually use
- Exports GeoJSON (the format NTRO asked for)
- Has AI interpretation on top of the ML analysis
- Works offline in demo mode
The key insight: you can't solve the false alarm problem with SAR alone. You need environmental context to filter out natural changes.
MIT
Built for Smart India Hackathon 2025 — NTRO PS1563
Multi-source satellite intelligence. Zero false alarm compromise.