Time01

A GNSS-disciplined Stratum-1 time server for my home network.

GNSS · Raspberry Pi · Networking

Status: v1.0 · Operational · September 2026

Overview

Time01 is a dedicated GNSS-disciplined Stratum-1 NTP server built around a Raspberry Pi 5 and a u-blox NEO-M9N GNSS receiver. It combines satellite-derived absolute time with a hardware 1 PPS signal, using gpsd and Chrony to discipline the system clock and serve precise time across my home network.

I built it to give my infrastructure a local and consistent time reference. Home Assistant, my Ubuntu server and Mac mini can synchronise against the same source, making logs, automations and time-series data easier to correlate. Time01 v1.0 now runs autonomously after reboot and distributes NTP across my segmented UniFi network.

The Idea

Because I spend a lot of my time experimenting with homelab servers, hardware and networking, I naturally follow people who build and explore similar things. One of them is Jeff Geerling, and one day I came across his video about building a GNSS-based time server.

I immediately loved the idea. GNSS satellites carry extremely precise time derived from atomic clocks, which means you can receive that timing signal yourself and use it as a reference inside your own network. Instead of relying entirely on distant internet time servers, your network can get remarkably close to the actual source of time. Completely local.

It also felt like the perfect project for me. I enjoy building something physical first, then figuring out the software and configuration through documentation, tutorials and other people’s projects. And once it works, I get to integrate it properly into my own infrastructure — networking, VLANs, firewall rules and all.

So I ordered the parts and decided to build one myself. Over the course of a morning, the hardware came together, GNSS and PPS started working, Chrony locked onto the signal, and the server became part of my network.

That is how my Time01 was born.

Architecture

Time01 is basically a small chain of hardware and software that turns a satellite timing signal into an NTP source for my network.

At the hardware side, it starts with a Raspberry Pi 5 1Gb RAM and a Jimmy Paputto GNSS HAT built around a u-blox NEO-M9N receiver. An active antenna receives signals from multiple GNSS constellations.

The receiver gives the Pi two useful things:

  • NMEA data, which tells the system what the current time actually is.

  • A 1 PPS signal. One very precise pulse every second, which gives a much more accurate reference for exactly where each second starts.

The PPS signal is exposed to Linux through /dev/pps0, while gpsd handles the GNSS data. Chrony then combines both: NMEA provides the absolute time, and PPS provides the precise second boundary. When everything is healthy, Chrony locks onto PPS and Time01 becomes a Stratum-1 NTP server.

From there, it is just another device on my home network. I made NTP available across my different VLANs, so systems such as Home Assistant, my Ubuntu server and Mac mini can use Time01 as their local time source.
Because I chose the Time01 as the NTP server in Unify for all my VLANs. It allows for all the devices on my network to be able use Time01 as their time server.
Public NTP servers are still configured as a fallback, but GNSS/PPS is the source I actually want the server to use.

I think the easiest way to picture it is:

What I like about this setup is that each part is relatively understandable on its own. The GNSS receiver tells me the time, PPS gives me the precise timing edge, Chrony combines the two, and the network lets the rest of my devices use it.

That simplicity is also what made the project so fun to build.

Hardware & Software

Hardware

Raspberry Pi 5 — 1GB
The main computer running the timeserver.

Jimmy Paputto L1 GNSS HAT
The board connecting the GNSS receiver to the Raspberry Pi.

u-blox NEO-M9N
The GNSS receiver itself. It can use multiple satellite constellations including GPS, Galileo, BeiDou and GLONASS.
This chip is located on the HAT.

Active L1 GNSS antenna
Placed near a window to give the receiver a usable view of the sky.

Raspberry Pi RTC battery
Keeps the Pi’s hardware real-time clock available between boots.

Raspberry Pi Active Cooler
Nothing exotic, just the standard active cooler to keep the Pi comfortable while running 24/7.

Gigabit Ethernet
Time01 is wired into my UniFi network rather than using Wi-Fi.

Software

Linux PPS
The Raspberry Pi exposes the hardware 1 PPS pulse from the GNSS receiver as /dev/pps0, giving the software a precise marker for the start of every second.

Jimmy Paputto GNSS tools
The HAT uses its own library and a small bridge that makes the GNSS data available in a form that gpsd can use.

gpsd
Reads the GNSS/NMEA data and makes the timing information available to the rest of the system.

Chrony
This is where everything comes together. Chrony uses NMEA to know which second it is and PPS to know exactly when that second starts. When everything is working correctly, PPS becomes the selected reference and Time01 operates as Stratum 1.

systemd
Keeps the different services starting in the correct order and makes sure the complete stack comes back automatically after a reboot. I also use a small systemd service to keep Energy Efficient Ethernet disabled, after it caused a packet-loss problem during the build.

Current status

Time01 v1.0 is fully operational and now runs as a permanent part of my home network.

The server receives a stable GNSS fix from multiple satellite constellations and Chrony uses the hardware PPS signal as its selected reference. When healthy, Time01 reports itself as Stratum 1 and serves NTP across my Core, Servers and IoT networks. This allows for all the devices on those networks to use my NTP server as their time server.

Home Assistant, my Ubuntu homelab server and Mac mini have all been confirmed as real clients of Time01. The complete stack also survives a reboot without manual intervention: the GNSS bridge, gpsd, Chrony, PPS device and my Ethernet EEE fix all come back automatically.

At this point, I consider the original Time01 project finished. Future work such as extra monitoring, PTP, hardware timestamping or other network services would be additions on top of the existing v1.0 system rather than requirements to make it work.

Related Lab Notes

Previous
Previous

Home Intelligence