-
Notifications
You must be signed in to change notification settings - Fork 0
Roadmap
Mission: a free, open (MIT) and dependency-light toolkit for validating, evaluating and
studying network time. It should be useful to engineers who deploy and certify NTP/PTP, and
to researchers who publish on clocks and time transfer, and it should interoperate with the tools
both groups already use (see the tools landscape). Items are
GitHub issues, labelled industry,
research, community, good first issue and help wanted.
Reviewed 3 October 2026.
| Audience | Today they use | What ntpstats should give them |
|---|---|---|
| Operators (NTP/NTS, cloud, enterprise) | chronyc, ntpq, Prometheus/Grafana, vendor GUIs | Statistics, masks and alerts on the dashboards they already have (#36); event detection (#23); support for the new daemons (#21) |
| PTP / telecom / TSN engineers | linuxptp, Wireshark, PTP Track Hound, Calnex/VIAVI/Keysight software | Free, transparent PTP capture analysis and time-error metrics (#19, #20); import of instrument exports (#35); CI checks for devices and firmware (#36) |
| Regulated users (finance, energy, critical infrastructure) | Vendor reports, manual evidence | A defensible UTC error bound and an archivable audit report (#22); holdover planning for GNSS outages (#26) |
| Metrologists / time labs | Stable32, TimeLab, allantools, CGGTTS tools | Proven agreement (#28), format and API compatibility (#33), spectra and noise fits (#25), cornered hat and covariance (#27), GNSS time transfer inputs (#34) |
| Networking and systems researchers | Ad-hoc scripts, OMNeT++/INET, ns-3, RIPE Atlas, NTP Pool data | Public datasets as inputs (#34), trace-driven bench and simulator interop (#29), an open longitudinal dataset (#30), citable software (#38) |
| Trend (2025–2026) | Consequence |
|---|---|
| PTP is the accuracy frontier: IEEE 1588 roll-up revision, NTS for PTP (draft -04), G.8273.2 class C/D | Analyse PTP packets and time error (#19, #20) |
| New daemons and stacks: ntpd-rs (Ubuntu 27.04 default), chrony 4.9, Meta's facebook/time, OCP Time Card | Parse what people actually run, and validate advertised uncertainty bounds (#21) |
| Regulation asks for evidence: MiFID II RTS 25, DORA, NIS2 | Error bounds and audit reports (#22) |
| GNSS jamming/spoofing is routine | Event detection and holdover prediction (#23, #26) |
| IETF: Roughtime (Experimental RFC approved), NTS pools, NTPv5, RFC 9769 | Measure the new protocols as they deploy (#24) |
| Measurement research at Internet scale (NTP Pool studies in PACMCS'24 and NDSS'26, NTS adoption surveys) | Read public datasets and publish our own (#34, #30) |
| Datacenter sync research (Huygens, Sundial, Firefly, SyncWise) and TSN simulation | Trace-driven bench, PTP servos, simulator interop (#29) |
- ✅ NIST SP 1065 test suites reproduced to 7 digits, MTOT bias correction, TTOT. (#28, first part)
- ✅ Stable32 files,
ntpstats convert, allantools-compatible API. (#33; TimeLab.timwaits for sample files) - ✅ Prometheus exporter, Grafana dashboard, alert rules, compose stack. (#36, first part)
- ✅ Code of conduct, security policy, issue forms, GHCR image. (#38, first part)
- ✅ PTP in captures: offset, per-direction delay, PDV, one-/two-step, E2E/P2P, NTS4PTP TLVs. (#19)
- ✅ Time-error metrics: max|TE|, cTE, dTE_L/H, max|TEL|, 1PPS/TIC input, limits and masks. (#20)
- ✅ More sources: linuxptp
pmcandptpchecklive, w32tm, Prometheus import (ntpd-rs, chrony_exporter), ClockBound/fbclock bound validation. Time Card, Timebeat and chrony 4.9 log checks wait for sample data. (#21) - ✅ Instrument import profiles (TOML, built-ins for generic TIC/TE layouts); vendor profiles from contributed samples. (#35)
- ✅ UTC traceability and compliance report (
ntpstats audit). (#22) - ✅ Anomaly and change-point detection (
ntpstats events, UI list). (#23) - ✅ CI integration: a GitHub Action (
uses: thiagodefreitas/NetworkTime@v2.10.0) and pytest assertions. OpenTelemetry export remains. (#36)
- ✅ Roughtime client and consistency checks, NTS-KE pools, the current NTPv5 draft, RFC 9769 interleaved mode, all in the weekly Live interop. (#24)
- ✅ Frequency domain and h_α noise fitting. (#25)
- ✅ Holdover and time-error prediction. (#26)
- ✅ Three-cornered hat and Groslambert covariance. (#27)
- Cross-validation, remaining parts: Stable32 CIs/EDF, a public long-term dataset. (#28)
- Ecosystem interop, remaining part: TimeLab
.tim(✅htotdev). (#33) - ✅ Research data sources: RIPE Atlas, NTP Pool, CGGTTS (with common view), RINEX clock, Circular T; NTS campaign files via CSV profiles. (#34)
- ✅ Open measurement dataset from the interop runs (monthly), versioned with each release. (#30)
- ✅ OpenTelemetry export. (#36)
- ✅ EDF cross-check against the SP 1065/Stable32 approximations; comparison with Stable32 output files waits for contributed runs. (#28)
- ✅ Roughtime compatibility with draft-08 servers (Cloudflare).
- ✅ In-browser edition (Pyodide) on the docs site, checked against the installed package in CI. (#31)
- ✅ Plugin architecture for parsers, estimators, detectors, masks and profiles, with contract tests. (#37)
- ✅ pandas/xarray/Parquet adapters and
py.typed. (#32)
2.15: Stable API and notebooks (completes #32)
- ✅ Stable API (
ntpstats.api) with a frozen surface and a deprecation policy. (#32) - ✅ Streaming reader for multi-GB logs. (#32, #13)
- ✅ Notebooks executed in CI, and the first gallery entry (NIST SP 1065). (#32, #38)
- ✅ Trace replay: per-direction delays from captures and monitor logs drive the simulated path, with the capture host's clock detrended out. (#29)
- ✅ PTP models: a linuxptp-style PI servo and the
linregservo, sync/delay-request rates, and chains of N boundary clocks scored against the time-error budgets. (#29)
2.17: Research bench v2, part 2 (simulators, algorithms, UI) (completes #29)
- ✅ OMNeT++/INET and ns-3 interop: INET oscillator settings from a noise fit, vector files in and out, ns-3 text. (#29)
- ✅ More reference algorithms (Huygens-style convex hull, ntpd-rs-style combination) and a reproducible benchmark on a replayed trace. The SPTP-style client followed in 3.1, with exchange-level PTP in the bench. (#29)
- ✅ Web UI overhaul: workspaces, command palette, audit, time error, cornered hat, bench and PTP chains in the browser.
- ✅ The stable API (
ntpstats.api) is final for the whole 3.x series; the 3.0 changelog lists every change since 2.15, generated from the frozen surface (docs/api_changes.py). Nothing was deprecated, so nothing is removed: code written for 2.15 or later runs unchanged. (#32) - ✅ Production/stable package metadata, a supported-versions policy, and a JOSS paper draft (
paper/). (#38) - ✅ Citable releases on Zenodo, concept DOI 10.5281/zenodo.23070521, with the interop dataset; ORCID in
CITATION.cff. (#38) - ✅ GitHub Discussions for questions, results and ideas. (#38)
- ✅ conda-forge recipe (
packaging/conda-forge/), built and tested in CI and submitted to conda-forge (staged-recipes#35041). (#38)
- ✅ PTP exchanges in the bench: Sync and Delay_Req at their own rates, transparent clocks,
ptp-lan/ptp-tcpresets, and ptp4l-style and SPTP-style client models scored like every other estimator. (#29) - ✅ NTP over PTP (RFC 10030, chrony 4.9) in captures, with the transparent-clock corrections applied as the RFC specifies. (#21)
- ✅ ntpd-rs as a live source (
ntpstats watch ntpd-rs,ntp-ctlor the metrics exporter). (#21) - ✅ CSPTP (client-server PTP, ntpd-rs 2.0 / statime) in captures, with transparent-clock corrections. (#21)
- ✅ chrony 4.9: the parsers checked against the example lines of the 4.9 documentation; NTP over PTP since 3.1. (#21)
- ✅ UI, CLI and documentation checked end to end (every page with every example dataset on desktop, phone width and dark theme; every command on every example file) and the findings fixed; the checks run in CI.
- ✅ Gallery notebook on PTP through networks without PTP support; docs site descriptions for search; tools landscape updated. (#38)
- ✅ u-blox UBX logs (NAV-CLOCK, NAV-TIMEUTC, TIM-TP) and PPS sawtooth correction with qErr (
ntpstats sawtooth); the OCP Time Card's receiver is a u-blox, so its UBX output is covered. (#21) - ✅ chrony's time-stamping sources (daemon, kernel, hardware) per measurement.
- ✅ Gallery notebook on the PPS sawtooth. (#38)
- ✅ gpsd PPS/TOFF, recorded and live, with qErr for the sawtooth correction. (#21)
- ✅ TAPR TICC output, all modes.
New features arrive in 3.x minor releases, compatibly. Open items, most of them waiting for data from users:
- Comparison with Stable32 output files and long-term logs against an independent reference (#28); TimeLab
.timfiles (#33); vendor instrument profiles (#35); OCP Time Card, Timebeat and chrony 4.9 logs (#21). Sample files welcome. - Community and citability (#38): conda-forge review and feedstock, JOSS submission (the paper follows the current JOSS structure; about April 2027, once development spans the required period and evidence of use is gathered) and more gallery entries.
JOSS paper, contributor on-ramp, distribution packages (Debian, Fedora, Homebrew), a reproduction gallery, and outreach (FOSDEM, the IETF hackathon, ITSF, ATIS WSTS, PTTI/ION, IFCS-EFTF, OCP TAP, time-nuts). (#38)
- Reach per effort: items that open a new audience with existing building blocks come first. For example, #19 and #20 reuse the masks, network metrics and reports.
- Trust: anything that produces a number someone may act on (audit, TE pass/fail, holdover) ships with its definition documented and a validation test.
- Interoperate, don't replace: read and write the formats of the tools people use, and show agreement with them.
- Contributor-shaped work: formats, profiles and parsers are small and independent, and are labelled so newcomers can take them.
Comment on an issue you care about, share a sample log or instrument export (anonymised is fine),
or pick a good first issue. Data contributions are as valuable as code.
See CONTRIBUTING.md.
| Release | Highlights |
|---|---|
| 2.0 | Python 3 rewrite (numpy only); ntpd/NTPsec and chrony parsers; ADEV…MTIE with χ² CIs; network metrics; Kalman/RTS; simulator; privacy-preserving SNTP client; lightweight web UI |
| 2.1 | Exact discrete EDF (#1); TOTDEV, Theo1, TIE (#2); dynamic ADEV (#3); masks (#4) |
| 2.2 | linuxptp (#5); live chrony/ntpd and refclocks (#6); pcap NTP (#7); NTS and NTPv5 clients (#8) |
| 2.3 | Estimator API, scenarios and benchmarks (#9); reference estimators (#10); richer simulator (#11); HTML report (#12) |
| 2.4 | Performance (#13), lint, coverage, Docker, security review, compare
|
| 2.5 | MTOT, TheoBR, TheoH (#15); docs site, wiki, mypy; tag-driven releases to PyPI |
| 2.6 | Fast MTOT/Theo family on million-sample logs (#18) |
| 2.7 | NIST SP 1065 validation, MTOT bias correction, TTOT; Stable32 files and allantools API; Prometheus exporter and Grafana dashboard; community on-ramp |
| 2.8 | PTP from packet captures (#19); time-error metrics with limits and masks (#20); ns-exact capture timestamps |
| 2.9 | ptp4l/ptpcheck live, w32tm, Prometheus import, clock-error bound validation, instrument profiles, --negate
|
| 2.10 | UTC traceability audit (#22); change detection (#23); GitHub Action and pytest assertions (#36) |
| 2.11 | Roughtime client with chained measurements and malfeasance reports; NTS pools; RFC 9769 interleaved mode (client and captures); all in the Live interop (#24) |
| 2.12 | Power-law noise fit and spectra (#25); holdover prediction (#26); N-cornered hat and Groslambert covariance (#27); CGGTTS, RINEX clock, Circular T, RIPE Atlas, NTP Pool (#34); HTOT (#33) |
| 2.13 | Open interop dataset (#30); OpenTelemetry export (#36); EDF cross-check (#28); Roughtime draft-08 |
| 2.14 | In-browser edition (#31); plugins (#37); pandas/xarray/Parquet (#32) |
| 2.15 | Stable API and deprecation policy, streaming reader for large logs, notebooks in CI and the NIST SP 1065 gallery entry (#32, #38) |
| 2.16 | Delay traces and trace replay in the bench; PTP servos and boundary-clock chains against TE budgets (#29, part 1) |
| 2.17 | OMNeT++/INET and ns-3 interop; Huygens-style and ntpd-rs-style estimators; reproducible trace benchmark; web UI overhaul (#29) |
| 3.0 | Stable API final for 3.x (no breaking changes), production/stable metadata and support policy, JOSS paper draft, documentation refresh |
| 3.1 | PTP exchanges, transparent clocks and ptp4l/SPTP-style clients in the bench (#29); NTP over PTP (RFC 10030) in captures (#21) |
| 3.2 | ntpd-rs live source, CSPTP in captures, chrony 4.9 documentation checks (#21) |
| 3.3 | Quality release: UI at phone width and with degenerate data, clean CLI errors, dTE_H at slow sampling, gallery notebook, docs for search (#38) |
| 3.4 | u-blox UBX receiver logs and PPS sawtooth correction (#21); chrony time-stamping sources; sawtooth notebook (#38) |
| 3.5 | gpsd PPS/TOFF (recorded and live), TAPR TICC (#21) |
ntpstats
- Home
- Getting started
- CLI reference
- In your browser
- Input formats
- Statistics
- Network & estimators
- Trace replay & PTP chains
- PTP & time error
- Sources & bounds
- Audit, events & CI
- Monitoring
- Protocols
- Metrology
- Research data
- Dataframes & Parquet
- Writing a plugin
- Notebooks & gallery
- Validation
- API reference
- Live interop
- State of the art
- Tools landscape
- Changelog
- Roadmap