Timeline #
A self-hosted replacement for Google Maps Timeline. An Android app records your location with low battery use, a small Go service stores every fix in SQLite, and a web UI shows each day as visits and trips, with editing meant to be better than Google's.
Status: experimental. Collection (app and upload), Google Timeline import and a debug day view work; visit/trip detection, place matching and the editor are next. Everything is subject to change, and the current web UI and app screens are stopgaps that will be largely rewritten. No backwards compatibility before 1.0.
Layout #
| Path | Contents |
|---|---|
android/ |
Kotlin app: low-power capture, local outbox, batched uploads |
cmd/, internal/ |
Go service: ingest API, Google Timeline importers, day queries |
web/ |
Svelte + MapLibre frontend, embedded in the service binary |
deploy/ |
Rootless Podman Quadlet units and deploy instructions |
docs/ |
App–service contract |
Design and roadmap: PLAN.md. Upload contract: docs/ingest-api.md.
Development #
Tools are pinned with mise: mise install.
mise run test # Go tests
mise run dev # service on 127.0.0.1:8080 with ./data
node scripts/seed-demo.mjs # synthetic demo day
mise exec -- npm --prefix web run dev # frontend dev server (proxies the API)
mise run apk # signed APK in dist/ (creates a key on first run)
mise run image # container image localhost/timeline:latest
The Android build needs the Android SDK; set sdk.dir in android/local.properties.
Deployment #
The service runs as a container behind a reverse proxy on a private network; it has no auth of its own. See deploy/README.md.
Importing Google Timeline #
Export from the phone (Settings › Location › Location services › Timeline › Export) or use a Takeout archive, then:
curl --data-binary @Timeline.json 'https://<host>/api/v1/import?name=Timeline.json'