ham-radiolive/ connect← Home
Station bridge · local endpoint

Put your users on the live map in three lines.

If your logger already knows the operator frequency, one loopback UDP datagram puts it on ham-radio.live in real time. Read-only, no keys, no dependency.

127.0.0.1:7373
Transport
UDP
Scope
Loopback only
Auth
None
Direction
Read-only

01Send one datagram on frequency change

One UTF-8 JSON object per update, ≤ 1 KB. Fire-and-forget — no reply to parse, no connection to keep open.

Python
import socket, json
socket.socket(socket.AF_INET, socket.SOCK_DGRAM).sendto(
  json.dumps({"freq_hz":14074000,"mode":"FT8",
              "source":"MyLogger"}).encode(),
  ("127.0.0.1", 7373))
C++ · Qt
QUdpSocket s;
s.writeDatagram(
  R"({"freq_hz":14074000,"mode":"FT8","source":"MyLogger"})",
  QHostAddress::LocalHost, 7373);
Node.js
require('dgram').createSocket('udp4').send(
  JSON.stringify({freq_hz:14074000, mode:'FT8',
    source:'MyLogger'}),
  7373, '127.0.0.1');
Shell
# fire-and-forget, no wait
echo '{"freq_hz":14074000,"mode":"FT8"}' \
  | nc -u -w0 127.0.0.1 7373

Treat 7373 as busy-tolerant: if the send fails, skip it silently and retry on the next frequency change. Never block your UI on it.

02Payload

Send whichever frequency unit you already have — no conversion on your side.

FieldTypeRequiredMeaning
freq_hz · freq_khz · freq_mhznumberone ofCurrent frequency, in whichever unit is convenient.
modestringoptionalOperating mode — FT8, USB, CW, …
sourcestringoptionalYour app name. Shown for display and debugging.
callsignstringoptionalInformational only — identity comes from the browser session.

03Why there is no authentication

The trust boundary is the operator browser, not the packet.

The operator is already signed in to ham-radio.live in their browser, and that session carries their identity. The connector only reads 127.0.0.1:7373 and forwards frequency to that logged-in session. The port is bound to loopback, so nothing off the machine can reach it — a local sender can only ever affect its own operator session. No API key to issue, store, or leak.

04Already broadcasting? You may be done.

The connector also listens on the standard ports loggers already use. Emit on one of these and integration works today — nothing to build.

If you already emitPortStatus
WSJT-X / JTDX UDP protocol2237works today
N1MM+ / Logger32 RadioInfo XML12060works today
Log4OM RadioInfo XML12040works today
MacLogger DX Radio Report9932works today

The reason to add the native feed anyway

When several apps listen on one broadcast port, they can contend for the same datagrams. Pushing to 127.0.0.1:7373 is a private channel — your feed reaches ham-radio.live without you or anyone else fighting over a shared port.

73—Igor Gelmanov, 4X5IG·Questions or a patch to review? get in touch.