rns-time

Authenticated, GPS-traceable time over Reticulum — for nodes with no internet, no NTP, no cell. LoRa-tolerant.
SERVER DESTINATION (tap to copy)
e210fb416af335bd68a9ed4b86919895
Time source: stratum-1 GPS (OpenTimeCard Mini / u-blox MAX-M10S) → chrony → this service. The server refuses to announce when its own clock is in holdover.

Why this exists

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.

Expected accuracy

transporttypical RTToffset error
TCP / LAN10–100 ms~1–20 ms
I2P0.5–5 s~50–500 ms
LoRa1–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.

Connect

  1. Install Reticulum: pip install rns
  2. Join the mesh — easiest path is the public TCP backbone: add this to your Reticulum config (~/.reticulum/config), or the equivalent in Sideband (Connectivity → TCP):
    [[quasarke backbone]]
      type = TCPClientInterface
      enabled = yes
      target_host = rns.quasarke.net
      target_port = 4965
    More entry points (I2P, LoRa) at rns.quasarke.net, or use your own RNode/LoRa path into the mesh.
  3. Get the client:
    git clone https://github.com/wdunn001/rns-time.git
    cd rns-time
  4. Ask for the time:
    python3 -m rns_time.client e210fb416af335bd68a9ed4b86919895
    Add --set (as root) to step your clock. Add --timeout 120 on slow LoRa paths.

Protocol (v1) — for implementers

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.

On the mesh itself

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