Atharva Dnyanmote
Menu
Résumé ↗
NorthQuad x 120Water · Predictive Modeling

Predictive Modeling.

9.2 million US homes still have a lead pipe. Every utility must know exactly which ones by November 2027, then replace them all within a decade. I built a self-serve tool that turns 120Water's internal lead science into something any utility can run on its own.

Nov 2027Federal EPA Deadline
9.2MUS Homes on Lead Pipes
$105KAvoided, One Utility
95%Model Recall, 2M+ Records
My Role
Sole UX Designer
Platform
Desktop Web App (utility portal)
Timeline
10+ Weeks · Ongoing
Tools
Figma · Claude · HTML/CSS/JS

The real thing. Not a screenshot.

Every screen below is fully interactive, built conversationally, 41 versions in. Best on desktop.

predictivemodeling-weld.vercel.app
Open in new tab ↗
The Stakes

Lead pipes don't sit under every home equally.

Lead pipes cluster in older, lower-income communities. That's why federal funding is earmarked for these systems specifically, not a bonus, a requirement.

Budget doesn't change the deadline.

Lead vs. copper service line comparison
The Problem

The science existed. Nobody outside 120Water could touch it.

120Water already had a model that could score every unknown line. It just lived outside the product: CSV exports, manual review, a re-upload, run by a person, one utility at a time.

Real machine learning, wrapped in a white-glove service that doesn't scale to every utility racing the same deadline.

Four testing sessions. The same three problems, every time.

We started with a number. Show a utility their model score, they'd know where to send crews. Two customers and two internal reviewers tested that bet. The same three problems showed up anyway.

01
A percentage means nothing alone
"69%, 97%, what does that tell me?" The free tier now shows likely lead, inconclusive, or likely non-lead instead.
02
Nobody trusts "accept all" right away
Every tester reviewed lead records one at a time, bulk button or not.
03
"Updated" reads as already done
Two testers assumed "updated" meant saved. Nothing commits until the final step.

Small team. Real deadline pressure.

The same person showed up every time: a non-technical utility employee, wearing several hats, no data science background, and no budget to hire one.

Utility field operator in the field

It sucks to review 700 lines, but I'd rather take the time to review them one at a time than mess up 700 locations.

Internal Product Discussion, on why bulk actions stay off by default for high-risk data

Not an interface problem. A trust problem.

A wrong call sends a crew to the wrong yard, or skips the one with lead. Automate where a wrong call is cheap. Make someone say yes where it isn't.

Three areas. One self-serve platform.

Each area replaces a manual step. Data Quality Review carries all three findings above and shipped first, on purpose. It helps every customer, not just the ones who pay for the planner.

📊
Inventory Dashboard
Materials, data quality, and lead prediction, in one widget row.
🧿
Data Quality Review
Three checks 120Water used to run by hand for every customer, now something a utility runs itself.
🗺️
Verification Planner
A guided path from messy data to a prioritized field plan.
The Design

Three rules governed every decision.

Never say "predictive" to a free customer. Hover to reduce complexity, never to remove information. One color means one thing, everywhere. Everything else followed from those three.

Data Quality Review

A utility can't fix what it can't see. So the checks come first.

Three checks gate the planner: real addresses, real coordinates, real build years. Fail one and it stays locked, the same checks 120Water used to run by hand, now self-serve.

Data Quality widget on the Inventory dashboard, showing Street Name Validation and Geocode Validation as Failed and Update Year Built and Schools and Childcare as Needs Attention, sorted by severity
Check 1 of 3 · Street Name Validation

An address a computer can't read breaks every check that runs after it.

"WATER TOWER" isn't a street name. Neither is a rural route with no house number. Both show up in real inventories, and both used to silently break every check downstream.

Suggest, never auto-apply. A person still approves, edits, or deletes each one.

Street Name Validation drawer listing addresses that could not be matched to a standard street name, including a highway route reformatted to US-50 E and a rural route with nothing extracted, each with edit, approve, and delete actions
Check 2 of 3 · Update Year Built

Sometimes the year a pipe went into the ground is the only evidence you need.

Lead pipe stopped being legal in 1986. Match an Unknown line to a real build year past that date, and it reclassifies with no truck roll required.

One exception: a line already field-verified Lead never gets overruled by a tax record. Flagged, excluded from Accept All, human only.

Update Year Built Material Suggestions step. Rows built after the lead ban are eligible for Accept All, except one row built in 1988 and already recorded as Lead, which is highlighted amber with a Review warning and excluded from the bulk action

Nothing saves until Apply Changes. Then it's counted: every reclassified line is a property nobody has to dig up.

Update Year Built completion screen reading 38 year built records and 15 material reclassifications were applied, with a Digs Avoided count of 15
Check 3 of 3 · Geocode Validation

If the map is wrong, the crew shows up at the wrong house.

A bad coordinate doesn't vanish, it sends a crew to the wrong city. These pins plot in DC, Phoenix, Seattle, Miami, hundreds of miles outside the actual service area.

Geocode Validation split map and list view, showing locations whose current GPS coordinates plot in Washington DC, Phoenix, Seattle, Miami, and Denver, far outside the utility's actual service area boundary

Two lines sharing one coordinate can be a duplex. Dozens is a geocoder giving up, caught at cluster scale, not one row at a time.

Expanded duplicate coordinate cluster showing 78 individual service lines stacked on one shared GPS point, each with its own suggested coordinate and inline accept or edit action, plus a bulk action to accept the remaining lines

None of this came from a hunch. Every rule is copied from the acceptance criteria I was handed. When a rule looks oddly specific, someone already got burned by the version without it.

Free Tier

No percentage, on purpose.

Three buckets instead of a raw score: Higher Probability Non-Lead, Inconclusive, Higher Probability Lead. A number alone doesn't tell a utility where to send a crew.

Free tier bucket chart showing higher probability non-lead, inconclusive, and higher probability lead, no raw percentages shown
Inventory Dashboard

Everything that matters, above the fold.

Materials, data quality, and prediction. One page instead of three calls to 120Water.

120Water Inventory Dashboard, Premium tier, showing material breakdown, digs avoided, and the lead prediction histogram
Verification Planner

From messy data to a prioritized plan.

Set a monthly capacity. Get a prioritized, mapped list, highest-likelihood-lead first, ready to review before anything's assigned.

Verification Program plan review showing a map of prioritized service lines alongside a list with predicted score and classification for each address
Program Progress

See it running. Then steer what's next.

Crew-by-crew completion, a live map of verified lines, how many turned out to actually be lead, and one click to plan the next batch.

Active Verification Program view with completion progress, field team breakdown, a Plan Next Batch action, and a map alongside the line-by-line verification results
Design System

One color, one meaning. One typeface, five weights.

The third rule, made concrete, plus the typeface behind it. These are the prototype's own tokens. Click anything to inspect it.

Material
Status
Prediction
Actions
TypefaceInter
Inter
Regular 400 to Extrabold 800
Numbers stay in line

Counts and percentages use tabular figures, so every digit is the same width and columns line up. Flip the switch to compare.

Lead1,3443.9%
Galvanized3621.1%
Non-Lead22,19864.9%
Unknown10,29530.1%

Inter throughout. The one exception is monospace, for GPS coordinates and machine-read values.

Shape

Direction first. Code second, always.

Forty one tracked versions, May to July. Once one prompt could touch five screens at once, eyeballing each change stopped being reliable, so verification got automated: 118 assertions, 8 checks, run after every change. Slower per edit. Nobody shipped a screen that was secretly broken.

✏️
Sketch
Gray-box the layout in Figma first.
💻
Prototype
Build it live and clickable, not static comps.
🏷️
Test It
Same script, every session. Patterns that repeat become findings.
✅
Verify
118 automated assertions, 8 suites, after every change.
Where It Stands

Prototype complete. Not in front of every user yet.

v41, functionally complete across all three areas. Tested with four people, two customers, two internal. Developer handoff is next.

4
Testing sessions, two real utility customers, two internal reviewers
118
Automated test assertions, 8 suites, real headless-browser screenshots
3
Internal-only tools turned into one self-serve prototype

The proof already existed. Utilities just couldn't touch it.

Both hero numbers come from 120Water's own case, not this prototype. Floresville, TX: classifying 700 of 2,200 unknown lines avoided about $105,000 in inspection costs. 95% recall is their own bar for usable at all, below it, their words: "current model won't work."

The business case already existed. What didn't exist was a way to touch it without calling 120Water first.

The best decision was often the one I didn't make yet.

First time running user testing myself. The rule: don't build past what's confirmed. The same three problems kept showing up across different sessions and different people, which is why four short tests beat one long one.