Signal-independent tracking

GPS is satellite-based; cellular is tower-based. Most "live tracking" products implicitly assume both work — when cellular drops, the live page goes blank. Where Is Tereza? was built so that the LIVE map keeps drawing through cell dead zones.

The problem

A walker on the Camino crosses 800 km of varied terrain. Cellular coverage along the way includes: 4G in towns, 3G in villages, EDGE in valleys, none at all in the Pyrenees, the Meseta, the high passes. Without a strategy, the publishing phone fails to POST GPS for hours, and the public map shows "last seen 4 hours ago" — even though the GPS chip has been recording fine the whole time.

How we handle it

Three layers, all implemented at the publishing app side (OwnTracks / Overland / GPSLogger / etc) and on our backend:

Layer 1 — Local buffering. Every supported app buffers unsent points to local SQLite or flat files. When connectivity returns, the queue flushes in chronological order, often within seconds. A 6-hour gap at 1-minute sampling = 360 buffered points, ~30 KB compressed — trivial.

Layer 2 — Server tolerance. Our ingest endpoint accepts points whose timestamp is older than the latest stored point. The points are inserted in the right place in the GPS stream, not appended at the end. So a 4-hour-old point that arrives NOW becomes part of the route at its real timestamp; the live map's "last seen" jumps backward as the gap fills in.

Layer 3 — Satellite fallback. For routes that cross zones where cellular literally never returns (Iridium-only deserts, mid-ocean), the Garmin inReach® integration provides a second publishing channel via Iridium. The two channels merge on the same map — wherever inReach® published a point, that's the position; everywhere phone-cellular published, that wins (denser data).

How the live map handles "stale"

A "stale" indicator appears on the public map when the latest point is more than 60 seconds old. The text shows the actual age ("synced 4m ago", "synced 1h ago"). A pulse animation slows down (5s instead of 2s) so the user has a calm visual cue without alarm.

Once a buffered batch flushes and the latest point becomes recent again, the indicator returns to "live" and the pulse returns to its normal rhythm. The transition is animated, not a jump.

What this enables

  • The line keeps growing retroactively. Buffered points flush whenever connectivity returns; the trail can jump forward by hours in a single update once the walker hits a café Wi-Fi or reaches a town. Followers see the morning's route show up in the late afternoon — not lost, just delayed.
  • The staleness indicator gives followers context. A static line on the map without explanation is alarming. A line with "synced 4h ago" tells the watcher why the dot hasn't moved — it's a signal problem, not necessarily a person problem. Combined with what they already know (Tereza is crossing a remote pass today, signal is expected to drop), the indicator turns "something might be wrong" into "this is the part of the trip we knew would be quiet". It doesn't magically remove worry — but it replaces an information vacuum with a small piece of truth, which is most of what worry feeds on.

Garmin® and inReach® are registered trademarks of Garmin Ltd. or its subsidiaries. This page is not affiliated with or endorsed by Garmin.


Need help? Contact support · Where Is Tereza?