Basin-scale riparian monitoring from satellite data — a STAC ETL over Sentinel and Landsat, geospatial ML, and a map-based decision-support UI.
PythonSTACGeospatial ML.NET 10PostGISReact 18MapLibre GLAspire
A basin-scale monitoring system for riparian ecosystems in the San Juan River watershed (Colorado + New Mexico): satellite imagery in, health-graded map intelligence out. It learns where riparian vegetation actually is from satellite time series — instead of assuming a fixed distance from a stream — then scores its condition (including invasive tamarisk and Russian-olive cover) and tracks change across the Earth-observation record. It’s where my two careers meet: a decade of GIS engineering and an environmental-studies background on one side, modern data engineering and ML on the other.
The live site is an interactive story map of the corridor, a Random Forest vs. Ai2 OlmoEarth foundation-model field test, and a grounded RAG agent that streams cited answers about the watershed.
Most portfolio ML projects stop at a notebook. This one is a system: reproducible ETL over public satellite archives, models validated the way spatial data demands (spatial CV, not random splits), a typed API layer, and a UI a watershed manager could actually use — deployed with Docker and PostgreSQL, guarded in production by rate limits, input shields, and Cloudflare Turnstile.
And it holds itself to scientific standards: the repo carries a public
engineering & methodology walkthrough
inviting scrutiny of the weak points, and a RETRACTIONS.md — when a result’s
interpretation didn’t survive re-verification, the correction was published, not buried.
The headline finding stands either way: on an out-of-distribution reach, the pixel-wise
Random Forest collapses to near-chance while the OlmoEarth foundation model holds — a
measured demonstration of classical-ML brittleness to distribution shift.