I've been running my own location-tracking platform on myself for about three months. Check on Mine is the elder-safety product I built, but I've been my own first user since January — partly dogfooding, partly because I genuinely want a searchable record of where I've been.
As of tonight I have 32,570 GPS pings going back to January 13. That's roughly one ping every four minutes of my life, around the clock, for 94 days.
So I turned it into a map.
map.cwfrazier.com is a single Python Lambda sitting behind API Gateway, backed by the existing checkonmine_activities DynamoDB table. The front end is Leaflet on CARTO dark tiles with the leaflet.heat plugin. Nothing exotic — the whole thing was about 300 lines of Python and HTML, shipped in one evening from a train between Biloxi and New Orleans.
The interesting bit wasn't the tiles or the heatmap layer. It was the clustering.
My first instinct was to group by the address field that Check on Mine's geocoder fills in for each ping. That gave me three entries that were all obviously home:
Same place, three different strings, depending on how confident the reverse-geocoder felt that day.
The fix was to cluster by coordinates instead — round lat/lon to three decimal places (roughly a 110-meter grid) and treat every ping that lands in the same cell as the same spot. Then, for the label, pick the most specific address string seen inside that cell (longest, most commas). That collapsed the three "home" entries into one cluster of 28,829 pings and gave me a clean ranked list.
With home winning by two orders of magnitude, the top-spots list was visually boring. I added a tab that filters out anything within 1 km of the #1 cluster, which surfaces the actually-interesting places: the gas station I apparently stop at a lot, the stretch of Dedeaux Road in Gulfport, the D'Iberville Walmart Supercenter, the few trips to Moss Point.
Little insight, a lot more useful than "you are at home most of the time."
The last piece was a pulsing red marker for current position. The Lambda just sorts all pings by timestamp and returns the most recent one as current. With a 30-second cache on the /data endpoint, you can refresh the page every 30 seconds and watch yourself move on the train.
I tested this by watching my own dot crawl from Biloxi across to Slidell while writing the Python that made it possible. That was a weirdly meta experience.
A time scrubber is obvious — drag a bar to replay the last 94 days. A "driving vs walking vs train" classifier based on speed between pings would make the dots more expressive. And I want to overlay my Spotify listening history on the same map, one day.
For tonight, though, I have 32,570 dots, a dark map, and a train rolling into New Orleans.