Inspiration
In February 2021 Winter Storm Uri killed 246 people in Texas, according to the state health department's final report (DSHS, December 2021). In 25 of those cases the cause was a pre-existing illness made fatal by the outage: "disruptions to dialysis or oxygen treatment, the freezing of medical devices and medication ... or loss of power while on electricity dependent equipment required to sustain life." Another 19 died of carbon monoxide from generators, grills and heaters used in enclosed spaces.
Hurricane Irma, 2017: the CDC counted 129 deaths in Florida, Georgia and North Carolina, and tied 47 of them to power loss. Twenty were people whose existing condition the outage made worse (17 from heat, 3 on oxygen or other treatment that ran on electricity), and 27 more died of outage-related causes that were not a medical condition, 16 of them from carbon monoxide (MMWR 2018;67(30)). A study of 117 CPAP users in Miami found 78 of them (67%) could not use their treatment after the storm, for 4.3 days on average, and 71 blamed the loss of electricity (J Clin Sleep Med 2020).
Florida changed its rules after Irma, but for facilities. A nursing home must now hold 96 hours of backup power and keep rooms at or below 81 degrees (Fla. Admin. Code 59A-4.1265). Nothing covers the person living at home on a concentrator or a ventilator. HHS emPOWER's public service counts 2,995,272 Medicare beneficiaries with electricity-dependent equipment (sum of the state layer, September 2026 data), and that excludes Medicaid, private insurance and children. A Florida appeals court has also held that a utility "owes no common law duty to the general public to provide and maintain electrical service" (Rehab. Ctr. at Hollywood Hills v. FPL, 4th DCA, No. 4D19-1786, May 2020).
So the household is on its own, and the manuals that say how long a battery lasts are not written against a week-long outage.
What it does
Standby builds a readiness pack for one household. For each person and each device (oxygen concentrator, ventilator, CPAP, refrigerated insulin, generator) it shows how many hours of backup there are against the longest outage that county actually had, and marks the item Covered, Short, Gap or Check.
Three examples are pre-computed:
- Hollywood, FL, against Hurricane Irma. The Broward County record shows 136 hours with 10% or more of customers without power. Marcus's Inogen One G5 has two batteries: the manual says up to 13 hours, the pack plans on 6.5 and marks it Short. His stationary concentrator has no backup, a Gap. Doreen's CPAP has no battery, a Gap. The headline reads "Household lacks enough backup for a 136-hour outage."
- Austin, TX, against Winter Storm Uri. A ResMed Astral ventilator with one external battery (8 hours planned against an 80-hour outage record), and a generator running in the garage, which is flagged for carbon monoxide.
- Houston, TX, against Hurricane Beryl. A CPAP on a DC converter and insulin kept in a fridge, against a 175-hour record.
Each card shows the status, backup hours against hours needed, what the device needs, the gap, and actions you can tick off. A Do first panel gives the decision (here: leave for a powered location before the storm) and the ordered priority list. A Not on the list section names devices the household never mentioned but probably needs, such as a generator or spare oxygen cylinders, each with a reason. The Outage record page shows the county's real outage curve with the dates of the National Weather Service statements marked on it, the full list of those statements, and NOAA night imagery of the event. Run it and New household let you build your own household and get a live pack.
How I built it
FastAPI serves the API and a plain HTML/CSS/JS front end (no build step) with a console-style readiness layout. State is a few JSON files and a cache of the pre-computed packs.
The important design decision is what the model is not allowed to do. engine.py computes every status and every hour count in code: manufacturer runtimes (Inogen One G5, ResMed Astral, the AirSense 11 DC converter) against the EAGLE-I county outage record (ORNL/DOE, CC BY 4.0), counting hours with 10% or more of customers out. The planned backup is half the manual's best or typical figure, because the manuals give best-case numbers, and the pack says so.
agent.py then sends those computed facts to Nemotron 3 Super (nvidia/nemotron-3-super-120b-a12b) on Nebius Token Factory. Nemotron writes the requirement, the gap and the actions for each item, the stay-or-leave decision, the priority list, and flags devices missing from the household's list. It cannot change a status or a number. A number-hallucination guard checks the output and rejects any digit that is not in the computed facts, and a rejected answer triggers a retry.
The data had real traps. EAGLE-I coverage in 2017 is weaker than later years, single 15-minute readings can exceed the county's total customers (Broward, 11 September 2017) and are dropped, and the modelled customer totals for the North Carolina counties are wrong, which is why Helene is not an example. emPOWER suppresses small cells to a value of 11, which the app reads as "11 or fewer" and never prints as a count.
What makes it agentic
| Perception | Decision | Action |
|---|---|---|
| Household's devices, batteries and place; the county's outage record for a past storm | does computed backup cover the longest outage? | status per device, and a stay-or-leave decision when it does not |
| A generator "in the garage", or a device with no battery | what is the specific risk or gap here? | carbon monoxide warning; a battery-pack action for the CPAP |
| Equipment that is plausible for this household but absent from the list | what else should this person have? | adds it under "Not on the list" with a reason |
| Model output contains a digit not in the computed facts | the wording cannot be trusted | reject and retry, so the numbers on screen always come from code |
Accomplishments
- A readiness pack where every status and hour count is computed from a manufacturer manual and a real county outage record, not generated.
- A guard that makes the language model unable to invent a number, which matters when the output is a medical-device plan.
- Three households checked against real events, with the actual National Weather Service statements and outage curves shown beside them.
- Honest limits stated in the product: planned backup is half the manual's best figure, and the 2017 outage data is flagged as weaker coverage.
What's next
- Watch a live address: poll api.weather.gov (confirmed working, with 12 live alerts on 4 October 2026) and re-plan when a relevant statement arrives.
- Pull per-flow-setting runtimes for oxygen concentrators and the power draw of home dialysis machines, which I did not find in the manuals I had.
- Send the pack to a family member, and run the agent inside NVIDIA OpenShell so a medical profile can be kept on a sandboxed agent.
- Add utility medical-registration guidance once the utilities' own wording is captured.
Built With
- eagle-i-county-outage-data-(ornl/doe)
- fastapi
- hhs-empower-public-service
- national-weather-service-products
- noaa-and-nasa-outage-imagery
- nvidia-nemotron-3-super-on-nebius-token-factory
- plain-html/css/js
- python
Log in or sign up for Devpost to join the conversation.