What inspired us

Water pollution doesn't announce itself. It hides behind the mundane: a creek that looks a little too green, a river that smells faintly of chemicals, a pond where the fish stopped jumping. By the time a lab result confirms contamination, weeks may have passed — and the evidence may have washed downstream. The moment that crystallized this project for us was stumbling across a photo posted to a community Facebook group: a foam-covered creek in rural Appalachia, forty-seven comments of worried neighbors, and zero official reports filed. Those people had eyes on the water every day. They just had no way to turn what they saw into something a scientist could act on. We built HydroTriage to be that missing layer — not a reporting form that disappears into a bureaucratic void, but a real-time triage pipeline that routes citizen observations to scientists the moment they are submitted, scored, and clustered into a signal worth investigating.

What we learned

The biggest thing we learned is that water quality problems are multimodal — they don't present as a single anomaly, they present as a constellation. A "dark water" observation is ambiguous. A "dark water + oily iridescent surface + dead fish + sulfur odor" observation is almost diagnostic. Treating those inputs as independent discards the interaction signal, which is where the real information lives. That realization drove us toward a composite scoring model rather than any single-feature threshold. We also had to confront an uncomfortable truth midway through: our early AI outputs were too confident, and false confidence is more dangerous than uncertainty. When the system told citizens "petroleum discharge detected," they stopped worrying. When it told scientists the same thing, they deprioritized field follow-up because the AI had "already handled it." We rebuilt the interpretation layer from scratch around the principle that triage is not diagnosis — the system's job is to generate a calibrated prior that updates a scientist's attention queue, not to replace their judgment. The last thing we learned, and the one that surprised us most, is that individual observations are almost useless. What's meaningful is spatial-temporal clustering — five independent reports of discoloration within 2 km over 48 hours is a qualitatively different signal than one report, and building our alerting system around that pattern is what made HydroTriage feel like actual intelligence rather than a fancy submission form.

How we built it

The core of HydroTriage is the Environmental Quality Score (EQS), a composite 0–10 index that converts multimodal sensory observations into a single triage signal across five weighted factors: water color anomaly, surface condition, odor profile, wildlife behavior, and recent upstream context. The composite is computed as:

$$\sum_{i=1}^{5} w_i \cdot s_i + \Delta_{\text{cluster}}$$

where each ( s_i \in [0,1] ) is a normalized factor score, ( w_i ) is its weight, and ( \Delta_{\text{cluster}} ) (up to ( +1.5 )) is a bonus applied when the observation falls within a detected spatial-temporal cluster — reflecting the Bayesian intuition that correlated independent observations carry super-additive evidential weight. Priority tiers follow:

$$\text{Priority} = \begin{cases} \text{High} & \text{EQS} \geq 7 \ \text{Standard} & 4 \leq \text{EQS} < 7 \ \text{Low} & \text{EQS} < 4 \end{cases}$$

Once scored, we call Claude via the Anthropic API with the raw features, computed scores, and location context. Claude returns a plain-language ecological hypothesis — always framed as "consistent with" rather than "confirms" — displayed under a clear AI badge so no one mistakes a pattern estimate for a lab result. Cluster detection runs a Haversine proximity check across a rolling 48-hour window, triggering when ( N_{\text{min}} = 3 ) or more reports fall within ( d_{\text{thresh}} = 5,\text{km} ) of each other inside ( T_{\text{window}} = 48,\text{hours} ). When triggered, a red cluster alert surfaces on the Scientist dashboard and every report in the cluster receives the EQS bonus. For high-priority observations, scientists generate a Field Action Card — a structured package of the AI interpretation, raw data, suggested sampling checklist, known evidence gaps, and GPS anchor, exportable as JSON or a printable card — that bridges the gap between a digital alert and a physical field investigation. The entire application ships as a single self-contained HTML file with no server, no database, and no build step, so citizen data stays local until explicitly exported, the tool runs offline in low-connectivity field conditions, and deployment costs nothing.

Challenges we faced

The hardest problem was calibrating language, not code. Getting the AI to say "this pattern is consistent with a petroleum discharge" instead of "petroleum discharge detected" took more iteration than building the scoring model, because the difference between those two phrasings is the difference between a tool that helps scientists think and one that thinks for them. Scoring odor and wildlife without ground truth was the other deep challenge — no labeled citizen-science dataset exists for this use case, so we grounded our factor weights in toxicology literature (sulfur odor as a proxy for hydrogen sulfide, fish kills as an indicator of LD50-level acute toxicity) and surface that uncertainty openly in the UI rather than hiding it behind a confident number. The moment the project really came together was when we stopped thinking about the Scientist dashboard as a list and started thinking about it as a spatial-temporal intelligence surface — adding the SVG map overlay and temporal cluster chart transformed it from a queue of reports into something that actually shows you whether a pollution event is moving, spreading, or fading.

What's next

Every design decision in HydroTriage points toward the same north star: shrink the time between a citizen noticing something wrong and a scientist standing at that water's edge with instruments. The next steps — real GPS capture, image analysis via Claude's vision API, multi-language support, cross-referencing EPA discharge permit records near cluster locations — all serve that goal. We want the day to come when a foam-covered creek in a community Facebook group triggers an automated field investigation before the forty-seventh comment is posted.

Built With

  • ai
  • anthropic
  • api
  • citizen
  • claude
  • cluster
  • css3
  • data
  • environmental
  • geospatial
  • html5
  • javascript
  • quality
  • science
  • svg
  • visualization
  • water
Share this project:

Updates

Submission history