AWS Builder Center
JalNetra: We Tried to Close a 2 Hour 43 Minute Flood Warning Gap on AWS

JalNetra: We Tried to Close a 2 Hour 43 Minute Flood Warning Gap on AWS

A glacier collapse in Nepal took 2 h 43 min to trigger the first gauge alarm. JalNetra watches 681 river points, predicts which of 291 villages the water reaches, and lets a human approve a Hindi warning call. Here is the stack, the numbers, and what broke.

Building cool stuffs
On 26 August 2026 a glacier collapsed above Langtang in Nepal. The flood it released ran 226 km to the Indian border. The first alarm on the gauge network went off 2 hours 43 minutes after the collapse.
The number itself is not what bothered us. This is: by the time that alarm fired, the gauges closest to the source had already gone dark. The last thing they reported was normal.
Glacier Img

We kept coming back to that. A gauge standing in a flood's path can warn you only until the water reaches it. After that it says nothing, and nothing looks a lot like fine.
So we picked the Heat and Water track and built JalNetra. The name is जल (water) plus नेत्र (eye). The eye on the water. This post covers the problem, the stack, the numbers (including the unflattering ones), and the parts that fought back.
Landing Page


What JalNetra does

  • Watch: 681 river points across India, checked every 3 hours against each river's own record.
  • Predict: which of 291 villages along the Gandak the water reaches, and when: now, +3, +6, +12 and +24 hours.
  • Decide: a person reviews the map and the drafted advisory, then approves or rejects. Nothing is automatic.
  • Warn: one Hindi voice call to the village head, a spoken advisory, a 3D evacuation route and an AR arrow pointing to the safe place.
The site flows like this: Home, Glacier story, Live map, Approve, and then a phone rings.



The rule we built everything around: a person decides

We spent more time on what JalNetra must never do than on what it does.
A false alarm that phones a village at night is a real harm. People stop trusting the next call. So the system proposes and a human disposes. Opening an alert does not call anyone. Selecting one does not call anyone. Only an explicit approval does, and even then the guardrails sit on the server, not in the browser:
  • A call can reach only the one configured demo number. No API route accepts a phone number at all.
  • One attempt per alert, a cooldown, 3 calls per session and a daily cap.
  • "Dispatched" is never displayed as "answered". Failed or unknown outcomes stay locked.
  • Exercise data is labelled EXERCISE everywhere and kept apart from real incidents.
I will be honest: some of this made the demo less exciting. A judge clicking Approve gets one call, once. We decided that was the right trade.
Data




The stack

Everything runs in ap-south-1 (Mumbai) and is defined in AWS CDK.
AWS Services

Plain text
SERVICE WHAT IT DOES IN JALNETRA
--------------------------- ----------------------------------------------------
Lambda River monitor, API, approvals, helpers
EventBridge Scheduler Triggers the monitor every 3 hours
API Gateway Public API with throttling
S3 + CloudFront + WAF Site, river snapshot, Hindi audio, rate limits
RDS PostgreSQL Call ledger, per-alert and daily limits
Secrets Manager API keys and the one allowed destination number
Bedrock (Nova Lite) Drafts Hindi and English advisory, human reviewed
Polly (Kajal) Hindi speech, cached in S3
Location Service Real walking routes to the safe place
Rekognition First-screen check of a citizen's flood photo
Step Functions + SNS After approval: wait, check, escalate. No retries
SQS Alert queue with a dead-letter queue
CloudWatch Logs, alarms, JalNetra-operations dashboard
IAM, VPC, CDK Least-privilege roles, private network, IaC
A few notes on where the work actually happened.
The monitor. An EventBridge schedule wakes a Lambda every 3 hours. It pulls GloFAS forecasts through Open-Meteo, compares each of the 681 points with that river’s own history, and writes a snapshot to S3. CloudFront serves it, so the map loads fast and the API isn’t hit on every visit. A rising river triggers an SNS alert.
Bedrock, on a short leash. Nova Lite drafts the advisory using only the village, arrival window and route it is given. A person reads every draft before anything goes out.
Polly and the Hindi voice. Kajal reads the approved advisory in Hindi. The audio is generated once and cached in S3, so repeats don’t call Polly again.
Location Service for the last mile. It gives a real walking route to the safe place, which the frontend draws as a 3D path and an AR arrow.



What Makes JalNetra Different?

Plain text
METRIC RESULT
-------------------------------------------------- ---------------------------
Villages caught that radar later saw flooded 56% and 66% (two held-out dates)
False alarms Yes, some
Ranking skill (AUC) 0.72 to 0.75 (0.5 = coin flip)
Honest Accuracy: We tested our model against real Sentinel-1 flood maps from the 2026 event, keeping each radar date separate from training. We publish our actual results and treat JalNetra as an early-warning tool, not a guarantee.
Reliable Alerts: JalNetra uses an RDS alert ledger, single-attempt calling, and a dead-letter queue to prevent duplicate calls and make failures visible.
Resilient Monitoring: Inspired by the Langtang flood, JalNetra combines historical river records with forecasts, ensuring a failed gauge does not become a single point of failure.
Human-Approved AI: Amazon Bedrock drafts advisories from supplied facts. A human reviews each warning, and only the approved text is used for voice delivery. AI assists; humans decide.
Route




Builder Center, free credits and what they changed

This was my first time using AWS Builder Center properly, and getting started cost nothing. The hackathon rules are clear about it. Building locally with AWS open-source tools needs no account at all. Deploying needs an AWS account, and a new account on the free tier starts with up to $200 in credits. WeMakeDevs adds $25 more if you use those up. Verifying yourself as a student on Builder Center takes a couple of minutes and unlocks more rewards on the profile.



What it cannot do yet

  • It covers the Gandak basin villages, not every river it watches.
  • Calls go to one demo phone by design. A real rollout needs consented contact lists and a plan with district disaster authorities.
  • Accuracy is modest. More radar dates and better inputs are the first thing to improve.
  • The voice call is one channel. A real deployment should add SMS and a fallback when nobody picks up.



Try it

The repo has the React 19 + TypeScript front end, the Lambda API with tests, the CDK stack, and the Python pipeline that builds the flood data from Sentinel and GloFAS.
Data sources: Sentinel-1 and Sentinel-2 (Microsoft Planetary Computer), GloFAS river discharge and rain (Open-Meteo), Copernicus DEM GLO-30, OpenStreetMap and GeoNames.
A river doesn't send a warning. Someone has to.
Thanks to  Kunal Kushwaha | Profile | AWS Builder Center  for the opportunity. :)


Any opinions in this article are those of the individual author and may not reflect the opinions of AWS.
Enjoyed reading this content? Let the author know!

Your likes, comments, shares, and saves help creators reach more builders.

Loading recommendations

Loading article