Full-stack · Cloud AI
MaraMap
Turns a decade of social-media posts into an interactive map, timeline and list — a running and travel log rebuilt from a raw Facebook export.
- 518
- Posts mapped
- 39
- Countries
- 53
- Overseas marathons
Overview
Years of running and travel were sitting inside a Facebook data export — thousands of posts, photos and videos in raw JSON, most of them carrying GPS coordinates nobody was ever going to look at again. MaraMap turns that archive into something you can actually browse: an interactive map, a timeline, and a list, all built from content that already existed but was effectively unreadable.
My Role
Solo project — data pipeline, backend API, frontend application and deployment.
Architecture
The system splits into two halves that never run at the same time.
Ingestion runs locally, not through the API. A four-stage script pipeline processes the raw export: extraction pulls text and geotagged media out of the Facebook JSON; Gemini 2.5 Flash classifies each post into categories and generates tags; media is uploaded to Cloudflare R2 in parallel and rewritten to CDN URLs; the structured result is imported into Supabase.
Serving is a conventional API. A NestJS content API on Cloud Run exposes paginated posts and the geotagged location set, and a Next.js App Router frontend on Vercel renders the map with Leaflet and marker clustering.
Keeping ingestion out of the request path was the central decision: bulk classification and media migration are slow, expensive and idempotent, and none of those properties belong in an HTTP handler.