Skip to content

NXDN ↔ YSF Bridge

vex-nxdn-ysf-bridge links a Vexillum NXDN instance to a Vexillum YSF instance, so NXDN and YSF users share one conversation.

If you also run vex-dmr-ysf-bridge against the same YSF instance, DMR, YSF, and NXDN all share one conversation, with NXDN and DMR connected through YSF. See Cross-mode mesh.

Vexillum’s NXDN mode uses the G4KLX NXDNGateway/MMDVMHost network convention (NXDNP poll, NXDNU disconnect, NXDND data). Each voice packet carries two raw AMBE frames, the same vocoder family YSF uses. No audio is transcoded. The bridge only regroups frames: NXDN puts 2 AMBE frames in each packet, and YSF puts 5 in each frame. A small queue in each direction handles the difference.

NXDN has no public database mapping radio IDs to callsigns, the way radioid.net does for DMR. The bridge therefore can’t show the real identity of whoever is talking on the other mode. Every relayed call uses a fixed identity:

  • calls relayed onto NXDN use -default-nxdn-id as the source ID,
  • calls relayed onto YSF use -default-callsign as the callsign.

The bridge fills in the NXDN call-setup header with the correct group, source, and destination, but does not add its CRC-12. The CRC protects a low-rate side channel, not the audio. NXDN gateways and hotspots that reject the header fall back to building their own from the voice frames (late entry), so audio still works.

  • In the Vexillum admin interface, note the NXDN instance’s listen address and talkgroup, and the YSF instance’s listen address.
  • Choose a callsign dedicated to the bridge rather than an operator’s own. See Give the bridge its own identity.
git clone https://repo.kc1awv.net/Vexillum/vex-nxdn-ysf-bridge.git
cd vex-nxdn-ysf-bridge
go build ./cmd/vex-nxdn-ysf-bridge
./vex-nxdn-ysf-bridge \
  -vex-nxdn-master 127.0.0.1:41400 \
  -vex-nxdn-callsign N0CALL-Y \
  -vex-talkgroup 61000 \
  -ysf-master 127.0.0.1:42000 \
  -ysf-callsign N0CALL-N \
  -default-nxdn-id 1 \
  -default-callsign N0CALL \
  -status-addr 127.0.0.1:8097

This bridge uses no passwords.

Once it’s running, designate the bridge on both instances with the same label: on the NXDN instance by its -vex-nxdn-callsign, and on the YSF instance by its -ysf-callsign. Otherwise every bridged call shows up as a second talker on the other mode.

Flag Default Description
-vex-nxdn-master (required) Vexillum NXDN instance, host:port
-vex-nxdn-callsign (required) Callsign the bridge presents to the NXDN instance
-vex-talkgroup (required) Must exactly match the NXDN instance’s configured talkgroup
-ysf-master (required) Vexillum YSF instance, host:port
-ysf-callsign (required) Callsign the bridge presents to the YSF instance. Also used as the YSF rpt1 field.
-default-nxdn-id 1 NXDN source ID for every call relayed onto NXDN, 1–65535
-default-callsign N0CALL YSF callsign for every call relayed onto YSF
-status-addr :8097 Address for the /status endpoint

GET /status reports the NXDN and YSF sessions as JSON.