Two clocks, and only one of them measured anything
There are two clocks on a boat running Race Control. The instruments carry a GPS clock, disciplined by satellite. The tablet carries an ordinary Android clock, set from the network when it last had one and drifting quietly ever since. Between them there is typically a difference of seconds.
Seconds do not matter for most of what a tablet does. They matter here because almost everything on the pre-start screen answers a question of the form how old is this?, and every one of those answers is a subtraction between two timestamps.
So freshness is judged source against source. Subtract a source timestamp from a tablet timestamp and the error goes straight into the answer, and the direction decides how bad it is. One way round, a reading three seconds old looks eight, and a live instrument is written off as dead. The other way, a reading that stopped arriving a minute ago still looks fresh, and a crew makes a call on a number the boat has not produced since the last leg. The second is the dangerous one, and it is the one nobody notices.
A reading older than five seconds is not shown. It becomes an em dash — not a zero, and not the last value that happened to arrive.

The offset, not the timestamp
The obvious way to stay in the boat’s time base is to read now as the timestamp on the most recent packet. It works perfectly while packets keep arriving and fails the instant they stop: the countdown to the gun freezes at the last packet, during a start sequence, and every reading’s age freezes with it, so a stale value stays eternally fresh and never falls back to a dash.
So the tablet does not carry a copy of the boat’s latest timestamp. It carries the difference between the two clocks:
The boat’s clock, ticked forward by the tablet’s crystal between packets. While the feed is up the offset is re-derived at every packet, so drift never accumulates. When the feed drops, the projection keeps running: the countdown continues in the boat’s time base, and ages measured against it keep growing, so readings correctly go stale.
Two details keep it from lurching. A packet whose timestamp is not newer than the last one is ignored, because network delivery reorders packets and adopting an older stamp would step the countdown visibly backwards. A large backwards jump — ten seconds or more — is not disorder but a genuine re-anchor, such as switching telemetry source, and it is taken immediately.
When the clock arrives separately from the data
On some instrument networks the clock does not come with the readings. In the NMEA 0183 sentences a wifi gateway puts on the network, exactly one sentence type carries a date and a time — the position and speed one. Wind, heading and depth sentences carry no time at all.
Verbatim is the load-bearing word. The tempting refinement is to stamp an untimed sentence with the anchor plus however long the tablet says has elapsed since — which sounds more precise and is the original mistake in a new costume, because it measures one clock’s interval against another clock’s origin. A burst of wind sentences between two once-a-second position sentences therefore all share one timestamp. That is not an approximation; the protocol does not say when those measurements were taken, and a timestamp invented to look precise is a lie with extra decimal places.
Two edge cases are handled rather than left to fall out. A position sentence that has lost its fix still anchors the clock and publishes no position — a receiver that cannot see enough satellites has not forgotten what time it is. And before the first timed sentence the tablet’s clock stands in, badged on screen, with the first real timestamp replacing it and warning as it does: a wind-and-depth boat with no GPS on the network must still produce readings.
What import does with a file’s own clock
The same rule reaches the files you upload. An NMEA 0183 sentence log takes its timing from the file’s own GPS sentences: the first RMC or ZDA sets the clock and every later line inherits it, so lines logged before that first fix have no time to stand on and are dropped — and counted in the preview rather than dropped in silence. Where a logger writes a timestamp at the head of each line, that timestamp wins for its line.
Where two files disagree, the preview says so before anything is ingested. The time range tile is the thing to check hardest: if it is not the day you sailed, you have the wrong file or a clock problem. And a wall-clock suspect banner appears when the sniffer saw clock jumps or odd epochs in the timestamps — the samples still import, the file’s absolute times are flagged as untrusted, and anything that aligns by time treats them with suspicion until they are corrected.
Expedition is the case where a file is not wrong, only unmarked: it writes its event times venue-local with no zone marker, so an events import asks which venue you sailed and anchors the guns to UTC from there. Leave it on UTC at a venue that is not, and the guns land hours from the telemetry. It is repairable without re-uploading — the import carries a Re-anchor events button that re-reads the file the server kept.
One clock per question
There is one deliberate exception on the tablet, and it is the rule applied correctly rather than a loophole. Your tuning sheets, polar and sail wardrobe are downloaded and cached, and each screen says how old its copy is — targets from 2 h ago. That age is measured on the tablet’s clock at both ends, because what it dates is a download the tablet received.
Ask who witnessed the event, and use that clock to measure it.
Once the samples are ashore, one clock is what makes the debrief readable at all: channels from different instruments, and media from different cameras, sit on one axis, and the player’s cursor reads the same instant across every strip at once.

What this does not fix: through a long outage the projection drifts at the tablet’s rate, because the tablet’s crystal is what ticks between packets; before any packet there is no boat clock at all; and the platform cannot audit the source clock. A misconfigured gateway reporting the wrong date produces a self-consistent set of intervals that are all correct relative to one another and all filed under the wrong day.
Read the method
The documentation this post draws on.
- The boat’s clock — Why the tablet stamps nothing: the instruments’ clock carried forward as an offset, freshness judged source against source, and the one question the tablet does answer.
- Importing telemetry — The five ways a day of sailing gets in, what each format needs from you, and how the preview, the commit and the status line work.
- Channel mapping — Three kinds of channel name and which is which: the standard registry, your own custom: channels, and whatever your files happen to call things — plus the correction you only make once, the ledger of columns nobody has claimed, and who may change any of it.