โฑ Grovestreet NTP

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

Checking...
NTP Server Time
--:--:--
Loading...
Your Clock Offset
Calculating...
Comparing to server time
Your System Time
--:--:--
Detecting timezone...
--
Stratum Level
--
Minimum Accuracy
--
Unique Clients (24h)
--
NTP Requests (24h)
--
Uptime
Hostname ntp.grovestreet.zip
Reference GPS + PPS
Location Netherlands ๐Ÿ‡ณ๐Ÿ‡ฑ
Hardware Raspberry Pi 5 + TimeHAT v6
NTP Pool โ†’ pool.ntp.org
europe.pool.ntp.org
nl.pool.ntp.org

๐Ÿ”ง Sync Your Clock

Windows GUI Configuration

1. Open Settings โ†’ Time & Language โ†’ Date & Time

2. Click Additional clocks (or Related settings โ†’ Additional date, time & regional settings)

3. Click Internet Time tab โ†’ Change settings

4. Enter the server address and click Update now:

ntp.grovestreet.zip

Command Line (Administrator)

Open Command Prompt as Administrator and run:

w32tm /config /manualpeerlist:"ntp.grovestreet.zip" /syncfromflags:manual /update
net stop w32time && net start w32time
w32tm /resync

Verify Synchronization

w32tm /query /status
w32tm /stripchart /computer:ntp.grovestreet.zip /samples:5

macOS GUI Configuration

1. Open System Settings (or System Preferences on older macOS)

2. Go to General โ†’ Date & Time

3. Click Set date and time automatically and enter:

ntp.grovestreet.zip

Terminal Commands

One-time sync:

sudo sntp -sS ntp.grovestreet.zip

Permanent configuration:

sudo systemsetup -setnetworktimeserver ntp.grovestreet.zip
sudo systemsetup -setusingnetworktime on

Ubuntu / Debian (systemd-timesyncd)

# Edit configuration
sudo nano /etc/systemd/timesyncd.conf

# Add under [Time]:
[Time]
NTP=ntp.grovestreet.zip

# Restart service
sudo systemctl restart systemd-timesyncd
timedatectl timesync-status

Using Chrony (Recommended)

# Install chrony
sudo apt install chrony

# Edit config
sudo nano /etc/chrony/chrony.conf

# Add at the top:
server ntp.grovestreet.zip iburst

# Restart
sudo systemctl restart chronyd
chronyc sources -v

RHEL / Fedora / Rocky

sudo dnf install chrony
sudo nano /etc/chrony.conf
# Add: server ntp.grovestreet.zip iburst
sudo systemctl enable --now chronyd
chronyc tracking

Arch Linux

sudo pacman -S chrony
echo "server ntp.grovestreet.zip iburst" | sudo tee -a /etc/chrony.conf
sudo systemctl enable --now chronyd

Active Directory Group Policy

Configure via Group Policy Management (gpmc.msc):

Computer Configuration
  โ†’ Administrative Templates
    โ†’ System
      โ†’ Windows Time Service
        โ†’ Time Providers
          โ†’ Configure Windows NTP Client

Settings:
  NtpServer: ntp.grovestreet.zip,0x9
  Type: NTP
  CrossSiteSyncFlags: 2
  ResolvePeerBackoffMinutes: 15
  ResolvePeerBackoffMaxTimes: 7
  SpecialPollInterval: 3600
  EventLogFlags: 0

PowerShell (Domain Controllers)

# On PDC Emulator
w32tm /config /manualpeerlist:"ntp.grovestreet.zip" /syncfromflags:manual /reliable:yes /update
Restart-Service w32time
w32tm /resync /rediscover

Note: Only configure the PDC Emulator to sync externally. Other DCs sync from it via the domain hierarchy.

DHCP Option 42 (NTP Servers)

Configure your DHCP server to distribute the NTP server address automatically to all clients.

ISC DHCP Server

# /etc/dhcp/dhcpd.conf
option ntp-servers ntp.grovestreet.zip;

Windows DHCP Server

# PowerShell
Add-DhcpServerv4OptionDefinition -OptionId 42 -Name "NTP Servers" -Type IPv4Address -MultiValued
Set-DhcpServerv4OptionValue -OptionId 42 -Value "178.238.99.189"

# Or via GUI:
# DHCP Manager โ†’ Server Options โ†’ Configure Options
# โ†’ 042 NTP Servers โ†’ Add IP address

pfSense / OPNsense

Services โ†’ DHCP Server โ†’ [Interface]
  โ†’ Other Options โ†’ NTP Server 1: 178.238.99.189

Ubiquiti UniFi

Settings โ†’ Networks โ†’ [Network] โ†’ DHCP
  โ†’ DHCP NTP Server: 178.238.99.189

Get Server Time via curl

This server responds to curl and other CLI tools with the current GPS-disciplined time directly. No NTP client required โ€” just a terminal.

Quick Start

curl ntp.grovestreet.zip

Returns ISO 8601 UTC timestamp, e.g. 2026-02-08T14:23:45.123Z

Output Formats

Use the ?format= parameter to choose how the time is displayed:

# ISO 8601 (default)
curl ntp.grovestreet.zip
# โ†’ 2026-02-08T14:23:45.123Z

# Unix timestamp (seconds since epoch)
curl "ntp.grovestreet.zip?format=unix"
# โ†’ 1738938225.123456

# Human-readable
curl "ntp.grovestreet.zip?format=human"
# โ†’ Sunday, February 08, 2026 14:23:45.123456 UTC

# Full server card with stats
curl "ntp.grovestreet.zip?format=all"

Timezone Support

Add ?tz= with any IANA timezone name to get localized output. The default is UTC.

# Amsterdam (CET/CEST)
curl "ntp.grovestreet.zip?tz=Europe/Amsterdam"
# โ†’ 2026-02-08T15:23:45.123+0100

# New York (EST/EDT)
curl "ntp.grovestreet.zip?tz=America/New_York"
# โ†’ 2026-02-08T09:23:45.123-0500

# Tokyo (JST)
curl "ntp.grovestreet.zip?tz=Asia/Tokyo"
# โ†’ 2026-02-08T23:23:45.123+0900

# Combine format and timezone
curl "ntp.grovestreet.zip?format=human&tz=Europe/Amsterdam"
# โ†’ Sunday, February 08, 2026 15:23:45.123456 Europe/Amsterdam (UTC+01:00)

Discover Timezones

Don't know your timezone identifier? Search for it:

# List all available timezones
curl "ntp.grovestreet.zip?format=tzlist"

# Search for a specific region
curl "ntp.grovestreet.zip?format=tzlist" | grep -i amsterdam
# โ†’ Europe/Amsterdam

curl "ntp.grovestreet.zip?format=tzlist" | grep -i "new_york"
# โ†’ America/New_York

Timezone names follow the IANA Time Zone Database (also known as the Olson database or tz database). Full reference: Wikipedia โ€” List of tz database time zones

Dedicated Endpoint

The /time path works the same way but is always plain text โ€” useful for browser access or scripts that set a custom User-Agent:

# These are equivalent:
curl ntp.grovestreet.zip
curl ntp.grovestreet.zip/time

# Works in browsers too:
# https://ntp.grovestreet.zip/time?format=human&tz=Europe/Amsterdam

Response Headers

Every response includes machine-readable headers for programmatic use:

# Inspect headers with -v or -I
curl -I "ntp.grovestreet.zip?tz=Europe/Amsterdam"

# X-Server-Timestamp: 1738938225.123456  (Unix time, always UTC)
# X-Stratum: 1                           (NTP stratum level)
# X-Timezone: Europe/Amsterdam           (Requested timezone)

Supported CLI Tools

The server automatically detects these tools and responds with plain text instead of the web dashboard:

curl ยท wget ยท HTTPie ยท Python requests ยท PowerShell ยท Go http.Client ยท aiohttp ยท lwp-request ยท fetch

If your tool isn't detected, use the /time endpoint directly.

๐Ÿ“Š Real-time Statistics

Historical Statistics โ†’
Server Tracking Info โ†’
Time Reference --
Minimum Accuracy --
Current Accuracy --
Root Delay --
Root Dispersion --
Traffic Statistics โ†’
NTP Requests/sec --
Traffic Rate --
NTP Requests (10m) --
Active Clients (10m) --
Dropped Packets --
GPS Status โ†’
Satellites Locked --
Fix Quality --
HDOP --
Your Sync Stats
IP Address --
First Seen --
Last Seen --
Query Count --
Historical Statistics โ†’

๐Ÿ“ก About This Project

The Open Time Project provides free, high-accuracy time synchronization using a GPS-disciplined Stratum 1 NTP server. Unlike typical Stratum 2+ servers that sync from other NTP servers over the internet, this server derives time directly from GPS satellites with nanosecond-level precision.

The Signal Path

GPS Satellites โ†’ u-blox NEO-M9N: GPS satellites carry atomic clocks and broadcast precise time signals. The u-blox NEO-M9N GPS module receives these signals and produces two outputs:

NMEA โ†’ gpsd โ†’ Chrony: The NMEA data flows through gpsd (GPS daemon) which parses it and shares via shared memory. Chrony reads this for coarse time-of-day, but NMEA has ~45ms latency due to serial transmission โ€” not precise enough on its own.

PPS โ†’ SDP2 โ†’ PHC: The PPS signal is routed via a direct PCB trace to the Intel i226 NIC's SDP2 (Software Defined Pin). When the pulse arrives, the NIC's PHC (PTP Hardware Clock) โ€” backed by a TCXO (Temperature Compensated Crystal Oscillator) โ€” timestamps exactly when it received the pulse.

ts2phc โ†’ PHC Discipline: The ts2phc service reads these timestamps from /dev/ptp0. Since PPS pulses are defined to arrive exactly at .000000000, ts2phc can calculate the error. For example: "PHC said pulse arrived at .000000247 โ€” that's 247ns fast." It then adjusts the PHC oscillator frequency to correct the drift, creating a continuous feedback loop that keeps the hardware clock aligned to GPS atomic time within nanoseconds.

PHC โ†’ Chrony โ†’ NTP Clients: Chrony reads the GPS-disciplined PHC directly as its primary time source. The PHC runs in TAI (International Atomic Time = UTC + 37 seconds), so Chrony applies the offset correction internally before serving UTC to NTP clients.

Holdover

If GPS signal is temporarily lost, the TCXO maintains timing accuracy. With ~280ppb stability, the clock drifts only ~1ms per hour โ€” plenty of time for GPS to reacquire.

Hardware

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

๐Ÿ”— Resources