📡 Reaching bsv.cx without internet

Every bsv.cx service above talks HTTPS. This page is about the other path: reaching a bsv.cx service over Reticulum instead of TCP/IP — including from a device with no internet connection at all, over LoRa radio alone.

statuslive two real Reticulum destinations, kept running — not one-off demos
todaythe filestamp notary (not1), signed attestations (att1), raw transaction broadcast, and SPV verify are exposed this way
no SLAone box, best-effort — not a monitored, guaranteed-uptime fleet

Two different claims, don't mix them up: the connection details below work over plain internet, from anywhere on Earth — no radio needed. The "zero internet" radio proofs further down were run on our own LoRa hardware, physically located in the Dayton, Ohio area — reaching our radios over the air only works if you're within range of them. If you're not nearby, the section below shows how to get the same zero-internet property anywhere, with your own radio.

Connect

Any Reticulum node can reach these directly over the open internet — no radio required for that part; the radio is what lets a device with zero internet reach a Reticulum node that, in turn, reaches this.

public TCP interface (both)5.161.238.214:4242
notary — app · aspectbsvcx · notary
notary — destination hash79be6b622ee3f73f3b2b1137b5436273
notary — requestnotarize ← 32 raw SHA-256 bytes → the same JSON GET /n/:hash returns
notary — requestattest ← {hash: 32 raw bytes, signature: str, address: str (BSM) or signerKey: str (BRC-77), claims?: {k:v}} — a statement you already signed with your own wallet; same JSON POST /n returns. We relay the signature, we never sign anything ourselves.
notary — requestbroadcast ← raw signed transaction bytes → the same JSON POST /broadcast returns. Sign fully offline on a real wallet — the key never touches a radio or this bridge, only the already-signed bytes do.
spv — app · aspectbsvcx · spv
spv — destination hash7b4bfb80e2c03c5ce8b04d236259db74
spv — requestsspv_header ← {height} or {hash: 32 raw bytes} · spv_verify ← {bump: raw bytes, txid: 32 raw bytes} — same JSON /spv/header / /spv/verify return
# minimal client: add a TCPClientInterface to 5.161.238.214:4242 in your own
# Reticulum config, request_path() a destination hash above, open a Link once
# resolved, then link.request(<name>, <payload>) with the shapes above.
# Full worked example: github.com/markqvist/Reticulum (RNS.Link, RNS.Destination)

How it works

Reticulum is an open cryptographic mesh networking stack — it does not care whether the link underneath is LoRa, packet radio, or an ordinary internet socket; the same identity, routing and encryption behave the same way over any of them. Each bridge above sits on the same box as the real bsv.cx HTTP API: it takes a request off Reticulum, calls the matching HTTP endpoint exactly like any other client would, and sends the real response back the same way it came in.

your device (no internet, LoRa only)
        ↓ radio hop
a Reticulum relay with internet (transport node)
        ↓ plain TCP, over the open internet
bsv.cx's own box — notarizes or verifies, same as any other request
        ↓ response, same path back

Proven

Notary, over radio: a notarize request left a device with its internet path deliberately disabled, crossed one LoRa hop to a relay, continued over the internet into this destination, got a genuine on-chain anchor, and the proof came back over the same radio link — no other path available. Round trip: ~5.5 seconds.

Notary, over plain internet, as any third party would: a throwaway identity with no relation to our own radio hardware, holding only this page's connection details, reached the destination above and got a genuine on-chain anchor back.

SPV verify, same way: a throwaway identity fetched a header for block 964658 and independently folded a real BUMP for an already-confirmed bsv.cx anchor against our own headers — both over the Reticulum destination above, zero bsv.cx-specific HTTP involved.

spv_header(964658)returned merkleRoot 97d560a4…, matching our live /spv/header
spv_verifyfolded the BUMP for 8fab503de04e… and got status: confirmed, verified: true

Attest, same way: a throwaway key signed a statement locally (Bitcoin Signed Message — no new tooling, the same "sign message" feature any wallet already has), and the attest request relayed the signature — unverified, untouched, exactly as signed — into a real anchor.

Broadcast, deliberately not with real funds: a signed transaction spending a fake, nonexistent input went over the same destination, through broadcast, into the real /broadcast endpoint, which genuinely tried to relay it to the network and came back with a real rejection — Missing inputs, exactly as a fake input should. That proves the relay path end to end without anyone's money moving; a real wallet's genuinely-signed, genuinely-funded transaction goes through the identical path and actually lands on-chain.

All of these are our own tests, not customer-usage theatre — same honesty rule as every other "proven on mainnet" claim on this site.

Point of sale, entirely offline

Put notarize and broadcast together and you get something more than either alone: a vendor generates an invoice with no network call at all, its hash gets notarized over this same destination — an on-chain record of exactly what was asked for, before any money moves — a buyer signs a real payment against it (the key never touches a radio), and the signed transaction goes out the same way. Neither side needs internet. Neither side needs bsv.cx in the middle, either — this isn't a hosted payment service, it's two independent wallets transacting directly, with bsv.cx as neutral notarization and broadcast infrastructure, nothing more. "Confirmed" means the broadcast ack, the same 0-conf standard as above — the right bar for small point-of-sale amounts.

Reference implementation (invoice → notarize → sign → broadcast, end to end): reticulum/pos-demo-sign.mjs + pos-demo-broadcast.py in the source tree.

Not near Dayton? Build your own gateway

The zero-internet property doesn't belong to our specific radios — it comes from the pattern underneath, and that pattern works anywhere. You don't need to be near us; you need a node of your own that has both a radio and an internet connection, sitting between your offline device and the public TCP interface above.

1 · hardwareany RNode-compatible LoRa board for your gateway (Heltec, T-Beam, etc. — rnodeconf flashes most ESP32 LoRa boards) — plus a second radio for the actual offline device, if you want two physically separate ends rather than just proving the mechanism on one box
2 · softwarepip install rns gets you rnsd and the Python API — nothing else required
3 · gateway configan RNodeInterface for your radio, plus a TCPClientInterface pointed at 5.161.238.214:4242 — that one line is what bridges your local radio to us over your own internet connection
4 · if relaying for othersset enable_transport = True on the gateway — without it, a node only originates/receives its own traffic, it won't forward a third device's request between its radio and its internet link
# gateway's config — the line that actually matters:
[[bsvcx Uplink]]
  type = TCPClientInterface
  enabled = Yes
  target_host = 5.161.238.214
  target_port = 4242

One real constraint, not a bsv.cx one: two LoRa radios only hear each other if their frequency, bandwidth, spreading factor and coding rate all match — and the frequency band you're legally allowed to transmit on depends on your country (915 MHz in the US, 868 MHz in the EU, etc.). Match your offline device's radio settings to your gateway's, and use a frequency that's legal where you are.

Once that's up, the offline device talks to your gateway over LoRa exactly like our LoRa device talked to Juno — and your gateway relays it over the internet to the exact same destinations above. Same mechanism, your own radios, anywhere on Earth.

What this is not

Not a full-catalog gateway — only single-file notary (not1), attestations (att1), raw broadcast, and SPV verify are wired up so far; batch, archive, and the paid services are still HTTPS-only. Not a wallet — we never generate, hold, or see a private key; "broadcast" only ever relays bytes you already signed elsewhere. Not rate-unlimited — the same per-caller fairness window the free HTTP endpoints use applies here too. Not monitored infrastructure with an uptime commitment — it is one box we run, kept alive by systemd, not a fleet with paging and failover.

← filestamp notary · SPV verify