Note
This project was formerly known as gps-time-sync.
GPS / NTP Time Synchronization Tool for Windows
A tool to accurately synchronize your Windows PC clock using a GPS receiver or NTP server.
Designed for high-precision time alignment required for FT8 and other digital amateur radio modes.
Runs safely in Monitor-Only mode even without administrator privileges.
ChronoGPS is designed with one simple goal:
to provide accurate time with minimal user intervention.
- Use GPS or NTP depending on availability and environment
- Perform synchronization safely in the background while keeping the UI stable
- Provide a reliable time reference for FT8 and measurement use cases
Rather than visual effects, the focus is on accuracy, stability, and long-term operation.
For detailed explanations of ChronoGPS design decisions and synchronization behavior, please refer to the FAQ: 👉 FAQ (English)
- FT8 / FT4 operation requiring accurate PC time
- Portable / field operation (SOTA / POTA) without Internet access
- Long-term clock monitoring on a general-purpose Windows PC
- GNSS-based UTC reference with an inexpensive USB receiver
If you are interested in the design philosophy behind ChronoGPS —
including transparency, how administrator privileges are handled, and the idea of a monitor-only mode —
please see the detailed discussion below:
- 🔗 Why ChronoGPS (Discussion): #3
- 🌐 NTP Sync (RFC 5905) — 64-bit timestamps, offset/delay calculation via t1/t2/t3/t4, millisecond-level precision
- 🛰️ GPS Sync — Off / Instant / Scheduled modes, RMC-based UTC acquisition, duplicate sync prevention
Scheduled mode uses a GPS-reception-triggered approach with median jitter filtering.
This reduces jitter injection while allowing long-term drift monitoring. - ⏱️ FT8 Time Offset — Fine-tune clock in ±0.1s steps, designed for digital mode operation
- 📡 Satellite View — Real-time display of GPS / GLONASS / BeiDou / Galileo / SBAS / QZSS
- 🔒 Non-Admin Support (v2.5 enhanced) — Starts in Monitor-Only mode by default. Elevate only when sync is needed via the on-screen banner
- 🧵 Thread-Safe GUI — Worker thread + Queue + main thread updates prevent Tkinter freezes
- 🌍 16 Languages — Japanese, English, French, Spanish, German, Chinese (Simplified/Traditional), Korean, Portuguese, Italian, Dutch, Russian, Polish, Turkish, Swedish, Indonesian
- 🖥️ Windows-Native UX — System tray support, the close (X) button minimizes to the system tray, taskbar icon
Main window during GNSS synchronization. Time Error: −0.001 s.
Satellite information view (GPS / GLONASS / BeiDou / Galileo / SBAS / QZSS).
Starting with v2.5, the UAC dialog at launch has been removed.
ChronoGPS always starts in Monitor-Only mode by default.
Elevation is only requested when the user explicitly wants sync.
- No UAC dialog is shown
- GPS reception, satellite view, and NTP display are available immediately
- A banner at the top of the window shows: "Unlock Sync Features (Restart as Administrator)"
- Click the banner button → UAC dialog appears → Restart as administrator
- If you cancel the UAC dialog, Monitor-Only mode continues — the process is not terminated
- After elevation, the banner disappears and GPS/NTP sync becomes available
# Monitor-Only mode (default)
.\ChronoGPS.exe
# Sync mode (banner still appears if not admin)
.\ChronoGPS.exe --mode=sync- Windows 10 / 11
- Python 3.11+ (for script execution)
- GPS receiver (for GPS sync)
- Administrator privileges (for time synchronization)
- Place
ChronoGPS.exeandicon.icoin the same folder - Double-click
ChronoGPS.exeto launch (starts in Monitor-Only mode) - If time sync is needed, click the banner at the top to elevate
For automatic elevated startup at logon, see FAQ Q21.
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
python main.pyChronoGPS is designed to be built inside a venv (virtual environment).
Running PyInstaller in a global Python environment is not recommended,
as it may cause dependency contamination and reduce build reproducibility.
python -m venv .venv
.\.venv\Scripts\Activate.ps1pip install -r requirements.txt
pip install -r requirements-dev.txt
pip install -U pyinstallerpython -m pytest -qMake sure all tests pass before building the executable.
pyinstaller --noconfirm --clean --onefile --windowed `
--name "ChronoGPS" `
--icon ".\icon.ico" `
--add-data ".\icon.ico;." `
--add-data ".\icon.png;." `
--add-data ".\donate_qr.png;." `
--add-data ".\locales.py;." `
--add-data ".\locales_override.py;." `
--add-data ".\gps_time_sync_config.json;." `
--hidden-import "tkinter" `
--hidden-import "tkinter.ttk" `
--hidden-import "tkinter.messagebox" `
--hidden-import "tkinter.filedialog" `
--hidden-import "tkinter.scrolledtext" `
--hidden-import "admin" `
--hidden-import "startup" `
--hidden-import "shutdown_manager" `
--collect-submodules "tkinter" `
.\main.pyBuild policy
- Always use
--cleanto prevent contamination from previous build/dist artifacts - Since v2.5,
admin/startup/shutdown_managerare explicitly listed under--hidden-import - Only explicitly include required files — never bundle the entire project directory
After the build completes, ChronoGPS.exe will be created in the dist directory.
- The exe file uses the ChronoGPS application icon
- The tray icon intentionally uses a clock icon for better visibility
(to avoid loss of contrast at small tray icon sizes)
- Connect a GNSS receiver to your PC (USB GPS receiver recommended)
- Launch
ChronoGPS.exe— it starts in Monitor-Only mode by default - Click the banner "Enable Time Sync (Restart as Administrator)" to enable sync
- Select the COM port and baud rate (default: 9600), then click Start
- Click Sync GPS or enable Instant Sync — ChronoGPS will reference GNSS continuously
If your COM port does not appear in the list, you can type it manually (e.g.
COM16).
For NTP-only use, skip steps 1 and 4 — enter an NTP server and click Sync NTP.
- Connect your GPS receiver to the PC
- Select the COM port and baud rate (usually 9600)
- Click Start to begin receiving
- Set GPS sync mode to Instant or Scheduled
ChronoGPS uses GNSS (GPS, QZSS, etc.) as an absolute UTC time source.
For everyday FT8 / FT4 operation, Instant Sync is recommended.
Instant Sync is designed to:
- Calibrate the Windows system clock using GNSS
- Then monitor the offset while respecting the OS time model
- Apply only minimal, necessary, and explainable corrections when needed
The key point is that Instant Sync does not mean "rewrite the system time every second."
Note
What "Instant Sync is usually sufficient" means
It means you do not need to repeatedly force clock rewrites once the system clock has been properly calibrated.
It does not mean you should turn synchronization off afterward. Keeping Instant Sync enabled during operation is perfectly fine.
Instant Sync continuously references GNSS, but corrections are applied only when necessary.
It also does not mean GPS reception should be stopped. GPS reception may continue for monitoring, visualization, and verification purposes without any issue.
Interval Sync (Weak Sync) is intended for:
- Monitoring clock drift during long sessions
- Verifying GNSS reception stability
- Diagnostics and verification
For a deeper explanation of the design philosophy — including why Instant Sync works well for FT8/FT4, how Weak Sync behaves, and how ChronoGPS avoids injecting GNSS jitter into the OS clock — please see the FAQ:
Weak Sync (Interval) is primarily intended for monitoring.
When the offset remains within the threshold, no correction is applied by design.
Interval (Weak Sync) follows the model:
"collect samples every second → evaluate only when the interval is reached."
If the offset is within the threshold, the system clock is intentionally not adjusted,
preventing GNSS reception jitter from being injected while still monitoring drift.
Interval Sync is not designed for continuous clock correction.
For real-world FT8 / FT4 operation, Instant Sync is strongly recommended.
- ChronoGPS continuously collects GNSS time offset samples every second (without modifying the OS clock)
- When the configured interval is reached, the accumulated samples are evaluated to decide whether a correction is necessary
- If the median offset is within the threshold, ChronoGPS intentionally skips applying
SetSystemTimeto avoid injecting GNSS reception jitter into Windows
You may observe a gradual one-direction drift in the log, such as -0.03s → -0.05s.
In most cases, this represents the natural drift of the PC's system clock, not a synchronization error.
As long as the offset remains within the threshold, ChronoGPS will deliberately not correct it.
- Threshold: ±0.2 seconds
- Sample window: median of the last 30 seconds
- Enter an NTP server (default:
pool.ntp.org)- Recommended for Japan:
ntp.nict.jp
- Recommended for Japan:
- Click NTP Sync for immediate sync, or enable auto-sync
Note
Using GPS Sync and NTP Auto-Sync simultaneously
If GPS sync is active and NTP auto-sync is also enabled,
the two sources may repeatedly correct each other in a "ping-pong" effect,
resulting in unstable time accuracy.
- When GPS reception is stable, it is recommended to turn off NTP auto-sync
- Use NTP as a backup when GPS is unavailable, or for manual one-time sync
- The NTP Sync button (manual) is always available regardless of the auto-sync setting
If your FT8 timing is slightly off, enter an offset value (seconds) and click Apply.
Quick ±0.1s adjustment buttons are also available.
You may occasionally see small differences between the displayed
System Time, GPS Time, and NTP Time.
These differences are caused by update timing and display refresh intervals.
They do not indicate an error in actual time synchronization.
The internal synchronization logic maintains millisecond-level accuracy.
| Display | Meaning |
|---|---|
| In Use (GNSS) | GPS / GLONASS / BeiDou / Galileo primary satellites — used directly for time and position |
| In Use (SBAS) | WAAS / MSAS / EGNOS augmentation satellites — used for correction, not as a time source |
| Tracked | Received but not used in the time/position solution |
SBAS satellites (MSAS in Japan) may be tracked but not appear as In Use — this is normal behavior.
SBAS provides augmentation corrections, not a primary clock signal.
ChronoGPS uses GNSS primary satellites and NTP for time synchronization,
a design comparable to professional GNSS timing receivers.
QZSS (Quasi-Zenith Satellite System / Michibiki) will appear in the satellite view tab if supported by the receiver.
Some receivers disable QZSS NMEA output by default — an empty QZSS panel is normal behavior.
- Starting with v2.5, the UAC dialog at launch has been removed. ChronoGPS starts in Monitor-Only mode by default
- To enable time sync, click the banner at the top of the window to elevate
- The × button minimizes to the system tray. To fully exit, right-click the tray icon → Quit
- Default NTP server is
pool.ntp.org(can be changed to any preferred server)
ChronoGPS/
├── README.md
├── README.en.md
├── docs/
│ ├── FAQ.md
│ ├── FAQ.en.md
│ ├── weak-sync-diagram.en.png
│ └── weak-sync-diagram.ja2.png
├── main.py # Entry point
├── gui.py # Main GUI
├── startup.py # Argument parsing, mode selection, Mutex management (v2.5)
├── admin.py # Admin check, UAC elevation (v2.5)
├── shutdown_manager.py # Shutdown sequence management (v2.5)
├── config.py # Settings (JSON)
├── locales.py # Localization
├── locales_override.py # Localization overrides
├── nmea_parser.py # NMEA parser
├── ntp_client.py # NTP client
├── time_sync.py # Time synchronization
├── autostart.py # Auto-start management
├── tray_icon.py # System tray
├── requirements.txt # Dependencies
├── icon.png # App icon (PNG)
├── icon.ico # App icon (ICO)
└── gps_time_sync_config.json # Config file (auto-generated)
Official binaries are distributed via GitHub Releases. Always check the "Latest" release.
- Latest release: https://github.com/jp1lrt/ChronoGPS/releases/latest
- ChronoGPS.exe — Windows executable
- icon.ico — Application icon
Included files:
- ChronoGPS.exe — Windows executable (PyInstaller build)
- icon.ico — Application icon
- checksums.txt — SHA256 checksums for release files
Verify downloaded binary (PowerShell):
Get-FileHash .\ChronoGPS.exe -Algorithm SHA256Compare the printed hash with the corresponding line in checksums.txt attached to the release.
- Always download from the official GitHub Releases page (link above). Avoid unofficial sites or third-party distributions.
- All releases include a GPG signature (
checksums.txt.asc). Note that Windows Authenticode signing (which suppresses SmartScreen warnings) is not currently implemented. - VirusTotal scan results are published with each release for transparency.
- If you bundle ChronoGPS with another application or installer, please use the official binaries from GitHub Releases (the exact files covered by
checksums.txt). - If a rebuild is unavoidable, please publish a clear build identifier and SHA256 hashes for the distributed artifacts. (Same version number + different binary makes verification and support difficult.)
- Please do not modify and redistribute binaries in a way that could be mistaken for an official release.
- Issues reproducible with the official release are welcome in this repository.
- Issues specific to a third-party bundle/launcher/installer (packaging, permissions, config location, update behavior, etc.) should be handled by the bundling project first.
Some antivirus software may flag ChronoGPS.exe as suspicious. This is a known false positive caused by heuristic detection of PyInstaller-built executables. The application contains no malicious code.
All source code is publicly available and you can build the exe yourself.
- VirusTotal scan results (v2.5.3): https://www.virustotal.com/gui/file/4955b362af0535a8baea7d6b592405a760bf96948ae7802ca551ed87ca530f5a/detection
(3/72 detections — Arctic Wolf / Bkav Pro / SecureAge — all heuristic false positives) - This has been reported to Microsoft as an incorrect detection
-
Import the maintainer's public key from GitHub:
# Linux / macOS curl -s https://github.com/jp1lrt.gpg | gpg --import # Windows (PowerShell) Invoke-WebRequest -Uri https://github.com/jp1lrt.gpg -OutFile mypubkey.asc gpg --import mypubkey.asc
-
Verify the detached signature on
checksums.txt:gpg --verify checksums.txt.asc checksums.txt
You should see a "Good signature". Confirm the key ID and UID:
- Key ID:
864FA6445EE4D4E3 - UID:
Yoshiharu Tsukuura <jp1lrt@jarl.com>
- Key ID:
-
Compute the SHA256 of the downloaded asset and compare with
checksums.txt:# Windows PowerShell Get-FileHash ChronoGPS.exe -Algorithm SHA256 # Linux / macOS sha256sum ChronoGPS.exe
Ensure the printed hash exactly matches the corresponding line in
checksums.txt. -
If the signature is invalid or the key/UID differs, do NOT trust the files and contact the project maintainer.
MIT License — © 2026 Yoshiharu Tsukuura (JP1LRT)
See LICENSE for details.
Yoshiharu Tsukuura / 津久浦 慶治
Amateur Radio Station JP1LRT
- QRZ.com: https://www.qrz.com/db/JP1LRT
- GitHub: https://github.com/jp1lrt
If you find ChronoGPS useful, a small donation would be greatly appreciated
and help support future development ☕
