
I replayed 5 Delhi storms to warn drivers before underpasses flood (built on AWS)
GoNoGo warns Delhi commuters on Telegram or email before an underpass floods, using Delhi PWD's own 6/8-inch rule. Replaying real IMD rainfall, it flagged all 12 news-reported floods across 5 storms, and it runs fully serverless on AWS.


In September 2024, two bank employees were driving home to Greater Faridabad on a rainy night. The railway underpass ahead was flooded and barricaded. They moved the barricade, drove in, and the car sank. Both of them drowned.
That story stayed with me more than any statistic, because the warning existed. It was a barricade, standing at the edge of the water. By the time you're looking at it, you've already chosen your route, you're tired, and you think your car can make it.
So for Environmental Hacks (Bharat Builds Tour, WeMakeDevs × AWS) I asked one narrow question:
What if the warning reached you before you left home?
The problem, in Delhi's own numbers
Delhi's traffic police list 410 waterlogging points. A handful flood almost every monsoon: Minto Bridge, Pul Prahladpur, Zakhira. People have died in them. A tempo driver drowned at the Minto Bridge underpass in July 2020. In July 2024, three UPSC aspirants drowned when a coaching-centre basement in Old Rajinder Nagar flooded, and days later a mother and her three-year-old son drowned in a waterlogged drain in Ghazipur.
Today's warnings are mostly traffic-police posts after a spot floods. I wanted something that says, for one specific underpass, "don't come this way", an hour or two earlier.
What I built: GoNoGo
GoNoGo watches 19 of Delhi's worst flood spots and gives each one of three states, refreshed every 15 minutes:
- 🟢 Safe: water expected to stay low
- 🟡 Risky: up to about 6 inches; two-wheelers should avoid it
- 🔴 Do not enter: over 8 inches likely; take another route
Those levels aren't my invention. Delhi PWD's own procedure for underpasses is to start pumps at 6–8 inches of water and stop traffic above 8 inches. GoNoGo simply tries to tell you about it before the barricade goes up.
You tick the underpasses on your daily route and get alerts on Telegram or email, in Hindi or English, the moment one of them gets worse. Anyone standing at a flooded spot can upload a photo, and AI estimates the depth against a car tyre or a kerb, which updates the spot for everyone.


How it decides
For every spot, every 15 minutes, GoNoGo looks at three numbers: rain in the last hour, the last 3 hours, and the next hour (forecast). Each is divided by that spot's limit:
Plain text
score = max( rain_1h / limit_1h, rain_3h / limit_3h, forecast_1h / limit_1h )score ≥ 0.5 → Risky score ≥ 1 → Do not enter
Underpasses, tunnels and spots that flood every year get lower limits (20–30 mm per hour) than ordinary roads (40 mm). A citizen photo showing 8+ inches overrides everything for an hour.
It's deliberately simple. For a safety tool, I wanted every red to be explainable in one sentence.
The architecture: serverless on AWS
The whole system runs on AWS in the Sydney region, defined in a single AWS SAM template:
Job | AWS service |
|---|---|
Wake up every 15 minutes | Amazon EventBridge Scheduler |
Rate all 19 spots, send alerts | AWS Lambda (Python 3.12): risk engine, API and photo worker |
Public API for the site and the Telegram webhook | Amazon API Gateway (HTTP API, throttled) |
Live status, subscribers, reports | Amazon DynamoDB (single table, on-demand) |
Email alerts, filtered per person | Amazon SNS |
Read water depth from photos | Amazon Bedrock (Amazon Nova Pro) |
Photos and the website | Amazon S3 + Amazon CloudFront |
Dashboard and "it went silent" alarm | Amazon CloudWatch |


A few design choices I'm proud of:
- Async photo checks. API Gateway gives up after 30 seconds and a vision model can take longer, so the API stores the photo in S3, invokes a worker Lambda asynchronously and returns immediately; the website polls for the result. Checks come back in about 5 seconds and can never time out the API.
- SNS filter policies instead of my own mailer. Each alert is published once with Â
spotÂ, ÂlangÂand ÂkindÂattributes, and each email subscription carries a filter policy, so people only get their own spots in their own language. SNS handles confirmation and unsubscribe for free.
- Monitoring the failure that matters. For a warning system, the worst bug is silence. A CloudWatch alarm fires if the engine hasn't run in an hour, and custom metrics (spots by level, alerts sent, photo reports) come from the Embedded Metric Format: just a Â
print()Âof JSON, with no extra IAM.
Does it actually work? Replaying real storms
A warning system nobody can check is just a claim. You can't wait for next monsoon to test it, so GoNoGo can replay real Delhi storms hour by hour, using rainfall measured by IMD, and compare its warnings with the floods the news reported.
Rain isn't the same across Delhi, so each spot's rain is weighted by its distance to the IMD stations that recorded that storm (on 28 June 2024, Safdarjung got 228 mm while Ayanagar got 66 mm).


Storm | Floods reported in the news | Flagged "Do not enter" |
|---|---|---|
28 Jun 2024: wettest June day in 88 years | Pragati Maidan tunnel, Minto Bridge, ITO, Dhaula Kuan, Azad Market | 5 of 5 |
29 Jul 2025: Zakhira under ~6 ft of water | Zakhira, Minto Bridge | 2 of 2 |
31 Jul 2024: Ghazipur drowning | Ghazipur, Pragati Maidan | 2 of 2 |
8 Jul 2023: heaviest July day since 1982 | Minto Bridge, Pragati Maidan tunnel | 2 of 2 |
19 Jul 2020: Minto Bridge drowning | Minto Bridge | 1 of 1 |
Total | 12 | 12 of 12, 10 of them before the heaviest rain |
Two honesty checks are built into the app. First, because "it warned you early" can sound like cheating if the model peeks at the next hour, a toggle re-runs everything with rain gauges only, no forecast: still 12 of 12. Second, two of the twelve were flagged after the heaviest hour (ITO in 2024 and the Pragati tunnel in 2023), and the site shows that openly. The limits were also set before I added the 2023 and 2025 storms, so those two worked as an out-of-sample test.
And these are the real messages the deployed system sent during the 28 June 2024 replay: 🟡 Risky at 1 AM, 🔴 Do not enter at 2 AM, two hours before the heaviest rain.


What fought back
1. The forecast missed the cloudburst. My first plan was to replay storms with Open-Meteo's historical data. For 28 June 2024 it shows about 24 mm. IMD's gauge at Safdarjung measured 228 mm, 148.5 mm of it in three hours. Gridded models smooth away exactly the short, violent bursts that flood underpasses. So replays use IMD's observations, and this is precisely why the citizen photo layer exists: when the model is wrong, people on the ground correct it.
2. One bug silently broke every button. After deploying, the email sign-up on my site just said "Failed to fetch". Before every POST, the browser sends a CORS preflight (an Â
OPTIONS request). My API Gateway route was a catch-all  ANY /{proxy+} , so the preflight went to my Lambda, which answered 404, and the browser blocked the real request. Sign-ups, photo reports and replay alerts from the website were all broken, and my API tests hadn't caught it because they never came from a browser. The fix was a single  if method == "OPTIONS": return 200 . Lesson learned: test from where your users are.3. My AWS account had a few surprises. My new account only allowed one region, Sydney: calls to Mumbai returned an explicit deny from a service control policy. It also couldn't invoke Anthropic models on Bedrock. So the stack moved to ap-southeast-2, and the photo check uses Amazon Nova Pro, which returned clean JSON depth estimates on the first try.
4. India's SMS rules. Sending SMS to Indian numbers needs DLT registration, which takes far longer than a weekend. Telegram's Bot API plus SNS email gave me instant, free, Hindi-friendly alerts instead.
What it costs
At today's scale it runs for about $0 a month on the Free Tier. By my rough estimate at list prices, covering all of Delhi in a monsoon month (100k subscribers, 30k photo reports) would cost around $80 a month, or about $30 with a cheaper model and caching.
What it doesn't prove (yet)
- News reports don't give the minute a spot flooded, so lead time is measured against the hour of heaviest rain.
- Spots the news didn't mention can't be scored as false alarms.
- The limits aren't calibrated per spot, because drainage capacity isn't public.
- Photo depth is an AI estimate; the model is told to round up when unsure.
What's next
- Calibrate each spot with real water-level data; Delhi PWD has announced plans for SCADA pump monitoring and CCTV at underpasses like Minto Bridge.
- All 410 points, then Gurugram, Bengaluru and Mumbai, which have the same problem.
- An open data feed so map apps, news sites and traffic police can show the same go / no-go.
How I built it
I built GoNoGo solo over the hackathon weekend, using Claude Code as my AI pair-programmer for implementation. The problem research, the design decisions, the data checks and the testing (including getting real alerts on my own phone and inbox) were mine, and so were the dead ends.
Try it:  https://dq1ucov7xi7l8.cloudfront.net (open "Replay a past storm" and press Play)
Code: Â https://github.com/Vardhan-Mittal/gonogoÂ
Telegram bot: @Vami25bot
Sources: IMD press release (28 June 2024) and reporting by Scroll, Business Standard, National Herald, The Tribune, Deccan Herald, Gulf News and The Week. Links are in the repo README and on the site's "How we know" page.
#BharatBuildsTour #EnvironmentalHacks #WeMakeDevs #AWS #Serverless #ClimateTech
Enjoyed reading this content? Let the author know!
Your likes, comments, shares, and saves help creators reach more builders.
Loading recommendations
Loading article