waters.wiki

What is dissolved in 3,998 mineral waters

Solo: data recovery, analysis, design, build, deploy 2026 Data Visualization
waters.wiki dashboard showing a Piper diagram of 1,565 mineral waters

The Challenge

A community catalogue of mineral water analyses went offline and took its database with it. What came back from archived copies was badly damaged: mis-decoded text, two different meanings collapsed into one column, and a third of the fields silently empty. The interesting question was whether anything scientifically usable had survived, and there was no way to know without rebuilding it first.

The Solution

Rebuilt the dataset from the raw archive with a reproducible pipeline, then tested whether it was real. Water chemistry has a built-in audit: the positive and negative ions in a correct analysis have to cancel out. Among the analyses reporting a full ion set, 82% balance to within 5%, and the distribution of water types matches what geology predicts. That result made the rest worth building. The site presents the corpus through the diagrams the field actually uses, with the data-quality measure exposed as a filter rather than hidden.

What I Built

Interactive Piper diagram

All 1,565 fully-analysed waters in the standard hydrochemical projection, brushable across every panel

Data-quality filter

Ion balance shown as a first-class dimension and wired to a threshold that propagates to every view

Offline geocoding

2,592 springs located from free-text place names against a local gazetteer, with confidence tiers

A page per water

Full ion breakdown, hardness, location, and nearest chemical matches for each of 3,998 waters

Community submissions

Corrections, new waters, and producer claims through a moderated queue backed by Postgres

Outcome

  • 3,998 waters from 144 countries, rebuilt from a dead archive
  • 82% of complete analyses verified by ion-balance check
  • 65% of sources geocoded offline, validated against known springs
  • Payload cut from 4.5 MB to 1.8 MB for a client-rendered dataset

Built With

Nuxt 4 Vue 3 D3 TypeScript Python PostgreSQL Docker nginx GeoNames