-
-
GPT-5.6 turns the trip into timed chapters and captions that play on the map.
-
Five editable chapters set the pace for a long California road trip.
-
The replay ends with a 1080 by 1350 memory card you can save or share.
-
One Timeline export, three trips: California, New York, and Italy.
-
Import a Google Timeline JSON file, or try three trips from the included sample.
I want to do more with my data
Google Maps has years of my location history, and I bet that's the same for a lot of people. The Timeline feature can tell me where I stopped and how I got there, but only one day at a time, so revisiting a vacation still feels like reading a database. I wanted to watch the trip happen again.
There I Was imports a Google Maps Timeline JSON file, finds each trip between leaving Home and returning, names the places where I spent time away, and rebuilds an animated trip route.
Note: If you haven't already handed your location history over to Google, this app isn't for you, but I've included some sample data so you can see most features in action.
What I learned
Google's export is a pile of evidence: visits, activities, path samples, timestamps, and occasional Timeline Memories. Google doesn't sort any of the data into a neat list of vacations. The app has to infer when I left Home, which stops mattered, how I moved between them, and when the trip ended.
Working with my own export as a starting point also clarified the right job for GPT-5.6. Code can establish where I went and when I was there. GPT-5.6 is better used as a director. It divides the trip into chapters, chooses the pace of the replay, and writes captions grounded in the places and movements the app already verified. The user can then edit every title and sentence for a truly personalized retrospective.
How I built it
The importer runs in a Web Worker so a large Timeline file won't freeze the page. Zod validates each record separately, malformed entries are quarantined, and inconsistent timestamps are normalized. Trips are created with "Home" as the boundary. An offline GeoNames index converts coordinates into place names, and duplicate date ranges are removed before the trip list appears.
MapLibre renders the map. Recorded paths keep their original geometry, while sparse driving, walking, and cycling legs go through Mapbox Directions so the route follows actual roads instead of dots connected by straight lines. Flights use great-circle arcs. A single replay clock controls the moving marker, the green trail behind it, the local date and time, GPT-5.6 captions, and any photos attached to the trip.
When someone clicks Direct replay, the browser creates a Memory Dossier from the named places, dates, time spent, travel modes, and coverage gaps. A Netlify Function validates that dossier and sends it to gpt-5.6 through the OpenAI Responses API with store: false. Structured Outputs give the app three to five chronological chapters with timestamps that become replay keyframes.
The browser can also read capture time and GPS metadata from uploaded photos. Those photos appear at the right point on the map and during playback. At the end, a local canvas renderer turns the completed route, trip facts, directed chapters, and photos into a 1080 by 1350 memory card that can be saved as a PNG. IndexedDB keeps the imported Timeline, route cache, edits, photos, and generated direction available after a reload.
The challenges I faced
The first version looked convincing until I used it with my actual data (an export with over 15k records). It produced duplicate trips, generic titles, dozens of "Unnamed stop" entries, a map zoomed too far out, and straight lines between sparse location samples. I realized I should have given Codex the data from the beginning so it could iterate independently based on the results instead of building blindly.
Route reconstruction was the hardest part. Google often records enough to prove that a drive happened without recording the road itself. Codex added a classifier that keeps detailed path evidence, sends sparse ground travel through Mapbox Directions, rebuilds missing joins, and checks that every trip starts and ends at Home. The California trip in the sample data now produces one road-following loop covering 3,030 miles, 23 nights, and nine named places.
Using GPT-5.6 exposed a different kind of failure. The OpenAI key worked locally but had never been configured in Netlify's production environment. The deterministic fallback hid that mistake, so the feature appeared to work without ever reaching the model. I added an explicit health response, configured the production and preview secrets, adjusted the request timeout, and ran a live acceptance call that returned a validated plan covering all nine destinations.
How Codex helped
I used only one primary Codex task from the product contract through deployment. Codex worked against browser screenshots and the supplied Timeline data, wrote the parser and replay tests, tracked down the production failures, and kept the submission tied to what the app can demonstrate.
The test suite now requires the public sample to produce exactly three trips with the expected dates. Unit tests cover loop closure, route reconstruction, GPT plan validation, and EXIF handling. Playwright checks the landing page, both import paths, the directed replay, the saved memory card, and responsive layouts. A production scan also fails if an OpenAI secret appears in the browser bundle.
After every turn with Codex, I tested the app with my ultimate vision in mind and wrote back a bulleted list of specific, actionable feedback. This workflow proved very successful and ultimately helped me overcome all major challenges.
The quickest way to see it
- Click
Try with Sample Data. - Open
Californiaand wait for the route to finish preparing. - Click
Direct replay. - When GPT-5.6 finishes, click
Play memoryand watch the chapters change on the map. - Scroll to
Your memory cardand save the finished trip as a PNG.
The current Build Week version completes the whole trip: import it, direct it, play it, and keep the finished memory card. To take this project from prototype to primetime, I will refine place-label correction, implement directed video export, add Google oAuth, and maybe even find a way to automatically grab a Google user's timeline data instead of relying on manual JSON uploading.
Built With
- codex
- gpt-5.6
- indexeddb
- mapbox
- maplibre-gl-js
- netlify
- openai
- playwright
- react
- typescript
- vite
- zod
Log in or sign up for Devpost to join the conversation.