Selected work

I gave my AI a memory of everywhere I’ve been

I can ask ChatGPT or Claude where I’ve been, and they answer from years of my own location data, served from a machine in my house.

Type
Personal project, my own data only
Runs on
Docker on my home server
Built with
Python, MCP, OAuth 2.1, headless browser
Data
Years of my own Google Maps Timeline

What you can ask it

Pick a question to see which server and tool answers it.

“Where did I eat in Chicago?”

History server

visits_near

Every visit within a few kilometers of a place, with names, dates, and how long I stayed.

“Summarize my week.”

History server

summarize_week

A day-by-day summary of where I went, how far I traveled, and how much of it was walking, driving, or flying.

“How much time did I spend at the gym in September?”

History server

time_at_place

Totals for any place over any date range, a surprisingly honest accountability tool.

“When did I go to Myeongdong on my Seoul trip?”

History server

tripsvisits

Trips are detected automatically, so travel questions still work years later.

“Where am I right now?”

Live-location server

where_am_imovement_since

A separate live feed from Google Maps location sharing gives my current position and recent movement.

“What was that café I went to after the concert?”

History server

search_placestimeline_between

It connects the dots between an event I remember and a place I don’t.

Figure 1. Real questions I ask, and the read-only tools on my MCP servers1 that answer them.

Why I built it

Google Maps Timeline quietly keeps a detailed diary of your life: every place, every trip, how you got there. Then Google moved Timeline onto the phone and removed it from the web, which left years of history hard to search or use for anything. I wanted it back, and I wanted to be able to talk to it.

How it works

Three small services, kept separate on purpose, all running in Docker on a server in my house.

  • A sync engine pulls my end-to-end-encrypted Timeline backup from Google’s cloud every few hours and decrypts it with my own key. It builds on an open-source exporter,2 and a headless browser looks up names for any new places.
  • A history MCP server exposes over a dozen read-only tools: visits near a location, trips, day and week summaries, time at a place, and distance traveled.
  • A live-location MCP server polls Google Maps location sharing,3 which has no official API, and keeps a short rolling window of where I am now.

Google

Encrypted Timeline backupend-to-end encrypted, in Google’s cloud
Location sharingcurrent position

My home server (Docker)

Sync enginepulls every few hours, decrypts with my key, names new places
History MCP serverover a dozen read-only tools
Live-location MCP servershort rolling window

Assistants

Secure MCP Tunneloutbound-only; nothing on the server is exposed
ChatGPT and Claude
Figure 2. The three services and how assistants reach them.

Keeping it private

This is the most personal dataset I own, so the design starts from exposure. ChatGPT connects through OpenAI’s Secure MCP Tunnel, an outbound-only link, so no port on my server is open to the internet. The HTTP version of the servers uses OAuth 2.1.4 Every tool is read-only. Secrets never go into the code, and the test suite runs entirely on made-up coordinates in the middle of the Sahara, so no real location ever lands in a test fixture.

Built on unofficial Google interfaces, for my own data only.

The bug that made it fun

For weeks my timeline mysteriously stopped on August 4, even though my phone insisted it had backed up the day before. To get ground truth, I restored my timeline through Google’s own Android app running in an emulator and compared the two.

Here’s what I found. Google quietly splits the encrypted backup into multiple parts and lists the extra ones in an undocumented field. Nothing ever fetched past the first part, including the open-source tool I built on. One fix later, every part was fetched and all 8,551 segments came back: exactly the count Google’s app shows.

Extra parts are listed in an undocumented field of the backup metadata.

Aug 4Timeline stops; every later part is silently skipped.
8,551segments restored
Exact matchwith the count Google’s app shows
Figure 3. Following every part the metadata lists brought back all 8,551 segments. The number of parts shown is illustrative.

The result

My location history went from locked-away data to something I can just ask about. It’s private, self-hosted, and slightly unsettling how well it remembers.

References

  1. Anthropic. Model Context Protocol.
  2. arkenoi/timeline-export: export Google Maps Timeline (on-device Location History) to JSON.
  3. davenicoll/google-maps-location-sharing and costastf/locationsharinglib: fetch Google Maps shared locations.
  4. IETF. The OAuth 2.1 Authorization Framework (draft).