Skip to content
ntp.alastyr.com — home page connecting TR — Türkçe sürüme geç

New · transparency log

Time evidence

Our server clock is on the record every minute: time source, GPS lock, error bound, fallback to backup sources and offset against independent laboratories. Every entry is signed, added to a Merkle tree and, every 10 minutes, timestamped by Roughtime servers independent of us; it cannot be changed afterwards. Query any past moment below, verify it and download the evidence bundle.

Clock state
latest entry, every minute
Error bound
|offset| + root dispersion + root delay/2
Entries
since the start, never deleted
Last external anchor
independent Roughtime witnesses

Query a moment

verification runs in your browser

Pick a date and time (UTC). Your browser finds that minute’s entry, verifies the Ed25519 signature of the first external anchor checkpoint covering it, builds the Merkle inclusion proof itself from the published tiles and shows the result. You do not have to trust us: the computation happens on your device.

The downloaded evidence bundle has the same format as the command-line verify.py and verifies without an internet connection. The Roughtime proof itself is verified with verify.py, not in the browser.

How it works

certificate transparency, applied to time

Roughtime tells you the time, signed, but not what our clock was fed by at that moment. This log closes that gap: the health of the clock is recorded every minute. If the source changes, the satellite signal is lost or we fall back, an extra event entry is written.

Security rests on construction, not on trusting us: entries can only be appended, every append changes the tree root, and the root is timestamped by independent servers outside. Changing even one entry afterwards contradicts proofs signed by others.

  1. 01Record

    One state entry every minute; an extra event entry when the state changes.

    ETSI EN 319 421
  2. 02Merkle tree

    Each entry carries the hash of the previous one and is a leaf of an RFC 6962 tree.

    RFC 6962
  3. 03Signature

    The tree root is published every minute as a checkpoint signed with Ed25519.

    C2SP checkpoint
  4. 04Tiles

    The tree is published as static 256-hash tiles; anyone can build an inclusion proof.

    C2SP tlog-tiles
  5. 05External anchor

    Every 10 minutes the checkpoint is timestamped, in two passes, by three independent Roughtime operators.

    Roughtime

Standards and how they map

what regulators ask for, and the cryptographic construction

No single standard defines this. We combined the relevant parts of the following.

StandardWhat it asks forIn this log
ETSI EN 319 421Time-stamping authorities: UTC synchronisation and loss-of-synchronisation events must be loggedA state entry every minute + separate event entries
MiFID II RTS 25, (EU) 2025/1155Documented traceability to UTC, continuous record of divergence, annual reviewError bound, source and offsets to independent sources; kept indefinitely
RFC 6962 / RFC 9162Certificate Transparency: append-only, verifiable Merkle logThe same tree and inclusion proofs
C2SP tlog-checkpoint, tlog-tilesSigned checkpoint and static tile formatExactly; tested against Go sumdb/tlog
RoughtimeSigned, chainable time; proof that a server liedIndependent external witnesses

Entry fields

in English for international use

Every entry is canonical JSON (sorted keys, no whitespace). Examples in latest.json and /timelog/records/DAY.jsonl.

FieldMeaningValues
clock_stateState of the clockgnss_locked · holdover · network_backup · unsynchronised
holdoverFree-running without satellitesstart, duration and estimated error from the measured 3 µs/hour drift
tracking.error_bound_sMaximum clock error|system_time_offset| + root_dispersion + root_delay / 2
tracking.*chrony tracking valuesreference, stratum, offsets, frequency, leap status
ppsPulse per secondselected, reach, last reception, offset
gnssSatellite receiverfix, satellite counts, HDOP, constellations; osnma: not supported by the receiver
backup_activeFallen back to network sourcestrue / false
cross_checkOffsets to independent stratum-1 sourcesUME, PTB, Netnod, INRIM, CZ.NIC, RIPE NCC, Time.nl
events[].kindEvent typelog_started, outage, state_repaired, clock_state_changed, reference_changed
seq, prevSequence number, SHA-256 of the previous entrygapless chain

Verifying from the command line

the whole log or a single moment

verify.py is an independent tool: it downloads the log and checks signatures, the chain, the Merkle root, external anchors and Roughtime proofs on your machine. Roughtime proofs need roughtime-stamp (installation).

Verify the whole log

curl -sO https://ntp.alastyr.com/timelog/verify.py
pip install cryptography
python3 verify.py

The entry at a given moment

python3 verify.py --at 2026-09-24T16:30:00Z

Create an evidence bundle

python3 verify.py --bundle 2026-09-24T16:30:00Z \
  -o evidence.json

Verify the bundle offline

python3 verify.py --verify-bundle evidence.json

Confirm the verifier key from this page and other channels, not from the server: ntp.alastyr.com/timelog+cb0bb9d1+AVE7wZiELg0QMVE6AplpKfH8Jl/UAftuIIq9ch2dnyYA

Indexindex.jsonstart, list of days, format definition, latest anchor
Checkpointcheckpointsigned root, every minute
Recordsrecords/DAY.jsonlolder days .jsonl.gz; kept indefinitely
Tilestile/<L>/<N>, tile/entries/<N>C2SP tlog-tiles
External anchorsanchors/DAY/checkpoint + Roughtime proof · witness list
Toolverify.pyPython 3 + cryptography

Limits

to be honest

It is self-reported

An entry carries our clock’s state as we measure it. Independent support comes from offsets to independent laboratories.

Anchors prove time

An external anchor proves when an entry was written and that it has not changed, not that its content is true.

The signing key is online

It signs every minute. If stolen, only later entries could be forged; the anchored past cannot change.

No OSNMA

Our GNSS receiver does not support Galileo signal authentication yet; entries state this explicitly.

Not a calibration certificate

Not an ISO 17025 calibration or UTC(k) traceability certificate; traceability is via GNSS.

Single antenna

It relies on one GNSS receiver; on loss it falls back to stratum-1 network sources and records that.

Frequently asked questions

6 questions

What is this log for?

When you later have to defend the timestamp of an event, it shows whether the time source you relied on was itself trustworthy at that moment. If your systems take their time from ntp.alastyr.com or compare against it, the answers to "was Alastyr's clock locked to GPS at that second, what was its error bound, had it fallen back to network sources?" are here, signed and impossible to change afterwards.

What is an evidence bundle and where is it used?

A single JSON file for a given moment: that minute's entry, a Merkle inclusion proof showing the entry is part of a signed checkpoint, the checkpoint itself, and the timestamp independent Roughtime servers gave that checkpoint. You can embed it as-is in your own event record, audit file or evidence object; years later it verifies offline with verify.py --verify-bundle.

Does it prove your clock was right?

An entry carries our clock's state as we measure it; the external anchor proves when the entry was written and that it has not changed since. Independent support for the content comes from the offsets, recorded in every entry, against eleven independent stratum-1 servers (TÜBİTAK UME, PTB, Netnod and others).

Does it also prove the time I received over NTS?

Not directly. NTS uses symmetric session keys; it proves the reply came from us only to the client that made the measurement. To make your own measurement provable, timestamp a hash of your measurement record with at least three independent operators using Roughtime, and take our clock's state for that minute from this log.

What if the log is ever interrupted?

Gaps are not hidden: if the server or the logging service stops, the first entry after the restart is an outage event stating how long there were no records. If the satellite signal is lost, entries move to holdover, then after 10 minutes to network_backup, and each transition is recorded as its own event.

Why these standards instead of your own format?

Certificate Transparency, Sigstore and the Go module database use the same construction: an RFC 6962 Merkle tree, a C2SP signed checkpoint and tlog-tiles. So our log can be read and verified with that ecosystem's existing tools; we tested our tiles against Go's official sumdb/tlog library.