Inspiration

A portable oxygen concentrator on continuous flow runs for under an hour on battery.

Georgia Power tells customers to prepare for three days without electricity. Their entire published guidance for medical equipment is a single line: "Keep your phones and medical devices charged."

Those two facts don't meet. After Hurricane Helene, parts of Augusta were dark for nine days. Richmond County alone has 1,647 people who depend on electricity for medical equipment.

We wanted to know whether anyone was tracking what happened to them. So we read Georgia Power's $912 million storm cost recovery case at the Georgia Public Service Commission — Docket 44280. All 34 data-request response files, the May 2026 stipulation, and the Commission's order.

The words medical, ventilator, oxygen, and vulnerable appear zero times in the entire proceeding.

We found other things in there. Georgia Power evaluates whether its outage map is working by measuring social media sentiment — 78.5% positive. Their storm prediction and restoration-estimate system wasn't in production during Helene. They track income-qualified customers monthly and estimate 115,000 more are eligible, so the capability to track a vulnerable population clearly exists. And there's a funded program that reimburses $450 for a storm-damaged meter box.

There is nothing equivalent for a household that can't power a ventilator.

We wrote to two organizations to check whether we were misreading the situation.

The Georgia Council on Developmental Disabilities, a state agency, replied:

"Georgians who depend on ventilators and other electricity-dependent equipment can and do die... Georgia has no coordinated protocol to identify these residents, reach them, or get them to power in time."

Tools for Life at Georgia Tech's Center for Inclusive Design & Innovation replied about why battery runtime specs vary so wildly:

"No one would like to give any hard numbers as to how long a life-sustaining device WILL run on batteries."

That second answer changed our design. We stopped trying to predict when equipment fails.

What it does

WATTLINE does three things, in order.

Identify. The federal government already publishes who these people are. HHS emPOWER reports counts of Medicare beneficiaries who depend on electricity for medical equipment — but only at ZIP code level. A ZIP can cover a senior housing tower and a golf course, which makes it too coarse to act on. We redistribute those counts onto Atlanta's 25 Neighborhood Planning Units using a dasymetric method weighted by housing units and tract-level senior and disability rates. Georgia's published total is 92,233; the ZIP files sum to 92,567 because HHS masks small cells, so we treat every masked value as the interval [1, 11] and test that the state anchor falls inside the resulting band [91,897–92,567]. It does. Metro Atlanta comes out at 2,513 people across 25 neighborhoods.

Measure the exposure gap. This is the part the Georgia Tech answer forced. We do not predict clinical failure. We subtract: the utility's own restoration estimate minus the manufacturer's published minimum battery runtime for the device classes actually counted in that neighborhood. Two published numbers, one subtraction. Because every factor the specialist named — partial charge, battery age, defects, deep discharge — pushes real runtime below spec and never above it, using the published minimum makes our gap the optimistic case. The real gap is wider than the one we show.

Reach. Charging capacity at 90 public facilities — libraries, fire stations, rec centers — assigned to the neighborhoods that run out first, weighted by households with no vehicle. Supply is constrained by MARTA reachability, because a site no bus serves is not a site. Seven of the ninety fail that test and grey out.

Scrub the timeline and the map moves: everything safe at hour zero, seventeen neighborhoods critical by hour six, all twenty-five at hour nine, then recovery as restoration lands.

How we built it

Python ingest → precomputed tables → a read-only FastAPI service → React and MapLibre GL, deployed on Render.

One rule shaped the architecture: precompute everything, the API only reads. Nothing computes while a judge is watching. Every pipeline stage writes its own output, so a later stage failing still leaves a demo-able product. The whole 25-hour exposure series ships as a single endpoint, so the timeline scrubber makes zero network calls while you drag it.

The other rule was one coordinate system, set at ingest, never at a join. emPOWER ZIP geometry arrives in Web Mercator, which is not equal-area — a projection mismatch corrupts a spatial join silently, with no error, and that is the worst class of bug to find late.

Data: HHS emPOWER (711 Georgia ZIPs, per-device fields), City of Atlanta DPCD NPU boundaries, Atlanta Regional Commission tract demographics, Census TIGER tract polygons, MARTA GTFS (7,057 stops), and published manufacturer runtime specs.

Infrastructure: a Render Blueprint deploys the API and the static frontend together, both auto-deploying from main. The ingest pipeline also runs as a Render Workflow, which is an honest fit rather than a bolted-on one — emPOWER refreshes monthly, so a re-runnable fetch-and-verify DAG is what this project would genuinely need in production.

Challenges we ran into

The data fights you in ways that don't raise errors. emPOWER breaks out device classes separately, and one person can hold a ventilator and a power wheelchair — so summing device fields double-counts people. Implanted cardiac devices run on internal batteries and don't fail when the house loses power, so including them would be a clinical error. And ZIP Code Tabulation Areas don't nest inside counties: only 109 of Georgia's 159 counties reconcile. We conserve against the state total instead.

We caught our own disaggregation being fake. A mid-build review found the per-NPU estimate was a trigonometric function of NPU area and letter, and the "conservation check" was a hardcoded print statement that summed nothing. It looked right and was meaningless. We rewrote it against the real ZIP-level DME and backed it with 18 tests.

A deployed demo drifts from your laptop. We found the exposure series still carrying old numbers after the disaggregation was rewritten — every neighborhood reported a different population in two panels of the same screen, live on the deployed site. Precomputed data is fast, but it is only correct if every stage is regenerated together.

Accomplishments that we're proud of

We filed a public records request with Fulton County and a formal inquiry with the Georgia PSC to test our own finding through official channels rather than asserting it. Both are on the record.

And two independent organizations — a state agency and a Georgia Tech assistive-technology program — described the same gap in their own words before seeing our architecture. "No coordinated protocol to identify these residents, reach them, or get them to power in time" is a description of the three layers we built, written by someone who had never seen them.

What we learned

None of us had done geospatial disaggregation before this build. Dasymetric redistribution under a conservation constraint, suppression intervals, and CRS discipline were all new, and they were the hard part.

The larger lesson was about restraint. The most defensible design decision we made was one we chose not to build: we had every input needed to run a Monte Carlo over device failure times, and it would have demoed well. But a simulation over unmeasured priors just renders your assumptions back as output. A subtraction of two published numbers cannot be called fabricated. Being told by a practitioner that nobody in the field will commit to a runtime number is what confirmed that a subtraction was the only honest thing to ship.

What's next for WATTLINE

Ground truth. Right now the device mix comes from claims data — "filed a claim in a lookback window," not "currently uses." The next layer turns the estimate into a measurement.

There is also a real destination for this. The Commission's August 2026 order requires Georgia Power and PSC Staff to meet on storm-response best practices and file a report by June 30, 2027. That process is open and currently has no vulnerable-customer input.

Limitations we state up front

emPOWER is Medicare-only. It excludes private insurance, Medicaid-only, military coverage, and long-term care residents, and undercounts disabled people under 65. 92,233 is a floor, not a ceiling. The output is a scenario-based neighborhood priority surface, not a claim about where specific individuals live. And WATTLINE does not touch utility restoration order — a crew on a feeder restores three thousand customers while the same crew on a lateral restores one house, and that ordering is correct. We use a different resource pool entirely: buildings, not crews.

Built With

  • arc-acs
  • atlanta-dpcd
  • census-tiger
  • fastapi
  • geopandas
  • hhs-empower
  • maplibre
  • marta-gtfs
  • pandas
  • python
  • react
  • render
  • shapely
  • uvicorn
  • vite
Share this project:

Updates