Inspiration
When a glacier lake bursts in the Himalaya, the monsoon clouds don't part politely for your satellite. Roads vanish, bridges go downstream, and every rescue team asks the same question: "Which villages can we still reach?"
Normally the answer takes days. We wanted it in minutes, using nothing but free satellite data. π°οΈ
What it does
Point at a map, pick a date, and WaterGuard tells rescue teams where the flood hit, what it broke, and who is now cut off.
- π Where did the flood hit? Sentinel-1 radar (which sees straight through monsoon cloud) is fused with Sentinel-2 optical change, kept to the valley floor where water can actually reach.
- ποΈ What was damaged? Buildings, roads, bridges and health facilities from pre-event OpenStreetMap, laid over the impact map.
- π§ Who is cut off? Settlements that had a road to a town or health post before the flood and have none now.
- π¬ "So what do I tell my team?" A bilingual copilot (English + ΰ€¨ΰ₯ΰ€ͺΰ€Ύΰ€²ΰ₯) that won't say a number the maps can't back up.
- π "I need it on paper." A one-page situation report, one click.
- π§ "Where will it go next?" A flood-path tracer from any upstream point.
How we built it
- Terrain: Copernicus DEM β HAND (height above river), slope and D8 flow paths using WhiteboxTools.
- Radar: Sentinel-1 RTC. The first image after the event is compared with up to 5 earlier images from the same orbit track, giving per-pixel z-score change. Layover and shadow are masked.
- Optical: Sentinel-2 L2A cloud-free before/after composites β NDVI loss and NDWI gain.
- Fusion (OpenCV): valley floor AND (optical change where clear, radar elsewhere), then morphology. Patches must touch the river.
- Damage and access: a pre-event OSM snapshot becomes a road graph. We remove impacted segments and damaged bridges, then test whether settlements can still reach towns, health posts and roads out of the area.
- Copilot: it has no data of its own. It can call only six read-only tools over the run's results. Every number in its draft must appear in a tool result. If one doesn't, the model gets one retry, and if it's still wrong the number becomes
[unverified]. Every answer ends with "β N numbers checked". It runs on Amazon Bedrock (Nova Pro), with an offline fallback. - Stack: Python, FastAPI, OpenCV, MapLibre, Docker, and EC2 behind CloudFront.
Challenges we ran into
- The flood wasn't water. The 26 Aug 2026 glacier-outburst flood on the Bhote KoshiβTrishuli corridor was mostly debris and landslides. A "find the water" model misses most of it, so we look for change instead.
- Honesty is hard to enforce. EMS damage maps and post-event OSM edits are never inputs. Each run uses an OSM snapshot from 24 h before the event and fails if any feature was edited after it. EMS data is read by exactly one validation module that the pipeline never imports.
- Crying wolf. We tried to make it cry wolf. A placebo date a month before the flood flagged 0 ha, and the untouched Langtang valley flagged 0 ha.
- Clouds. Optical imagery in monsoon season is mostly a rumour, so radar picks up the slack where Sentinel-2 can't see.
Accomplishments that we're proud of
We checked our homework against the official Copernicus EMS maps (EMSR927), tuning on two areas and keeping two held out:
| EMS area | Split | F1 | Valley-only baseline |
|---|---|---|---|
| Syapru Besi | tuning | 0.94 | 0.86 |
| Timure | tuning | 0.90 | 0.89 |
| Bidur | held-out | 0.92 | 0.56 |
| Phosretar | held-out | 0.88 | 0.53 |
- ποΈ At Bidur it caught 2475 of 2479 EMS-destroyed buildings.
- π It flagged 20 of 20 EMS-damaged bridges at Bidur and 5 of 5 at Syapru Besi.
- πΊ No wolf-crying on the placebo and untouched-valley tests.
- π It ran unchanged on the 2021 Melamchi flood and the Sept 2024 Kathmandu Valley floods, and a flat city is about as far from a Himalayan gorge as you can get.
What we learned
- Radar sees through clouds, optical sees what radar can't, and neither helps if you forget to mask layover and shadow.
- A baseline matters. "Mark the whole valley" scoring 0.89 at Timure kept us humble about how much the satellites were really adding.
- An AI that says
[unverified]is more useful than one that sounds sure. In disaster response, a confident wrong number can send a rescue team the wrong way.
What's next for WaterGuard: Flood Impact from Space
Next up:
- More flood events and regions
- Feedback from people who actually do flood response
- Better estimates of stranded people (right now it's buildings Γ 4.37, the Nepal 2021 census household average)
- More languages for the copilot
Built With
- amazon-bedrock
- amazon-cloudfront
- amazon-nova-pro
- aws-ec2
- change-detection
- copernicus-dem
- docker
- fastapi
- maplibre-gl
- microsoft-planetary-computer
- ohsome-api
- opencv
- openstreetmap
- python
- sar
- sentinel-1
- sentinel-2
- whiteboxtools
Log in or sign up for Devpost to join the conversation.