-
-
HL7 FHIR R4 transaction Bundle: Location, QuestionnaireResponse, Observations. 0 errors with the official HL7 validator
-
My checks: the history and trend of each site stay on the phone until exported
-
Explained stream-health index: a sewage smell is a critical sign, so it raises an alert, and every lost point is shown
-
One Health advice in plain language for people, animals and the environment
-
One question per screen, big buttons, no jargon: a full check takes under a minute
-
English, French and Malagasy, works offline, with GPS from the phone
-
Data checked at the source: impossible values, contradictions and missing GPS lower the confidence before the data is shared
▶ Try it: https://nambininasafidison.github.io/ranoka/dist/ (works on any phone, also offline) · Code: https://github.com/nambininasafidison/ranoka
Tracks: 1 (Citizen UX), 4 (Plain-language advice), 7 (Digital Health Standards)
Inspiration
In Antananarivo, rivers like the Ikopa run through neighbourhoods where people wash, fish and let animals drink. The people who see the water every day are not scientists, often have poor connectivity, and don't always speak English. Citizen science only works if the form is easy, the result is understandable, and the data is good enough for experts to trust. We built Ranoka ("water" in Malagasy) for that.
What it does
- 10 visual questions, one per screen, with big tap targets (colour, smell, foam, oil film, litter, dead animals, algae, banks, flow, invasive species), plus optional temperature and pH.
- Explained stream-health index (0–100). Every lost point is shown next to the answer that caused it. Critical signs (sewage or chemical smell, oil, dead animals, thick algae) always trigger an alert.
- One Health advice in plain language for people, animals and the environment, for example "keep dogs away: thick algae can be toxic cyanobacteria".
- Data-quality check before the data leaves the phone: missing answers, impossible values, contradictions, missing or imprecise GPS, all summarised as a High, Medium or Low confidence.
- HL7 FHIR R4 export: a transaction Bundle with Location, QuestionnaireResponse, one Observation per indicator (UCUM units), and a summary Observation with interpretation, explanation and hasMember. The FHIR Questionnaire and CodeSystems are generated from the same definition as the form.
- Offline-first, trilingual (EN/FR/MG), private by default: data stays on the device until it is exported. A history view shows the trend per site.
How Ranoka serves the OneAquaHealth mission
- Citizens become early-warning sensors. Anyone living next to an urban stream can report a sewage smell, an oil film, dead fish or a toxic algae bloom in under a minute, and the result is an immediate alert.
- One Health by design. Every result gives advice for people, animals and the environment at the same time, because the same stream affects all three.
- Data that researchers and city dashboards can trust. The quality check flags missing or contradictory data before it is shared. Every value is explained, so a scientist can see why a site scored 59/100.
- One Digital Health and FAIR. The data is HL7 FHIR R4, with GPS, time and the citizen observer as provenance. It uses UCUM units, HL7 interpretation codes and published CodeSystems. It is findable, accessible, interoperable and reusable.
- Inclusion. It works offline and in Malagasy, so it reaches the communities that are usually left out of environmental monitoring.
Proof of interoperability: the official HL7 FHIR Validator
We ran the official HL7 FHIR Validator (6.10.4, FHIR 4.0.1) on the exported Bundles in English, French and Malagasy, on an incomplete check, and on the published Questionnaire and CodeSystems. The result is 0 errors. The only warnings come from running offline, because UCUM units cannot be checked without a terminology server.
The first validator run also made the export better. Every resource now has a human-readable narrative. The citizen observer is recorded as the performer. The CodeSystems are published with French and Malagasy designations. Coding displays stay canonical in every language, and incomplete checks are marked in-progress.
How we built it
Plain HTML, CSS and JavaScript with no dependencies, built into a single self-contained file that works offline on any phone. The core (questionnaire, scoring, quality checks, FHIR generation) is one pure module that also runs in Node. Automated tests cover the scoring, the quality checks, the FHIR structure (every reference resolves, one value[x] per Observation, UCUM quantities), the narratives and canonical displays, the CodeSystem coverage and the full translation coverage. A script runs the official HL7 validator.
Challenges we ran into
- Keeping the score explainable. We chose a transparent additive model with a hard override for critical signs instead of a black-box model.
- Writing advice that is both accurate and short in three languages.
- Mapping a citizen form to FHIR cleanly. The stream is a Location and is the subject of every Observation, and the summary links back to the raw observations.
- Multilingual data that stays standard. The citizen sees French or Malagasy, but the codes and displays stay canonical, so the data can be compared across cities.
Accomplishments that we're proud of
- A full check takes under a minute.
- Every result can be explained.
- The FHIR export passes the official HL7 validator with 0 errors, in three languages.
- It works in Malagasy, a language almost no environmental tool supports.
Feasibility and scalability
- No hosting cost: it is one static file, served today by GitHub Pages, with no server, account or database needed to collect data.
- Any FHIR server can receive the exports (for example HAPI FHIR), so it plugs into existing health and research systems.
- A new city or language needs only new translations or calibrated weights. The code stays the same.
What we learned
Data quality starts at the citizen's phone: catching contradictions and missing GPS at entry time is cheaper than cleaning the data later. Plain-language advice is what makes people come back.
What's next for Ranoka
- Map the codes to the OneAquaHealth FHIR IG profiles and validate against a terminology server.
- Calibrate the weights against lab samples.
- Add photo attachments.
- Add a sync queue to a FHIR server and a city map of all checks.
Built With
- css3
- hl7-fhir
- html5
- javascript
- node.js
Log in or sign up for Devpost to join the conversation.