A Single Pane of Glass
On typhoons, dams, and the awkward business of joining up data that nobody ever joined up. The Philippines publishes river gauges, dam bulletins and spillway notices — just never in the same place, and never at the same time. So after being stuck in the floods myself, I built Baha Manila — the view I wanted in my hand the moment the national alert lands. One screen, one watershed, official and derived kept honestly apart. It is free, it is experimental, and if anyone with the mandate wants it, it is theirs.

On typhoons, dams, and the awkward business of joining up data that nobody ever joined up.
A companion piece, of sorts, to The Lights of Manila — that one was about the storm as metaphor. This one is about actual rain.
I have not been in Manila long — days, not weeks — but I arrived in the middle of typhoon season, which is an education you cannot get from a briefing document. You learn that rain of sufficient enthusiasm stops sounding like weather and starts sounding like machinery. You learn which roads are roads and which are, on reflection, temporary rivers — and that the difference can be waist-deep in places. And you learn — this is the part that stayed with me — the peculiar helplessness of the moment just after the national alert lands on your phone.

This week, on the road outside. Technically, still a road.
Because the alert is the easy part. The alert works. Your handset buzzes, the government tells you a storm is coming, and it is right. Then comes the harder question, the one nobody has answered for you: what does that mean for the street I am standing in?
The gap between the alert and the answer
To answer it, you need to know several things more or less at once. How high is the river, and is it rising or falling? What are the dams upstream doing? Is anything spilling? When was any of this last actually measured, as opposed to last displayed?
Every one of those facts exists. The Philippines publishes them. PAGASA puts out river-gauge readings and dam bulletins; the civil defence offices publish spillway bulletins; local government units post their own updates. This is not a country short of data.
The trouble is that the data lives in separate rooms and does not speak to itself. River levels sit on one page in one format on one refresh cycle; dam bulletins on another; the spillway at Upper Wawa somewhere else again, in prose, on social media, at whatever hour someone types it up. To assemble a picture you must open half a dozen tabs, hold four numbers in your head, and perform a small act of hydrology — while, ideally, packing.
So I built the thing I wanted to have in my hand: one view. A single pane of glass showing the flooding, the dams and the other statuses together, for the moment right after the alert arrives.
It is called Baha Manila. Baha is simply the Tagalog for flood, which felt like the right level of ambition for the naming exercise. The public page — Manila Flood Monitor — is at agrisphere.asia; the iOS and Android app is in TestFlight while it earns its keep.

The preview build — the iOS and Android app, running in a browser. One screen, one watershed, the disclaimer nailed to the top of it, and, at the bottom, the line I care about most: how old the number actually is.
Water does not negotiate
The catchment I started with is the Marikina watershed — Rodriguez, then San Mateo, then Marikina, then Pasig. A watershed is really a machine for turning rain into a river, and its great virtue, from the point of view of anyone trying to warn people, is that it is ordered. What happens upstream arrives downstream, and it does so with a delay you can use. Water is indifferent to politics, jurisdiction and the boundaries of a government agency’s remit. It simply proceeds downhill on a schedule of its own devising. That indifference is precisely the thing a joined-up view can exploit.
Two details will tell you why the joining-up is more delicate than it sounds.
The first: Upper Wawa has no floodgates. It is an ungated stepped spillway, which means nobody decides to release water — beyond a certain level, the reservoir simply overtops and the water comes over the lip. There is no “gates opened” moment to report, because there are no gates. Model it wrongly and you will describe a decision where physics is all that occurred.
The second is subtler and, I think, more important. When telemetry from a gauge stops arriving, the published table does not go blank. It carries the last known value forward, marked with a small asterisk. Read carelessly, a dead sensor looks exactly like a river sitting perfectly still. On the day I was building this, two Marikina stations were frozen above their Critical threshold — not because the water was there, but because the instruments had stopped talking. Any system that treats those numbers as current is not merely unhelpful; it is dangerous in both directions at once.
The honest response is to treat silence as information. If the data has stopped, the screen says so, in plain language, with the age of the last real reading. A reassuring green screen built on stale numbers is the worst possible output.

The bit I am proudest of is the least impressive-looking thing on the screen: “Walang datos o luma na” — no data, or stale. The app would rather admit it is blind than pretend it can see.
The rules it holds itself to
It alerts on changes — a threshold crossed, a state altered — not on every routine reading, because an app that cries wolf hourly has trained you to ignore it by the time it matters.
Every line is labelled as either official or derived. If PAGASA says a station is at Critical, that is what you see, and nothing the system calculates is ever allowed to soften it. Where official status and its own arithmetic disagree, the official reading wins.
And it is emphatically not an official warning service. It says so at the top of every screen and again at the bottom, and it cannot be dismissed. It is not run by PAGASA, the NDRRMC, the MMDA or any local government, and it can be wrong, late or silent. Check the official channels; do what your barangay tells you. When they say evacuate, evacuate — whatever any app says, mine included.

Most products bury the disclaimer in a footer. This one gets its own postcode.
It is free, in both languages, with no account, no login and no advertising. A sign-up form between a person and a flood warning is a design failure. Losing your phone means losing your saved pins, and that is a trade I will take over holding anybody’s personal data.
“Both languages” means the whole thing, not a token menu somewhere — headline, warnings, threshold names and the disclaimer all flip to Tagalog together, because a bilingual product that reverts to English at the frightening part is not bilingual.


Same screen, same numbers, FIL selected. My Tagalog is worse than my five-year-old’s, so this is machine translation with human review — corrections gratefully received.
Built in a day, which still feels like cheating
The obvious question, and the one I would ask: how does a thing like this exist by Tuesday?
The honest answer is that I ate my own cooking. I wrote a full specification first — properly, before a line of code, because the spec is where the thinking goes and skipping it is how you end up with a beautiful app that models a spillway as a decision. Then I handed it to CodeEasy in AutoCode mode and let the autonomous build run against that spec, with the stage gates doing what stage gates are for.
Then Claude Code — on Fable — went over the result with a deep debug scan: hunting the logic errors, the edge cases, the places where a stale reading could quietly present itself as a live one. After that, a few manual edits by hand, because there are always a few manual edits by hand, and anyone who tells you otherwise is selling something.
Prototype, end to end, in a day. I have been building software for thirty years and I find that genuinely mind-blowing. I would add only that it was a very long day, and that “built in a day” is doing a lot of quiet work to hide the years of judgement about what to put in the spec in the first place. The speed is real. It just isn’t free.
Which brings me to the confession. I am in the middle of a paid assignment with an exceptional client in the UK, and a day is precisely what I could not afford to lose — on top of the days already lost to sitting in the floods. I diverted it anyway. I could not not do it. So if a certain person is reading this: I am sorry, it was for a good cause, I am back on the assignment backlog at full steam, and thank you for your patience.
Two days ago, up to my waist
I would like to claim this was a considered piece of product strategy. It was not. I built it because a couple of days ago I was stuck in the floods myself, in the tail of the most recent typhoon — waist-deep in places — watching the people around me struggle. And it was not the first time. I have seen it happen again and again.

Not a mock-up. My own phone, twenty-to-midnight, the actual river.
What gets me is how much of that struggle is avoidable, and how ordinary the reasons are. People did not know where to look. Or they looked, found something, and by the time they had pieced it together it was already too late to act on. That is not a failure of courage or of care. It is a failure of plumbing, in the informational sense.
And then you watch a family fight their own house. Furniture up on blocks, a fridge going for a swim, someone bailing out a living room with a paint tin at two in the morning, again. It is destroying to watch. The worst part is how normal it has become — nobody is even surprised any more. That is the bit that should not be normal.


These two are not from this week. They are from July 2024 — a different storm, the same gate, the same water, the same brown line up the wall. That is precisely the point.
I cannot stop the rain. Nobody can, and anyone offering to should be asked to leave. But if a simple piece of technology buys somebody thirty minutes they would not otherwise have had — enough to move the fridge, the papers, the grandmother — then it is worth building. That strikes me as a rather good thing to be able to do with a laptop and a stubborn week.
It is a tiny thing set against what a great many Filipinos endure, and what a great many people endure in a great many countries, every monsoon and every storm season. I am not pretending otherwise. But small and real beats large and theoretical, and this was the one I could actually finish.
The one thing I actually need
There is a single thing standing between a good prototype and something people could genuinely rely on, and it is not money, hosting or headcount. It is one integration: the PAGASA river-gauge telemetry feed, live, as data.
I can scrape it. I did scrape it — there are fallback scrapers in there right now, and they got me through testing perfectly well. But a scraper is not a foundation. It is a promise you cannot keep: the markup changes on a quiet Tuesday and your flood app goes silent on the loudest night of the year. Fine for a prototype. Not fit for something a family is supposed to trust at two in the morning. If this is going to be a robust product rather than a clever demonstration, the water levels have to arrive as a feed, not as a guess about somebody’s HTML.
So: machine-readable gauge readings, with an honest timestamp on each one and a way to tell a live value from a carried-forward one. It does not have to be elegant. JSON, CSV, a scheduled drop — anything with a schema and a heartbeat and I will build against it happily. The dam and spillway bulletins would be a lovely second course, but the gauges are the meal.
Give me that and the app is good. Not finished forever, but trustworthy enough to put in front of people who need it. Everything else — the design, the alerting, both languages, the hosting bill — is already built and already paid for.
So let’s speak. Let us make some magic happen. Salamat.
Take it
This is not for profit and never will be. It is experimental, it covers one watershed, and it is nowhere near everything it should be. You can see it at agrisphere.asia, the app is in TestFlight, and the full documentation is written up at thejustinjames.github.io/baha-alert-docs — the spec, the sources, the honest caveats, all of it.
But if there is somebody in the Philippine government — PAGASA, the NDRRMC, a city DRRMO, anyone with the mandate and the appetite — who wants this, it is theirs. The whole thing. No strings, no invoice, no consultancy attached. It belongs in the hands of the people who already carry the responsibility.
And if you are not in government but you are reading this and something in it caught you — come and help. I would very much like this to stop being a working example and start being a thing people actually use. Honestly, it is probably only another couple of days of work to get it properly polished and out of the door: the hard thinking is done, what is left is finishing.
After that it needs a small team more than it needs a genius — a few people to keep it running, watch the sources, answer the messages, and then, if it earns the right, extend it watershed by watershed across the country. That is not a moonshot. It is maintenance, discipline and somebody caring on a Tuesday. Designers, Filipino speakers who can fix my translations, people who know the agencies, anyone who has stood in the water and thought this should be easier — all welcome.
If it works, it makes a real difference to real lives. That is a rare thing to be able to say about software.
Get in touch, or find me on LinkedIn. I will hand it over gladly, or build it out with you — whichever gets it into more hands.
If it saves one life, it has done its job. Everything after that is a bonus.

Meanwhile, the country carries on regardless, and does it with better jokes than the rest of us.
Sharing the love.