Inspiration
On January 9, 2025, an evacuation warning meant for a few Los Angeles neighborhoods reached about ten million phones across the county, and kept echoing into the next day. The desk that sent it found out from the people calling in. The day before, warnings reached parts of west Altadena hours late. The deaths were on that side.
Too loud, or too late. Nothing in between.
We built for the person at that desk at 3:40 in the morning: the overnight supervisor of a city alert line, with too few people, a flood of unverified calls, and two bad options. Wake everyone, or wait for someone who is not there.
And 55.1% of LA County speaks a language other than English at home. The people most likely to be missed are the ones who most need a person.
What it does
VoiceFlare calls every home in a danger zone, in that home's own language, and tells the city who needs help.
It works on a ladder of five steps. Each step says what the system may do, and the one thing it may never do.
| Step | What it does | What it never does |
|---|---|---|
| Watch | Models suggest which zone is next, drawn as dashed lines | Never calls anyone |
| Ask | Calls the homes nearest the fire first, each in its own language | Never invents an instruction |
| Slow | Shows how many phones the send will wake, before it rings | Never hides that number |
| Hold | 90 seconds. Four neighbours at the far edge are asked what they can see | Never blocks a send |
| Hand off | Medical, panic, refusal or doubt goes to a real person | Never says anyone is safe |
The hold is the part nobody else has. Before an evacuation order goes out, the line holds for ninety seconds and prices the action on screen: "Wakes about 9.8 million people. That is 239 times the zone. Check the polygon." Four enrolled neighbours at the polygon's far edges get one question: does this match what you see? Quorum is two answers. Silence is an abstention, never a No. At 0:00 it sends on time. The machine can delay an alert. It can never stop one.
The canary. Fifteen seconds after the send, a phone just outside the zone is asked whether it received anything. A "yes" outside or a "no" inside is a delivery failure. That is the mechanism that would have caught January 9.
Who needs a person. A help list with each person's need and where they were last heard. Van runs send wheelchairs and oxygen to accessible vehicles first. A block that goes quiet becomes a silence cluster and a printable door-knock sheet. We do not rescue anyone. We hand the response team a list.
A ledger. Every human decision and every refusal is logged with a time. When a caller asks for an ETA, or whether it is safe to stay, the agent says it does not know and offers a person, and that refusal prints on the same screen as the actions.
The same screen on an ordinary Tuesday. Campus safety before an alert. Senior living and home health running daily multilingual check-ins. Those quiet calls are what make the emergency call fast: the list, the languages and the notes are already warm when the order drops.
How we built it
Next.js 16 and TypeScript, with one storage interface over either Supabase or a local file store. The engine (dispatch queue, holds, canaries, registry, simulator) advances on each board poll, so it needs no long-lived timers and runs fine on serverless.
- Claude Haiku 5.5 runs the in-call turns against strict tool schemas.
- Claude Sonnet 5.5 classifies every finished call with structured output and reconciles it against what was confirmed during the call. "Needs help now" always surfaces, whatever the confidence score.
- Retell AI carries the same prompt and the same tools over the phone network. A browser phone page is the fallback transport and the path for deaf and hard-of-hearing callers.
- IBM Bob [one line: say what Bob helped you build].
The agent has seven tools and no others: record_status, report_hazard, request_human, end_call, lookup_zone, read_observation, received_alert. There is no tool to change a zone, send an alert, give an ETA, or say where another person is. The limits are enforced by the tool list, not by asking the model nicely.
Real data, not guesses. Live wind and active alerts from the National Weather Service, fire detections from NASA FIRMS, quake feeds from USGS. Leaflet and Turf for geometry. CAP 1.2 and GeoJSON feeds so a response team can pull everything into their own ArcGIS map.
The three twists, built in
Twist 1, government money. NSF SBIR Phase I (NSF 26-510), up to $305,000, no equity, Project Pitch first. Counties buy with FEMA UASI and EMPG grants, because public alert and warning systems sit on FEMA's Authorized Equipment List. DoD SBIR and DIU for installations. What changed in the build: an /evidence page that measures the Phase I milestones live from the run.
Twist 2, make it global. The product does not change. Six adapters do. Fixed everywhere: a named human approves, the edge is asked, the dose shows, the hold sends on time, a canary checks delivery, every decision is logged. Swapped per country: the ladder words, the decider, the emergency number, the public channel, the AI model, and privacy and maps. What changed in the build: a Chongqing scenario on China's own ladder, where colour warnings are hazard levels and only a relocation order (转移指令) moves people, calls say 119, the sentinels are the grid workers China already asks to acknowledge (叫应), and maps use GCJ-02 under PIPL consent. Japan, Greece, India and Australia are profiled too.
Twist 3, poster it. The app draws its own poster from the same live data as the board, then exports it for print. What changed in the build: print export in the product, plus a collections line so museums, libraries and archives can ask for help moving what cannot be replaced, asked once at Warning only and never above a person.
Challenges we ran into
Binding the agent to a human approval without making it useless. The agent may say "leave now," but only by reading the exact directive a named person approved for the zone that phone is in. Getting that boundary right took most of the design.
Making silence mean something without making it a No. A sentinel who does not answer is an abstention. A block that stops answering is a signal about the network, not about the people. Those are different things and the board has to show both.
Keeping the demo honest. Every resident is synthetic and labelled. Every broadcast send is simulated and reaches no real alert system. The metrics count real phones only. It would have been easy to fake a bigger number.
Accomplishments that we're proud of
The whole path runs end to end: approve a zone, edge-first calls, a life-safety caller surfaced at priority one, a linked contact accounting for a neighbour, a hold opened on the wrong polygon and caught by a sentinel saying "nothing here," an edited polygon, quorum inside ninety seconds, a simulated send, a clear canary, the order relayed, and a silent block flagged as a possible tower loss.
Measured live from the run:
- Zone approved to first phone ringing: under 60 seconds
- Hold opens to two sentinel answers: under 90 seconds
- Call ends to a help row on screen: under 15 seconds
- 9 of 10 scripted calls classified correctly, across three languages
And it is deployed and running, not a slide deck: voiceflare.vercel.app.
What we learned
The hard part of emergency AI is not talking. It is deciding what the machine must never do on its own, and then showing that on the screen next to everything it did.
Responsible use
How this could be misused: a wrong or compromised zone directive would be relayed to everyone inside it, a colluding sentinel panel could delay a real warning, and the help list holds real people at real locations.
What limits it: the agent reads only the directive a named human approved for the zone the phone is in, and can change nothing else. The hold is capped and never blocks a send. Every refusal and every human decision is in the ledger. The help list stores phone, zone, need and last location, is visible only to the response team, and is purged 72 hours after the incident closes. The agent never asks for personal, medical or payment details, and never asks anyone to stay put or go look at a hazard.
What's next for Voice Flare
Built for fire today. Earthquakes with shelter in place, floods with move to higher ground, and tsunami where minutes decide, all on the same engine. A quake or a flood changes the words on the screen and who decides. The calls, the hold, the check and the help list stay exactly the same.
Then NSF Phase I, to prove the ninety-second edge read, multilingual distress classification and the canary, in drills with campus safety. After that, one county zone, real phone lines at scale, logins and an audit trail.
Team ShipHappens.
Built With
- anthropic
- claude
- esri
- geojson
- ibm-bob
- leaflet.js
- nasa-firms
- next.js
- node.js
- nws-api
- openstreetmap
- postgresql
- react
- retell-ai
- supabase
- tailwind
- turf.js
- typescript
- usgs
- vercel
- web-speech-api
- zod
Log in or sign up for Devpost to join the conversation.