Skip to content
All work

Case study · Elsinore Valley MWD

WellSound

Field data-collection app

A web app operators use to log monthly well measurements, with a live chart that flags statistical outliers as a reading is typed — catching data errors before they are submitted.

Where
Elsinore Valley MWD
Role
Full-stack developer — build & deploy
When
2026
Users
Field operators, water resources staff

wellsound · new measurement

Mock · synthetic data
New measurementOperator · monthly roundWellWell 07Water level (ft)184.5Outside ±2σ for this wellConfirm the reading or re-measurebefore it can be submitted.Measuring method unchangedRe-measureConfirm readingSaved as pending · can be cancelled for 24 hWell 07 · last 24 readingsShaded band = mean ± 2σNewoldertoday
Internal District software. Described at a high level; the visual is a mock-up with synthetic data, not the production interface.

The problem

Groundwater monitoring depends on a clean, long-running record of monthly water-level readings. One mistyped value, or a reading taken a different way, distorts that record.

Errors are cheapest to catch at the moment of entry — while the operator still has the well in front of them.

What I built

  • Context while you type

    The well’s history is charted next to the entry form. A value outside the normal range (±2σ) or off-trend is flagged before it is saved.

  • Method-change detection

    If the way a reading was taken changes, the operator has to acknowledge it before the reading is accepted.

  • A safe commit window

    Submissions sit in a 24-hour pending window and can be cancelled before they auto-commit. Later corrections are stored alongside the original, never over it.

  • Single sign-on and roles

    Staff sign in with their existing Microsoft work accounts (Entra ID / OAuth 2.0). Viewer, Operator, Super and Admin roles control who can do what.

  • History and export

    Full measurement history with filtering, a drill-down view, and CSV export.

  • On-premises deployment

    Runs on a Linux server behind an Nginx reverse proxy, managed by systemd, with no cloud dependency.

Stack

Backend
PythonFastAPIUvicornSQLAlchemy 2.0
Data
PostgreSQL — six-table schema
Frontend
JavaScript — single file, no build step
Auth
Microsoft Entra ID (OAuth 2.0)JWT cookiesRole-based access
Ops
UbuntuNginxsystemd

Result

  • Statistical outliers beyond two standard deviations are flagged before field readings are saved, improving data quality at the point of entry.
  • Staff use the credentials they already have; access is enforced by role.
  • Reliable on-premises hosting with the app starting automatically on server boot.