Inspiration
The Savannah River is a state line, not a construction line. Dominion Energy South Carolina and Georgia Power plan transmission work just a few miles apart, often in the same years, but each one publishes its plans on its own, as long PDFs. Nobody lines them up. FERC even issued a rule in 2024 because utilities have historically planned in isolation. Sperry Tech's GridLock challenge asked me to fix that: find where two utilities' plans overlap in space and time, so they can share crews, equipment and outages instead of doing the same work twice.
What it does
GridPulse reads both utilities' public plans and tells a planner which cross-river projects they should be talking about first.
- A ranked list of opportunities. 39 DESC–Georgia Power project pairs within 25 miles, measured at the closest points between the projects and sorted into the challenge's tiers: T1 means they touch or share a facility, T2 is under a mile, T3 under five, T4 within twenty-five. Sperry's center-to-center distance is always shown next to mine, so you can compare.
- Coordination now. A second view ranks pairs on the latest published plans (DESC's 2026–30 list where it changed a date, and Georgia Power's 2025 IRP) and drops work that's already finished. Each result shows which plan version it came from and flags any date conflict. Eleven pairs are still ahead today. The top one is Jasper–Okatie and Goshen–McIntosh: 182 days apart, with the IRP and SERTP disagreeing on a date.
- A page number behind every fact. Every date, cost and name is quoted exactly as printed, with its document and page, and the tests check each quote against the PDF. Anything calculated says how, and anything that's an opinion is labelled as such.
- What changed between plans. 317 changes across three editions of DESC's list, Georgia Power's IRP tables and two years of SERTP plans: slipped dates, cost changes, renamed projects, and places where two sources disagree.
- Honest data quality. 41 spots where the sources contradict themselves or needed cleaning. When a substation can't be placed with confidence, it's left out instead of guessed: 204 endpoints are listed but not drawn on the map.
- A voice you can talk to (ElevenLabs). Press "Listen to briefing" on any pair and ElevenLabs reads a short summary built only from cited facts. Or click "Ask GridPulse" and just talk to it: ask abouroject, plan changes or dataquality, and say "show me pair four" to have it open on screen.
- A rough cost estimate (bofrom sharing right-of-way andcrew mobilizations, with every assumption visible and editable, plus a printable brief and a CSV export in Sperry's **My favorite finding: the . DESC's Hooks–Thurmond lineand two Georgia Power Evans–Thurmond Dam rebuilds all end at the same Thurmond substation. Sperry's method p apart; measured at theirclosest points, it's zero. The second pair isn't in the answer key at all.
How I built it
- Reading the PDFs: Pythoect out of DESC's lists andGeorgia Power's IRP. The parser checks the expected row counts, so if a format changes, it fails loudly instead of qu
- Finding the substations: names are matched against OpenStreetMap, and an endpoint is only placed when context ( line) confirms it. Everylocation carries a confidence label.
- Measuring: Shapely and points between projects;Sperry's center-to-center method runs alongside. Tiers, timing and ranking are simple, deterministic functions.
- The app: a read-only FastAPI backend, and a React + TypeScript + MapLibre frontend with a linked list, map and d
- The voice: ElevenLabs text-to-speech for briefings, and an ElevenLabs agent for conversation. The agent doesnIt can only answer by callingtools that read the live data, and the server hands it a short-lived session so the API key never touches the browser
- Testing: 212 backend, 86 unit and 60 end-to-end tests, run in GitHub Actions on every push. Deployed on Verce
Checked against the answer
Sperry gave six known overlaps. I use them only to check my work; none of their coordinates are used to place
- Distance math: using the answer key's own coordinates, GridPulse matches all six distances to within 0.01 mile
- Finding them independently: using only its own OpenStreetMap locations, all six pairs show up in the ranked l center distances differslightly because one substation (Okatie) isn't in OpenStreetMap, and I'd rather leave it blank than guess.
Challenges I ran into
- The documents contradict themselves. Georgia Power's dates don't always match between the summary table and columns sometimes don't add up to their own totals. One list prints April 31st. Project IDs get reused for different projects. Every one is loggedn answer.
- Substations have names, not coordinates. Lots of names match more than one place on the map, so a location is onl it up.
- I caught myself grading my own homework. An early version copied the answer key's coordinates into 11 projects,tly circular. I ripped that out and now report two separate, honest checks.
- **Keeping the voice honest.fident about things it doesn'tknow, so I gave it no knowledge of its own. Every answer comes from the same data the app shows.
Accomplishments that I'm p
- Finding every answer-key pair using only public data and independent locations.
- A top finding the answer kearing the Thurmond substation.
- Every fact on screen traces back to a page, and a test proves it.
- A live, working app where eautomated test.
What I learned
The hard part of utility coordination isn't the distance math. It's knowing where each fact came from and noticing wt's what makes a list of"nearby projects" something a planner can actually trust.
What's next
- Pair projects straight fromt just their updated dates.
- Add more utilities along the Southeast seam, starting with other SERTP members.
- Watch for new plan editionsoverlap or slip shows up.
- Let planners mark pairs as reviewed or contacted and share that across teams.
Disclosure
Built with Claude Code (Anthrll code was written for thisproject. An independent review with the Codex CLI flagged overclaims and data-integrity issues, which I fixed and cov are illustrative arithmeticwith editable assumptions, not forecasts.
Built With
- elevenlabs
- fastapi
- github-actions
- maplibre-gl
- openstreetmap
- playwright
- pymupdf
- pyproj
- pytest
- python
- react
- shapely
- typescript
- vercel
- vite
- vitest
Log in or sign up for Devpost to join the conversation.