Inspiration
In August 2025, tens of thousands of fish died along Ireland’s Munster Blackwater. Multiple agencies responded, but by the time the event was investigated, the suspected short-lived pollutant had disappeared.
The problem was not a lack of data. It was fragmentation: different agencies, units, languages, and systems.
The same issue appears in public health. Across 35 waterborne outbreaks studied in Greece over twenty years, the same organism was identified in both clinical and water samples only once among the outbreaks where both were collected.
We built AquaFHIR Bridge around one idea:
The evidence already exists. It just does not speak the same language.
What we built
AquaFHIR Bridge converts heterogeneous environmental observations into reviewed, interoperable OneAquaHealth FHIR Observations.
It can ingest agency CSVs, sensor readings, laboratory results, citizen observations, and satellite-derived indicators. Gemini helps interpret multilingual or inconsistent labels and proposes the appropriate terminology code and UCUM-compatible unit.
But AI never publishes data directly.
A human approves the mapping first. The system then validates the observation, publishes it as FHIR, evaluates versioned threshold policies, and routes alerts to public-health, veterinary, and water-authority audiences.
Environmental readings and human-health indicators can share the same FHIR Location, making ecosystem-to-human investigation a query rather than a manual data-integration exercise.
How we built it
We separated responsibilities deliberately:
- LLMs handle semantic ambiguity
- Deterministic code handles arithmetic and thresholds
- Humans approve mappings
- FHIR provides the interoperability layer
Prompts and decisions are also traceable through an append-only audit trail.
Challenges and lessons
The hardest problem was not FHIR serialization; it was deciding when not to publish.
A dissolved-oxygen value of -5.0 mg/L should not trigger a critical alert—it should be rejected as implausible.
We therefore made publication a strict predicate rather than a confidence score. Unresolvable units, unsafe mappings, and implausible values are withheld.
Our biggest lesson was simple:
In high-trust systems, refusal is a feature.

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