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
Share this project:

Updates

Submission history