← Work

Water quality monitoring dashboard — analyzers in the field

Remote water analyzers reporting pH, turbidity, flow and tank level, with per-site limits, alarms, and history that stays fast as it grows.

Client
Private client
Role
Solo developer
Year
2026

Laravel · PHP · PostgreSQL · Tailwind CSS · Chart.js

The problem

The client installs water analyzers at customer sites — treatment plants, tanks, supply lines — and each unit measures things that matter: pH, turbidity, flow, how full the tank is. The readings were reaching the devices and stopping there. Checking a site meant going to the site, and a reading that drifted out of safe range at 2am was found the next morning, if at all.

What I built

A dashboard the client and their customers open in a browser:

  • Every device at a glance, with its latest readings and anything currently out of range shown in red rather than buried in a table.
  • Limits set per device. A tank at one site isn’t the same as a tank at another — each unit gets its own safe range for pH, turbidity, flow and level, plus its own reporting interval.
  • Alarms with a history. When a reading crosses a limit it’s recorded, so patterns are visible instead of just the current moment.
  • The device’s own health, not only the water: supply voltages and signal strength are tracked too, because a sensor that’s quietly failing gives readings that look fine.
  • Data logger with export. Filter any device over any period and download it as a spreadsheet for reporting.
  • Per-customer access, so each customer sees their own sites and nobody else’s.

Readings are summarised as they arrive — by hour, day, month and year — so a chart covering a whole year opens as quickly as one covering today, no matter how long the devices have been running.

How it turned out

Delivered and in use, with the interface rebuilt partway through once the client saw real data flowing and knew what they actually wanted on the first screen.