-
-
Report in a minute, in your language (here Portuguese): photo in the page, tag what you see, confirm the spot on the stream, send.
-
Graded straight away: A, 92/100, with seven reasons anyone can read. Neighbours count as people, not reports.
-
Organiser queue: reports by health relevance, with photo, map and grade. One tap to verify, ask for evidence, or not confirm.
-
The permitted-use gate: a community-supported record can't leave as FHIR. "Export refused" until an expert verifies it.
-
After an expert field check the record is decision-grade, and a signed record is issued.
-
River Health Brief: advisories only where decision-grade evidence exists ("may warrant inspection", never a diagnosis).
-
Next steps from the real OneAquaHealth Catalogue of Measures (Dias, Serra, Feio 2025, CC BY 4.0), with section and page.
-
DipteraCAST ground truth: present 2, not seen 10, held back 48. A visual all-clear is "not seen", never "absent".
-
GIF
Animated: the gate refuses the export, an expert verifies, the export goes through.
-
GIF
Animated: Catalogue measures, under-observed stretches, "ask residents to check", and the DipteraCAST card.
Inspiration and problem
To a computer, a rumour and a verified report look exactly the same. Citizens already photograph foamy, stagnant, smelly streams. But a city can't tell which reports to trust, a health system can't read them, and nothing says what a report is allowed to be used for. OneAquaHealth's FHIR guide says what was observed, but not how far to trust it. That is the missing layer between "a citizen saw foam" and "a city acts on it". StreamProof fixes that inside OneAquaHealth's own FHIR standard. It grades every report, lets neighbours and experts strengthen it, and writes the answer into the record, with a published rule that every system downstream can enforce.
What it does
- Report in a minute, in 45 languages, with the camera inside the page. It works offline.
- Graded at once, A to D, with seven reasons anyone can read and argue with. Neighbours count as people, not reports.
- A permitted-use gate sits in front of every output. The rule is a published FHIR CodeSystem, so the app and any receiving system enforce the same thing.
- Experts verify in one tap, and the record upgrades. Only then can it leave as FHIR.
- The River Health Brief gives a city next steps from the real OneAquaHealth Catalogue of Measures, and flags stretches nobody has checked.
- DipteraCAST ground truth: verified mosquito records leave as labelled CSV or FHIR. A visual all-clear is "not seen", never "absent".
What the hackathon asked for, and what we built
| They asked for | What we built |
|---|---|
| Impact (30%): better monitoring and awareness of water ecosystems | Citizen photos become evidence a city can act on, with measures from OAH's own Catalogue and verified data for DipteraCAST. |
| Innovation (20%) | Trust travels inside the FHIR record. The gate is the published rule file. |
| Technical (20%) | 0 errors, 0 warnings against the official OAH profiles (HL7 Validator). 93 backend tests, 27 end-to-end tests. |
| Usability (15%) | One minute to report, offline, 45 languages (right-to-left too), every grade explained, accessibility checks clean. |
| Feasibility (15%) | Built on the OAH guide, works for any city, can sit behind OAH's Citizen Science App. |
| Track 7: FHIR models and integration | Profiles derived from ObservationIndicatorsOah and LocationOah, a ConceptMap to OAH codes, FHIR export. |
Research we built on
| Source | What we took |
|---|---|
| Alabri & Hunter (2010), "Enhancing the Quality and Trust of Citizen Science Data", IEEE e-Science | Automatic quality checks plus a trust measure per observer → our seven checks and track record. |
| Baker et al. (2021), Citizen Science: Theory and Practice, doi:10.5334/cstp.351 | A hierarchy: community checks most, experts check the flagged → our evidence graph. |
| OAH Catalogue of Measures (Dias, Serra, Feio 2025), CC BY 4.0 | Real measures with section and page → the brief. |
| HL7 Europe OAH FHIR guide | The profiles and codes we derive from. |
New here: a machine-readable rule for what each trust level may be used for, carried inside standard FHIR records.
How we built it
Python + FastAPI + SQLite for the evidence engine and gate. Next.js PWA for citizens and organisers. FHIR Shorthand compiled with SUSHI against the OAH guide and checked with the HL7 Validator. Real OpenStreetMap streams and Open-Meteo rainfall; the demo reports are synthetic and labelled.
Challenges we ran into
- The OAH guide isn't published as a package, so we built a pipeline that compiles it locally (it has no licence, so we never copy it).
- Reaching zero warnings meant fixing real modelling issues, such as
permitsneeding to be a Coding. - Staying honest: "not seen" is not "absent", and foam and odour have no Catalogue measure, so we label those "team inference".
Accomplishments that we're proud of
- Records that validate against the official OAH profiles, and a profile that refuses unverified records on its own.
- The gate and the published rule can't disagree: the gate is the file, and a test proves it.
- A test checks every Catalogue quote and page number, so a wrong citation fails the build.
What we learned
Trust is a data problem, not only a UI problem. And honesty is a feature: "not seen", "team inference" and "interface only" are what make the rest believable.
What's next for StreamProof
Propose the trust add-on to HL7 Europe's OAH guide. Calibrate the grade with OAH ecologists on real expert-labelled reports. Native-speaker review of translations. Connect DipteraCAST once a model interface is public.
Built With
- fastapi
- fhir
- fhir-shorthand
- hl7
- leaflet.js
- nextjs
- openstreetmap
- pwa
- python
- react
- snomed-ct
- sqlite
- sushi
- typescript


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