Inspiration

All water utility's annual quality reports are 14 pages long. After reading one twice, I still couldn't answer the only question that matters: is the water safe? The EPA has collected 30+ years of drinking-water data on nearly every US water system; violations, contaminants, enforcement actions; and almost none of it is readable by the people actually drinking the water. Roughly 50 million Americans are served by systems with recent violations, and most have no idea.

Then my friend pointed out something better: water that's perfectly legal for humans can kill fish overnight. Chloramine doesn't gas off like chlorine does. Nobody tells you that either.

What it does

TapCheck turns your ZIP code into a plain-language water quality report card in ~10 seconds.

  • Letter grade + summary for your water system, built from live EPA SDWIS data
  • Per-contaminant cards: what it is, health effects, whether legal limits were exceeded; every claim cited to the underlying EPA record
  • Filter recommendations: activated carbon vs reverse osmosis vs "you don't need one"
  • Not just for humans: a dedicated tab for fish (chlorine vs chloramine, conditioner advice), plants (fluoride-sensitive species), and pets
  • Honest empty states: clean bill of health is a first-class experience, and when the data doesn't cover something, TapCheck says so and points you to your utility's report

How we built it

Built end-to-end with Codex using GPT-5.6 during Build Week.

  • Pipeline: Next.js app; server routes query EPA Envirofacts (GEOGRAPHIC_AREA → PWSID → WATER_SYSTEM + VIOLATION), with aggressive caching because federal APIs have federal response times
  • GPT-5.6 as the interpretation layer, not a chatbot: structured outputs (JSON schema; grade, summary, contaminants[], citations[]) turn raw violation codes into readable reports. Every generated claim must reference an EPA record ID, which the UI renders as citations; that's our anti-hallucination guarantee on health-adjacent content
  • Codex did the heavy lifting: it reverse-engineered Envirofacts' quirky, inconsistently-documented response formats, scaffolded the entire EPA client, and wrote the structured-output schemas. [Add your best specific Codex moment here; the session where it saved you hours.]

Challenges we ran into

  • EPA Envirofacts returns XML or JSON depending on how you phrase the URL, with undocumented quirks per table. Codex probed the API iteratively and pinned down a reliable client faster than reading the docs would have
  • Making health information trustworthy: we chose grounded citations over fluent prose; GPT-5.6's structured outputs made "no claim without a source record" enforceable in code
  • [Your real hardest bug goes here]

Accomplishments that we're proud of

A complete product, not a proof of concept: shareable report URLs, designed empty states, live deployment, and a feature nobody else has; telling you whether your tap water will kill your goldfish.

What we learned

Public data isn't open data until it's readable. The gap between "published by the EPA" and "understood by a human" is exactly the gap GPT-5.6 closes; as long as you ground every output in the source record.

What's next for TapCheck

Email alerts when new violations hit your system, historical trends, and a national map of the systems that need attention most.

Built With

Share this project:

Updates

posted an update

Two lessons from one weekend: → Verify agent output at the source (that's how I caught the false Chicago clean-bill) → Sometimes a failed experiment is the strongest validation of what you already built The branch stays parked, unmerged: a completed negative result turn positive lol. tapcheck-nine.vercel.app

Log in or sign up for Devpost to join the conversation.

posted an update

Follow-up to the goldfish-and-Chicago saga: I tried to make TapCheck fully independent of EPA's live API by ingesting their official bulk dataset. One zip file, whole country, 49,378 active water systems. Pipeline worked first try.

Log in or sign up for Devpost to join the conversation.