Visual timeline map: replay any trip second by second, fully offline
GPS Speedometer 1.3 adds a visual timeline map — a route coloured by speed, a scrubbable time bar, and 10x/60x/300x playback that answers 'where was I at 7:42?' without uploading a single coordinate.
A trip summary tells you a trip was 12.7 km and took 32 minutes. It does not tell you that eight of those minutes were spent stationary at three separate places, that you crawled for the first kilometre and then held 50 km/h across the middle, or where exactly you were when your phone rang at 21:10.
That gap is what the visual timeline map in GPS Speedometer 1.3 closes. It takes a recorded trip and lays it out twice at the same time: once in space, as a route on a map coloured by how fast you were moving, and once in time, as a scrubbable bar where every column is a moment of the trip. Drag the bar and a marker walks the route. Tap play and the whole trip replays at 10×, 60× or 300× real time.
Everything happens on the phone. The coordinates never leave the device.
What a timeline map actually is
If you have used a timeline visualizer for a GPX or Google location export, you know the shape of the idea: a track is not just a line, it is a line with a clock attached. Every point carries a timestamp, so the same data can be read two ways.
- Read it as geography and you get a route: where you went, which streets, how far.
- Read it as a timeline and you get a story: when you left, how long you sat at that junction, which stretch you actually made time on.
Most speedometer and GPS-logger apps show you only the first reading. You get a static polyline and a summary card. The timeline map shows both readings side by side and keeps them locked together, so moving the playhead on the time bar moves the marker on the map, and tapping a segment jumps both.
The route is coloured by speed, not by nothing
A single-colour track wastes the map. In the timeline map every metre of the route is painted with the speed you were doing there:
| Colour | Speed | What it usually means |
|---|---|---|
| Grey-blue | under 5 km/h | Idling, waiting, walking the bike |
| Green | 5–30 km/h | City crawl, traffic, dense streets |
| Blue | 30–60 km/h | Normal urban and suburban flow |
| Orange | over 60 km/h | Open road |
| Red | over your speed limit | The limit you set in the app’s speed alert |
That last row matters: if you have set a speed limit for the speed alert, the same limit recolours the route. A trip where you drifted over the line shows red exactly where it happened, on the map, with a timestamp — not as a number in a summary you have to take on faith.
The colours use a lightly smoothed speed (a five-sample rolling average) purely so the line reads as a line. Raw GPS speed jitters a couple of km/h every second, and painting it raw across a colour threshold turns a road into a dotted mess. The numbers you read and the bars you scrub are always the raw samples — the smoothing is for your eyes, not for the data.
Stops are found automatically, not guessed at
The most useful thing a timeline can tell you about a trip is usually where the time went. So the app splits every trip into moving segments and stops before it draws anything.
The rule is deliberately conservative:
- A sample counts as stopped when speed is under 1 m/s (3.6 km/h).
- A run of stopped samples only becomes a real stop if it lasts at least 45 seconds. A red light does not deserve a marker.
- A run of moving samples only becomes a real moving segment if it lasts at least 20 seconds. A three-second twitch inside a long wait is not “setting off”.
- Runs shorter than those thresholds get absorbed into their neighbours, shortest first, until only real segments remain.
The result is the summary line — 0:32:09 total · 21 min moving · 3 stops (10 min) — and a row of tappable chips underneath: 20:50 · 1.20 km in 3 min, 20:53 · stopped 2 min, 20:56 · 3.30 km in 6 min, and so on. Tap any chip and both the map and the playhead jump to the start of that segment. Every stop also gets its own grey dot on the map, because a place where you sat for six minutes is invisible on a plain route line.
The time bar is a clock, not a distance ruler
This is the detail that makes a timeline map different from a route map with a slider on it.
The bar is drawn against time, not against distance or sample index. Ten minutes parked and ten minutes at 60 km/h occupy the same width. That is exactly what you want when the question is “how long did this take?” — a distance-based bar would squash your stops down to nothing, which is precisely the information you were looking for.
Every column takes the maximum speed in its slice, never the average. A ten-second sprint inside a two-minute column is real and should be visible; averaging would erase it. Grey columns mark the stop segments, and the tick labels along the bottom are actual clock times, spaced at whatever interval fits — 1, 2, 5, 10, 15, 30 minutes, or hours for long trips.
Drag anywhere on the bar and the readout card updates live:
- Wall-clock time and elapsed time (
21:10:14 · +0:19:55) - Speed at that instant, in your chosen unit — km/h, mph or knots — turning red if it is over your limit
- Distance travelled so far
- Altitude at that point
Values between two GPS samples are interpolated, so scrubbing feels continuous rather than stepping between fixes.
Playback at 10×, 60× and 300×
Real time is useless for a trip that took an hour. The timeline map offers three speeds:
- 10× — a six-minute trip in 36 seconds. Good for watching a specific manoeuvre or a tricky junction.
- 60× — one minute of driving per second. The default, and the right one for a normal commute.
- 300× — five minutes per second. For long-haul routes where you want the shape of the whole day.
Playback runs at 25 frames per second and the map follows the marker, but only when the marker gets close to the edge of the view. Recentring every frame makes a map that shakes and cannot be zoomed; recentring at the edge lets you pinch in on a junction and keep watching. Touch the map at any time and following switches off completely, so you stay where you put yourself. Drag the time bar and playback pauses — you cannot fight the clock and the playhead at the same time.
Fully offline, because that is the whole point of this app
GPS Speedometer has always been a 100% offline speedometer: no account, no sign-in, one permission. The timeline map does not change that.
- Your coordinates come from the local SQLite database on the phone. There is no server call to fetch a trip, because there is no server.
- Nothing about the trip is uploaded. Not the route, not the timestamps, not the stops.
- The only network traffic is OpenStreetMap map tiles, and only for map squares you have not viewed before. Those requests carry a map tile coordinate, not your identity, and once a tile is cached the same area opens again with no connection at all.
- The map renders with osmdroid rather than Google Maps, so the app still carries no Google Play Services dependency and still installs on de-Googled and older devices.
If you fly with the phone in airplane mode and open a trip you have already looked at, the timeline map works exactly as it did on the ground.
Built to stay smooth on cheap phones
GPS Speedometer targets Android 5.0 and up and is regularly run on hardware nobody would call fast. A trip recorded at one sample per second over two hours is 7,200 points, and drawing 7,200 map segments per frame on a budget phone is not going to end well.
So the map decimates: at most 3,000 points are drawn, evenly sampled across the trip, which is far more than a phone screen can resolve anyway. The time bar buckets points into 3 dp-wide columns, so a two-hour trip and a ten-minute trip both cost the same to draw. Segment detection and cumulative-distance maths run on a background thread before anything reaches the screen, so opening a long trip does not freeze the UI.
The whole feature added no new dependencies. No charting library, no Compose, no map SDK swap — a custom View drawing rectangles on a Canvas, and the osmdroid instance the app already had.
How to open it
- Record a trip as usual — the speedometer logs automatically while it is measuring.
- Open the Trips tab and tap the trip you want.
- On the trip detail screen, tap Timeline map.
That is it. The trip opens fitted to the whole route, at the first second, ready to play.
What it does not do
Being straight about the edges:
- It replays your own recorded trips. It is not a location-history importer; there is no Google Takeout or GPX ingest yet.
- Altitude comes from the GPS fix, which on phones is far less accurate than horizontal position. Read it as a rough indication.
- Very short trips (a couple of minutes) will show a bar with few columns and probably no detected stops, which is correct but not very interesting.
- Stop detection uses fixed thresholds. A slow crawl in gridlock at 4 km/h reads as movement, because it is.
Why we built it
Every extra number a speedometer shows you is a number you have to trust. A timeline map is the opposite: it hands you the raw shape of what happened and lets you check the summary against it. Twenty-one minutes of moving out of thirty-two is not an abstraction once you can see the three grey blocks that account for the rest.
And because it all runs on the phone, from a database on the phone, there is nothing to sign up for and nothing to leak.
GPS Speedometer is free on Google Play — an offline GPS speed tracker with an analog and digital speedometer, HUD mode, km/h / mph / knots, a speed-limit alert, a trip odometer, local trip history, and now a visual timeline map.