Geospatial · Browser-local · SVG · Next.js · 2026 · Solo — geospatial algorithm design, TDD implementation, interaction design, deployment

GeoStamp

Drop your Google Timeline history, see every trip on a cartographic SVG map, and export a shareable travel card — 100% browser-local.

The problem

Google Timeline shows raw location history chronologically — there is no way to isolate distinct trips, inspect spatial routes on a clean map, or produce a shareable card without uploading data to a third-party service. The underlying challenge is algorithmic: you must statistically identify a user's home location from dwell patterns, then cluster away-segments by spatial proximity and duration.

Architecture

Key decisions

01

Haversine + dwell-time home cluster

Home detection bins visits into ~1km grid cells (0.01° resolution), finds the maximum-dwell cell, then computes the centroid of all visits within 50km of that cell. This handles multi-unit buildings and commuter noise without requiring a pre-labelled 'home' place.

02

Spatial-gap trip grouping with time threshold

Adjacent away-segments (>50km from home) are merged when the spatial gap between them is <200km and the time gap is <24h. This correctly joins multi-leg journeys (fly + hotel + drive) while separating distinct trips with return-home gaps.

03

pathLength=1 animation without computing pixel length

Setting pathLength=1, strokeDasharray=1, and animating strokeDashoffset from 1→0 lets the browser's own rendering engine handle path-length measurement at any resolution, with no JavaScript pixel-length computation required.

04

Pure TypeScript — no external geospatial library

The entire spatial engine is self-contained and tree-shaken. No Turf.js, no proj4, no Leaflet. This makes the algorithm transparent, fully testable in isolation, and fast to load in the browser.

Metrics

23
TDD unit tests (vitest, all passing)
0
external geospatial library dependencies
2
Timeline export formats parsed (timelineObjects + semanticSegments)
0
bytes uploaded — fully browser-local