Satellite · AI · Regulatory enforcement

Catching illegal mining from space.

Ghana Minerals GeoData (ZuriGeo) turns Sentinel-1 radar and Sentinel-2 optical imagery into an accountable enforcement tool — detecting ground disturbance, tying every finding to the mining-licence record, and flagging what falls outside the law. Designed, built, and deployed solo, end-to-end.

See it live → GitHub Live demo is on free hosting — first load can take ~50s to wake.
1,466
licences reconciled to 1,175 operators
16
regions swept for new disturbance
200+
automated tests + CI
Solo
backend, ML, frontend & deploy
Disturbance map over satellite imagery
What it does

From raw satellite pixels to an enforcement lead.

Satellite change detection

Pulls Sentinel-2 optical and Sentinel-1 radar via Google Earth Engine and compares a recent window against the same window a year earlier — surfacing vegetation loss and new mining ponds. Radar is all-weather, so it catches clearing that optical alone would miss under cloud.

Sentinel-1/2Google Earth Enginechange detectionSAR + optical
Disturbance map

Districts ranked by what matters

Every district is ranked by new disturbance since the last sweep, with the legally strongest signals broken out — clearing inside gazetted forest reserves and disturbance outside any valid licence. A change is a lead, not proof, and the tool is careful to say so.

FastAPIPostgreSQLML classifierper-district metrics
Ranked district watchlist
AI feature

Grounded AI enforcement briefing

One click turns a sweep into a prioritized, plain-language brief. It's engineered to be reliable: the model only ever sees the numbers the system computed (retrieval-grounded, so it can't invent figures), it's guard-railed never to assert illegality, and it's covered by offline eval tests that run in CI without paid calls.

LLM (Anthropic API)groundingguardrailsevals in CI
AI enforcement briefing

Trend analytics over time

Click any district to see how its disturbance moves across successive sweeps — total area, vegetation loss, reserve encroachment — so a one-off reading becomes a trajectory that shows whether things are getting worse.

time seriesinline-SVG chartsinteractive
District trend chart

Encroachment & licence validity — privacy built in

Every licence is checked for disturbance spilling outside its boundary, and whether the permit is even valid — an expired licence is unlawful regardless of area. Holders resolve to operators so violations aggregate across a portfolio, and names can be blurred with one click, because a lead is not a verdict.

entity resolutionlicence validityencroachment km²privacy / name-blurring
Encroachment analysis with holder names blurred
How it's built

One person, end-to-end, in production.

From problem definition to a deployed system with a weekly scheduled worker and point-in-time-recoverable database — backend, data and ML pipeline, geospatial processing, frontend, LLM integration, and an accountable audit trail (note-required resolution, append-only log, hashed evidence, role-based access). Built with a real testing discipline: 200+ unit tests, a Playwright end-to-end suite, and offline model-eval tests that run in CI.

PythonFastAPIPostgreSQLGoogle Earth Engine Sentinel-1/2scikit-learn · XGBoostAnthropic LLM API JavaScriptLeafletPlaywright · pytestDockerCI/CDRender