Projects
2026

BMI

A full-stack groundwater monitoring system (the repo is named BMI, but it has nothing to do with body mass) - FastAPI and React/TypeScript, tracking well water level and chemical quality against WHO limits with an interactive map, automatic alerts, and 30-day forecasting.

Year
2026
Focus
Backend
Screens
4

Overview

Groundwater quality is the kind of data that gets measured carefully and then goes to sit in a spreadsheet, where nobody notices that a well has been drifting toward a limit for three months. This project turns that into a system: wells, their readings over time, and checks that run on every reading instead of on whoever remembers to look.

Each measurement records nine parameters - water level and pressure, plus mineralization, nitrate, sulfate, iron, lead, zinc and copper. Seven of those have a WHO reference limit, and a reading that crosses one raises an alert on the spot, which stays open until somebody resolves it. The thresholds live in configuration, not scattered through the code.

On top of the history, every well gets a 30-day forecast from an ARIMA model. Forecasting and the analysis it builds on are by far the most expensive endpoints, so both are cached in Redis for five minutes - the dashboard stays responsive without recomputing a model on every page load.

The backend is Python 3.13 and FastAPI with the same layering I use elsewhere: routers, services, repositories, PostgreSQL. Each request gets exactly one AsyncSession from a dependency that commits or rolls back on the way out, so no handler has to remember transaction bookkeeping. Twenty integration tests run against a real PostgreSQL database rather than a mock.

The frontend is React 18 and TypeScript, with Leaflet for the well map and Recharts for the trend charts. Readings go in one at a time through the UI or in bulk from CSV and Excel, and because the people entering them work in Uzbek, the importer accepts Uzbek column headers as well as English ones.

Highlights

WHO-threshold alerts

Nine parameters per well; the seven with a WHO reference limit raise an alert the moment a reading crosses it.

30-day ARIMA forecast

Per-well forecasting, cached in Redis for five minutes alongside the analysis it builds on.

Map-first dashboard

A Leaflet map of every well, with Recharts trend charts for the history behind each one.

Bulk import

CSV and Excel upload per well, with an importer that accepts Uzbek column headers as well as English.

One session per request

A dependency hands out a single AsyncSession and commits or rolls it back automatically.

Tested against real Postgres

Twenty integration tests covering wells, measurements, alerts, analysis, forecasting and the dashboard.

Stack

FastAPIReactTypeScriptPostgreSQLRedis