Three days ago I ran Storm Recon against the Oregon wildfires as a dress rehearsal — nine real campgrounds, live federal data, no synthetic scenarios. The app got a lot right. It also did something that stopped me cold.
At Cottonwood Pit Campground, eight-tenths of a kilometer from a 67,000-acre fire that was 16% contained, sitting inside a Level 3 "GO NOW" evacuation zone, Storm Recon displayed:
What the app actually said
"ALL CLEAR — Watching 48 hr ahead"
Not a crash. Not a blank screen. A confident, sourced, completely wrong answer — and behind it, silence. No banner, no pill, no push. Crickets, next to a fire.
The reason turned out to be simple and a little humbling: we were asking the wrong authority. Storm Recon reads the National Weather Service, and the NWS is excellent — but it is a weather service. Evacuation is a law-enforcement act. A sheriff has no route into that pipe. On the day of the drill there were 486 active evacuation areas in Oregon covering nearly 18,000 people, and the number of them visible to any national feed we read was zero.
So last night's session had one job: go get that data.
That is not the story. The story is what happened on the way.
First, we went and looked
Before writing a line of code, we pulled the four state feeds live and read what was actually in them. That habit has saved us repeatedly, and it did again — it changed three decisions before they were made.
California's "active" feed had orders in it from 2023. Eight zones in Tulare County still flagged Evacuation Order, reason Flooding, last edited September 2023. A script republishes them every day so they look fresh. Nearly three years dead, and we'd have told someone to flee a flood that ended two presidencies of my truck ago.
Arizona had no timestamps at all. Not sparse — zero of 4,252 rows carried any date field. Nothing to age out, and no signal for when an order is lifted, which means a zone would sit at "GO NOW" forever. We cut Arizona. We're not in the business of cleaning up dirty data feeds, and I'd rather cover three states honestly than four badly.
And the obvious fix was wrong. My instinct was a simple rule: ignore anything older than 72 hours. Clean, defensible, and it would have suppressed 100 of Washington's 138 active evacuation zones — on seven fires that were still burning that night. Wildfire evacuations last weeks. A Level 3 order can sit untouched for ten days and be entirely in force.
That's a false negative in the fatal direction, which is exactly the error we're here to eliminate. So the rule became: fresh within 72 hours, or corroborated by an active fire nearby. We already download the federal fire perimeters. If a ten-day-old evacuation zone has a burning fire sitting inside it, that order is live.
One wrinkle worth savoring: the corroboration had to be geographic, not by name. Washington publishes the same fire as Sinhalekin and Silahekin; the federal record calls it SINLAHEKIN. Three spellings, one fire, one dataset. Matching text would have thrown away a real Level 3 zone over a county typo. Matching geometry doesn't care how anyone spells it.
Why we test against things that are happening right now
We do two kinds of testing on the reasoning in this app, and they find different bugs.
The first is replay. Drop a pin at a real place on a real date — a flood, a winter storm, a wildfire that already happened — and run the genuine archived federal record forward from that moment with no hindsight. Every run is exactly reproducible, which makes it the right tool for did we fix it, and did we break something else.
The second is live. When something is actually unfolding, we drop a pin in the middle of it and ask what the app would say to someone parked there tonight.
Replay is better at proving. Live is better at finding. An archive can only surface problems in the situations you thought to go looking for — you're grading answers to questions you already asked. A live event doesn't care what you anticipated. It hands you the messy, half-updated, inconsistently-spelled state of the world as it exists at 11 p.m. on a Tuesday, including the parts nobody wrote a test for because nobody knew they were there.
Every significant thing in this post came out of that. A six-day-old evacuation order that was still completely in force. Three spellings of one fire. A rule I'd have sworn was correct that would have hidden a hundred live orders. None of those were on anyone's list.
So when there's a real event running, we treat it as an opportunity rather than a headline. Last night there was one.
Dropping a pin in the middle of it
This isn't a mockup or a replay. We put the simulator at Bonney Crossing Campground in Wasco County, Oregon, and pointed it at live data.
The Grasshopper Fire was 0.7 km away. 39,439 acres, 20% contained as of August 6. Burning while we worked.
Bonney Crossing sits inside evacuation zone FR 27, Level 3 — GO NOW. And that zone's timestamp was 145 hours old — six days. Under my original 72-hour rule it would have vanished. Under the corroboration rule, the fire burning next to it kept it alive. The exact scenario I'd worried about in the abstract, happening for real, on the first night we ran it.
1. The dashboard
Where it used to say ALL CLEAR, there's now a red pill: EVACUATION ORDER — Your location is under a GO NOW order.
That's deliberately its own thing, not the normal "Take Action" alert. Those two sentences mean different things. One says we detected something. The other says an authority is telling you to leave. They shouldn't look alike.
2. The order itself
Tap it and you get the order, attributed to the body that issued it — Oregon Office of Emergency Management — with the zone designator, the county, and the fire's name. If what you see here ever disagrees with what an official tells you, they're right, and the card says so.
The one line in our own voice is the rig line:
The one line in our own voice
"Leave now. Don't finish packing — take what's already aboard and drive."
That's the whole reason this app exists for the people it's for. All three states use the national Ready / Set / Go ladder, and there's a strong temptation to collapse it to "leave / don't leave." We didn't, because the middle rung is where our user actually lives. Level 2 says leave now if you need extra time. A homeowner needs ten minutes and their keys. Breaking camp is forty-five minutes of stowing, disconnecting, and hitching. For a rig, "Set" is "Go." No generic alert app is going to tell you that.
3. Three ways out
Then the part the app was built for: three real destinations on real roads, ranked, with the reasoning shown. 129 miles, two hours sixteen, ending 107 km clear.
Getting here took one more fix. The first time we tried it, the app returned "No Safe Routes Found — shelter in place." One tap after telling the user a sheriff had ordered them out.
That is the worst sentence this app could produce, and it happened because a hardcoded string written for thunderstorms was reachable by every hazard. Our failure to verify a route is our limitation. It is never grounds to countermand an evacuation order. It now says so, and defers to the people who know which roads are open.
4. The detour
And this one is my favorite, because it's small and it's the kind of thing you only find by looking.
Same screen, an hour earlier. "107 km clear of storm." During a wildfire.
Storm Recon started as a storm app, and the word had quietly colonized the copy — four times on one screen, on every hazard we support. A heat dome told you to out-drive "the storm." So the noun became a variable: fire, heat, flooding, blizzard, smoke. For an evacuation it says "fire zone" — never "the fire," because the zone is drawn two to four times larger than the fire itself, and clearing an administrative boundary isn't the same as clearing flame.
While we were in there we added a fallback for when we genuinely don't know what we're looking at: "the hazard." Saying "storm" when you don't know is confidently wrong. Saying "hazard" is merely unspecific. That's the trade every time.
And the notification takes you straight there
One last thing from the same night, because it closes a loop.
We measured our own push notifications against every active alert in the country — 165 of them. The Weather Service's pre-written notification text, which we prefer whenever it exists, was present on one. The other 99% used our fallback, which listed every affected zone. Median length 119 characters. Worst case: 767, naming 36 zones, against a lock screen that shows about 120.
Half of all our notifications were being cut off mid-list — and the truncation ate the only actionable words in the sentence.
So the push now says "in your area." But that's only honest if the detail is one tap away, so the alert now travels with the notification: tap it and the app opens directly onto the card, with every area listed, the official instruction, and the effective window. Not the map with a pill at the bottom. The card, open, with the reason visible.
What this actually was
A session that was supposed to be "add three data sources" instead cut a state, replaced a data source, rewrote a safety rule, and found three bugs — every one of which we found by running the thing at a real place during a real fire, not by reading code.
Some honest caveats, because that's the deal. This ran on a simulator at a spoofed location, not on a phone in Oregon. The app half of this hasn't shipped to TestFlight yet. And Storm Recon still can't see most watches through push, which is a real gap we're working on.
But the headline is the headline. Three days ago, parked beside a burning fire inside a mandatory evacuation zone, this app said ALL CLEAR.
Last night it said GO NOW, told us who ordered it, and offered three ways out.
That's what a good session looks like. You rarely finish the thing you started.
We want more of these, and we need help finding them
Storm Recon is in public beta, and everything above is an argument for why that matters.
I found one pin. One campground, one fire, one state, on one night. It produced a cut state, a replaced data source, a rewritten safety rule and three bugs — and I'd been staring at this code for months.
The bugs weren't hiding. I just hadn't been standing in the right place.
There are a lot of places I'm never going to stand. A heat dome in Arizona in July. Ice on I-80 in Wyoming. A hurricane watch on the Gulf. Smoke drifting into the Northeast from fires in another country. Every one of those is a situation where this app will say something, and I don't yet know whether what it says is any good.
So if you're running the beta, the most valuable thing you can do is open it when something is actually happening near you — and tell us when it's wrong:
- Something it should have said and didn't. The ALL CLEAR bug is the whole category. If you know something about your situation that the app clearly doesn't, that's the report we want most.
- Something that reads strange for the moment you're in. "107 km clear of storm" during a wildfire was found by a human looking at a screen and going hang on. No test catches that.
- Advice that doesn't fit your rig. If it tells a 34-foot fifth wheel something that only makes sense for a car, we'd like to know.
- A route that looks wrong. Even a hunch. Especially a hunch — you know your roads better than our geometry does.
You don't need to diagnose anything. "This looked off, here's where I was, here's what it said" is a complete and genuinely useful bug report. A screenshot and a rough location is plenty.
Every one of the fixes in this post started as somebody noticing something looked wrong. More people in more places is, quite literally, the testing strategy. The app gets better in proportion to the number of real situations it gets held up against — and the situations we haven't seen yet are the ones I lose sleep over.
If it ever tells you all clear when it shouldn't, I want to hear about that one first.