UTC --:--:--

Open Time Project

Grovestreet NTP

A public Stratum 1 GPS-synchronized NTP server providing precise time to our cul-de-sac and beyond!

NTP Server Time
--:--:--
 
Your clock offset
Measuring…
Comparing against the server
Your system time
--:--:--
Detecting timezone…

This server

Pool scores →
Hostname
Reference
GPS + PPS
Location
Netherlands
Hardware
Raspberry Pi 5 + TimeHAT v6
NTP Pool


Your sync stats

--

Clock

--

Traffic

--

GPS

--

How this works

The Open Time Project provides free, high-accuracy time synchronisation from a GPS-disciplined Stratum 1 server. Where a Stratum 2 server takes its time from other servers over the internet, this one derives it directly from GPS satellites, to nanoseconds.

The signal path

GPS satellites → u-blox NEO-M9N. The satellites carry atomic clocks and broadcast precise time. The receiver on the TimeHAT turns that broadcast into two separate outputs:

  • NMEA sentences - serial data carrying time of day, position and satellite info
  • PPS (pulse per second) - an electrical pulse on each UTC second boundary

PPS → SDP2 → PHC. The pulse runs over a direct PCB trace into SDP2, a pin on the Intel I226-LM NIC. The card's PHC (PTP Hardware Clock), backed by a TCXO (Temperature Compensated Crystal Oscillator), timestamps the exact instant the edge arrived.

ts2phc → PHC discipline. A pulse is defined to land on .000000000, so any other reading is error. ts2phc reads the timestamp, works out that error - "the PHC called it .000000247, so it is 247 ns fast" - and trims the PHC's frequency to match. That feedback loop is what holds the hardware clock to GPS within nanoseconds.

PHC → chrony → clients. chrony reads the disciplined PHC as its only selected source. The PHC counts in TAI (International Atomic Time, currently UTC + 37 s), so chrony applies that offset before answering in UTC.

What NMEA is actually for

NMEA does reach chrony, through gpsd's shared memory, but that refclock is configured noselect: chrony measures it and shows it, and never steers the clock with it. Serial framing leaves it about 45 ms behind the second it describes, against a pulse the NIC timestamps to within tens of nanoseconds. It earns its place as a cross-check on the receiver, not as a source of time.

The date is set once, at startup, from this server's own internet sources, and the PHC is seeded from it. After that the pulse alone keeps the clock true.

Holdover

If GPS is lost, the TCXO carries the clock unaided. At roughly 280 ppb stability that is about 1 ms of drift per hour, far longer than a reacquisition takes.

Hardware

Raspberry Pi 5, TimeHAT v6, TCXO-backed Intel I226-LM NIC with hardware timestamping, u-blox NEO-M9N GPS module.

GPS satellites atomic clocks in orbit u-blox NEO-M9N receiver on TimeHAT v6 gpsd parses NMEA Intel I226-LM PHC timestamps the edge ts2phc steers it chrony disciplines the clock NTS servers date at boot only Clients NTP over UDP 123 PPS on the second NMEA ~45 ms late TAI monitor only
The pulse fixes the instant; ts2phc holds the hardware clock to it and chrony serves from there. The dashed paths never steer the clock: NMEA is a cross-check, and the internet sources only seed the date at boot.

Resources