Geospatial ML AI Engineering Python

I build tools that turn messy real-world data — terrain, conflict feeds, legal text, routing data — into products people can actually use, spanning geospatial ML, AI-assisted search, and interactive mapping. Below are four shipped, end-to-end systems: data pipeline through deployed app.

Projects

Bordeaux Fire Scrollytelling

MapLibredeck.glPythonGeospatial ML

Wildfire risk models are usually locked in scientific papers and GIS tools nobody outside the field can read. I built an interactive scroll-driven map that turns real terrain and fire-behavior modeling of the Bordeaux/Saumos region into a story anyone can follow — no GIS background required.

Under the hood: a Python geospatial pipeline models fire-spread risk against real elevation and vegetation data, rendered client-side with MapLibre + deck.gl so the map animates in sync with the narrative as you scroll.

Sudan Conflict Scrollytelling

MapLibredeck.glJavaScript

Conflict data feeds are dense, fast-moving, and rarely built for a general reader. I built a scrollytelling map that turns live conflict-tracking data on the Sudan crisis into a narrative about displacement — pairing real numbers with a story that's actually legible.

Under the hood: live conflict-event data is transformed into scroll-triggered map states, with deck.gl handling the layered visualization as the narrative advances.

30 Minutes From Help

MapLibreRouting/IsochronesPython

How much of Port of Spain is actually within 30 minutes of emergency care — and does that change at rush hour? I built a drive-time catchment analysis that answers this with real routing data instead of straight-line guesswork, showing how access to Port of Spain General Hospital shifts hour by hour.

Under the hood: Python-generated isochrones from routing/traffic data, recomputed across times of day and rendered as time-of-day catchment layers in MapLibre.

TT Law Citation Engine (law-cite-tt)

FastAPIPostgreSQL + pgvectorHybrid FTS + vector searchSvelte 5RAG agent (Gemini)Cloudflare WorkersLegal tech

Lawyers and researchers need to know exactly what a law said on a specific date — and legislation is amended constantly, so that's harder than it sounds. LawCite TT is a production legal-research engine for the Laws of Trinidad and Tobago: all 533 chapters across 4,989 historical revisions, section-chunked into 407,008 date-versioned pieces and searched with hybrid full-text + vector retrieval. It resolves and validates citations to copy-ready form, answers questions through a floating research assistant that quotes the corpus verbatim with linked sources, and maps the whole corpus — including 7,914 statute-to-case citation edges drawn from 2,236 judgments — as an explorable Statute Atlas. Shipped as a Svelte 5 edge app on Cloudflare in front of a FastAPI + Postgres/pgvector API.

Under the hood: legislation is chunked section-by-section with date-versioned metadata, indexed for both full-text and vector search so queries resolve by exact wording or semantic meaning, and every assistant answer is forced to cite specific provisions or case nodes — with a grounding guardrail that refuses anything it can’t verbatim-source. The API keeps full chat history and hashed-IP usage analytics in the same Postgres instance, powers an admin metrics dashboard, and serves official statute PDFs through a server-side proxy.

Piarco Live — T&T Flight Tracker

ReactTypeScriptViteOpenSky Network APIFlightAware AeroAPICloudflare PagesNode/Coolify

Trinidad has no public real-time view of its own airspace. I built a live flight-board and map for Piarco International (POS) that plots every tracked aircraft on a custom SVG map, with great-circle routing, keyboard shortcuts, and a mobile-first bottom-sheet layout — rebuilt from scratch in React/TypeScript and shipped to Cloudflare's edge.

Two independent live feeds drive the board: FlightAware AeroAPI supplies the schedule (gates, ETAs, real flight idents) and OpenSky supplies live ADS-B position, altitude, speed, and heading, merged by callsign so tracked aircraft move with real telemetry. Getting OpenSky live took solving an infrastructure problem — OpenSky blackholes all traffic from Cloudflare’s IP ranges, so that feed is proxied through a Node service on a separate VPS while the schedule feed stays on a Cloudflare Pages Function, each routed around the constraint that applies to it. Aircraft render on a hand-built SVG map (no map-tile library) with runway overlays that fade in at zoom, great-circle route lines, and a “follow selected” camera mode. The live ticker scrolls real arrivals, delays, and airborne status. On mobile, the board collapses to a swipeable bottom sheet; either feed can drop out without breaking the app — it falls back to illustrative data instead of an empty board.