How it works
From a forecast to the all-clear
Aheadwater watches a city's lakes and rivers, warns the right people before the water turns unsafe, and follows each case until it is safe again. Here is every step, and what sits underneath it.
One shared case, from first signal to close
- 1
Predict
Every morning, each lake and river gets a risk score for the day ahead.
A LightGBM model trained on 150,734 bathing-water samples from 7,246 lakes and rivers in 27 European countries. It reads rain and temperature from the days before, plus the site's own record. A site goes to Watch at 5 times its usual risk and to Alert at a 10% chance of failing the bathing limit.
- 2
Detect
Every signal lands in one officer console.
The forecast, lab results, weather rules for algae, low oxygen and sewer overflow, and reports from people at the water. A reporter's photo is checked on their own device for light, focus and open water before it is sent. The photo never leaves the phone for that check.
- 3
Verify
Two sources must agree before a case opens.
Each source adds to a trust score: a lab result over the limit counts most, then the model or official monitoring, then a citizen report and a clear photo. The officer can only open the case once two sources stand behind it.
- 4
Act
The right people hear at once, and a clock makes sure someone acts.
The city's water officer owns the case. Public health and local vets are told the moment it opens, with the groups of people living near the water. If the officer is busy, the case moves up to their supervisor, then opens to nearby verified labs, groups and volunteers.
- 5
Resolve
The team closes the case with evidence.
A responder claims the case, a clean follow-up sample comes back, and the case closes. The public page shows each step as it happens: warning, team on site, all-clear.
- 6
Learn
Every closed case teaches the next forecast.
A closed case with a dated lab sample becomes a new labelled row for the next training run, so each city's forecast gets sharper with use.
Every case gets picked up
The clock starts when a case opens. Public health and local vets hear at that moment, whatever happens next.
| Severity | Officer has not acknowledged | Nobody has acted |
|---|---|---|
| high | After 30 minutes, the supervisor is told | After 2 hours, verified responders nearby can claim it |
| medium | After 4 hours, the supervisor is told | After 24 hours, verified responders nearby can claim it |
Earned on places it has never seen
Every feature uses only data from before the sample day, and testing is grouped by site, so each score is earned on lakes and rivers the model never saw in training.
- 1 alert in 5 is a real exceedance, against 1 in 50 for a random pick.
- ROC-AUC 0.79 across Europe, and 0.77 when trained on 2020 to 2023 and tested on 2024.
- 5.5 times the usual risk at Blaarmeersen, Ghent, on the morning of 17 May 2021. The lab sample that day came back over the limit. The model had never seen a Ghent sample.
The trained trees are exported to JSON and scored inside this web app. A test checks that the app's scores match Python's.
Other hazards, in any city from day one
- Algae bloom. Calm wind (under 10 km/h) and a week averaging 20 °C or more.
- Low oxygen. 3 days at 28 °C or more, or heavy rain after 7 dry days.
- Sewer overflow. 20 mm of rain in a day, 40 mm for an alert.
Each city tunes these limits to its own water.
Health systems can read every case
Each step is stored as a FHIR R4 resource on the OneAquaHealth implementation guide. The official HL7 validator reports 0 errors across 3 full incident bundles.
| Resource | Holds | Profile |
|---|---|---|
| Location | the lake or river | OneAquaHealth profile |
| Observation | risk scores, lab results, citizen reports | OneAquaHealth profile |
| Group | people living near the water | OneAquaHealth profile |
| DetectedIssue | the case itself | HL7 FHIR R4 |
| Task | each job on the escalation clock | HL7 FHIR R4 |
| CareTeam | who is working on it | HL7 FHIR R4 |
| Communication | every alert and the public advisory | HL7 FHIR R4 |
What the demo replays
Ghent, 17 May 2021
After a wet weekend, the forecast flags Blaarmeersen lake. A citizen report agrees, the case opens, and the lab result confirms it. The whole case runs to the all-clear.
Bengaluru, 16 August 2017
After record rain, foam from Varthur Lake spills onto the road. A citizen report and the Central Pollution Control Board's monitoring open the case on the same workflow. Bengaluru runs on reports and lab results, and its first dated sample becomes its first training row.
See it for yourself
Open the console, the responder view and the public page side by side. They share one live case.