Off-grid nodes drift by minutes or days, and wrong time breaks certificate validity, log ordering, schedules, and any protocol with timestamps. rns-time carries time over whatever Reticulum can traverse — TCP, I2P, LoRa — and unlike classic NTP, the answer is authenticated: an RNS Link is end-to-end encrypted to the server identity above, so if you have the right hash, nobody can spoof your time.
| transport | typical RTT | offset error |
|---|---|---|
| TCP / LAN | 10–100 ms | ~1–20 ms |
| I2P | 0.5–5 s | ~50–500 ms |
| LoRa | 1–6 s | ~0.2–2 s |
The 4-timestamp exchange cancels path delay; the residual is path asymmetry. Multi-second RTTs are fine — that's the point.
pip install rns~/.reticulum/config), or the equivalent in Sideband
(Connectivity → TCP):
[[quasarke backbone]] type = TCPClientInterface enabled = yes target_host = rns.quasarke.net target_port = 4965More entry points (I2P, LoRa) at rns.quasarke.net, or use your own RNode/LoRa path into the mesh.
git clone https://github.com/wdunn001/rns-time.git cd rns-time
python3 -m rns_time.client e210fb416af335bd68a9ed4b86919895Add
--set (as root) to step your clock. Add --timeout 120 on slow LoRa paths.Open an RNS Link to app rnstime, aspect time.
Per round, send msgpack {"v":1,"t1":<send time>}; the server replies
{"v":1,"t1",…,"t2":<recv>,"t3":<send>,"stratum","root_disp_ms","leap"}.
Stamp t4 on arrival:
offset = ((t2-t1)+(t3-t4))/2 delay = (t4-t1)-(t3-t2)
Run several rounds, keep the lowest-delay sample. Ignore answers with stratum ≥ 10 (server holdover). Only step forward from store-and-forward sources; live Links may step either way.
This page also lives on Reticulum — browse the NomadNet node (works from nomadnet or Sideband once you're connected to the mesh):
3336fa70bd7604ddacf2fd65ba960724:/page/rns-time.mu