Getting Started
Register
Click Register in the top bar. Fill in your callsign, name, email and password. A verification email will be sent. After verifying your email, an administrator will activate your account.
Sign in
Click Sign in and enter your callsign (or email) and password.
Profile
After signing in, click your callsign in the top right and select Profile. Here you can edit your details and see your connected nodes.
Your Nodes
My Nodes tab
In your Profile, the My Nodes tab shows all nodes connected to the reflector that match your callsign. You can see node info, monitored talkgroups, CTCSS mappings, QTH, and RX/TX status.
Node Admins
Each node can have multiple administrators. The node owner (sysop) is always an admin. Additional admins can be added by a site administrator.
Certificates
Nodes need a signed certificate to connect. When your node first connects, it sends a Certificate Signing Request (CSR). An administrator will sign it, and the reflector sends the certificate to your node automatically.
Account Status
Banned
Your account has been suspended by an administrator. You cannot log in. The reason (if provided) will be shown at login. Contact an administrator to resolve this.
Locked
Your account has been temporarily locked. You cannot log in. The reason (if provided) will be shown at login. Contact an administrator.
Unverified
Your email has not been verified yet. Check your inbox for the verification link. If you did not receive it, contact an administrator.
Notifications
Bell icon
The bell icon in the top bar shows notifications. For regular users it shows account events (ban, lock, unlock). For administrators it also shows pending certificate requests and new registrations.
Navigation
Reflector clients
All connected nodes with real-time status, including remote nodes that arrive via a trunk. Shown as a table: Callsign (with sysop), Class, TG, Location, RX/TX, software/version and monitored talkgroups. The node currently transmitting is highlighted.
Monitor
Live activity monitor with Nodes and Trunks sub-views. Trunks shows each trunk link's status (Name, Status, heartbeat rx/tx, active talkgroups, Type, Qual).
Lastheard
Recent transmissions with callsign, talkgroup and duration — including traffic that arrives over a trunk (shown as callsign via <trunk>, with source local/trunk).
CTCSS Table
Reference table for CTCSS tone frequencies and talkgroup mappings.
Map
Geographic map showing node locations.
Trunks & Remote Nodes
What is a trunk?
A trunk is a link between this reflector and another reflector network (for example reflector-network.se). Talkgroup audio is exchanged across the link.
Remote nodes
Nodes on the other side of a trunk are relayed in and appear in the client list, Monitor and Lastheard just like local nodes. They do not log in to this reflector — only the trunk link itself is authenticated (a shared key).
Identity
A remote node's identity is the name it advertises over the trunk (e.g. a node name like SE-EASTCOAST). There is no separate, locally verified operator callsign for trunk traffic — the advertised name is the identity.
Build the USRP fork (svxlink-usrp)
What it is
DL1HRC's SvxLink fork with UsrpLogic — bridges USRP audio (AllStar chan_usrp, DVSwitch Analog_Bridge) into SvxLink. UsrpLogic lives in contrib and is built automatically.
# Same build dependencies as the stock guide above, then:
cd ~/projects
git clone https://github.com/dl1hrc/svxlink.git svxlink-usrp
cd svxlink-usrp
git checkout svxlink-usrp
mkdir -p src/build && cd src/build
cmake -DCMAKE_INSTALL_PREFIX=/usr -DSYSCONF_INSTALL_DIR=/etc \
      -DLOCAL_STATE_DIR=/var -DWITH_SYSTEMD=yes ..
make -j"$(nproc)"
sudo make install && sudo ldconfig
Configuration
Add a [UsrpLogic] section to svxlink.conf — see the UsrpLogic.conf man page shipped with the fork for the USRP host/port settings.
Configure UsrpLogic (svxlink.conf)
[UsrpLogic]
TYPE=Usrp
USRP_HOST=127.0.0.1
USRP_TX_PORT=4002       ; svxlink sends here (Asterisk listens)
USRP_RX_PORT=4001       ; svxlink listens here (Asterisk sends)
CALL=N0CALL
DV_USER_INFOFILE=/etc/svxlink/dv_users.json
JITTER_BUFFER_DELAY=100
SHARE_USERINFO=1
Wiring it up
Add UsrpLogic to LOGICS= and connect it to your ReflectorLogic with a LinkManager section (see the svxlink.conf man page) — the reflector TG the bridge lands on is the logic's DEFAULT_TG. The other end of the UDP port pair is the AllStar side — see the AllStar tab.
Opus in-band FEC patch (lossy long-haul links)
What it fixes
Over a long-haul reflector hop with real packet loss (for example a transatlantic link) Opus audio breaks up more and more the longer a QSO runs. SvxLink's Opus encoder ships with in-band FEC off and expected packet loss 0% — and there was no config key to change it: the encoder had the setters but they were never wired to setOption. This patch exposes them so the config can turn on forward error correction. (Confirmed identical in stock sm0svx and the dl1hrc USRP fork.)
Where it belongs
On the SvxLink node that encodes audio into the lossy hop — not on SvxReflector, which only relays the already-encoded Opus stream. FEC must be added by the encoder at the sending end; the decoder at the far end uses it automatically.
Get the patched fork and build it
Clone the public fork
The patch sits on top of DL1HRC's svxlink-usrp in a public Gitea fork. Clone it and check out the tagged, patched version:
# Same build dependencies as the SvxLink tab, then:
cd ~/projects
git clone https://git.sa7aux.se/bjorne/svxlink-fork-usrp.git svxlink-usrp
cd svxlink-usrp
git checkout opus-fec-260723        # tagged patched version
#   or:  git checkout opus-inband-fec   # the branch it lives on

mkdir -p src/build && cd src/build
cmake -DCMAKE_INSTALL_PREFIX=/usr -DSYSCONF_INSTALL_DIR=/etc \
      -DLOCAL_STATE_DIR=/var -DWITH_SYSTEMD=yes -DUSE_QT=OFF ..
make -j"$(nproc)"
sudo make install && sudo ldconfig
-DUSE_QT=OFF
Skips the Qtel EchoLink GUI — needed unless the full Qt6 stack (including Qt6Core5Compat) is installed. We only build the node, reflector and audio libraries.
Enable FEC (svxlink.conf — ReflectorLogic)
Config keys
Add these to the [ReflectorLogic] section. Any OPUS_ENC_<OPTION> key is passed straight through to the Opus encoder:
[ReflectorLogic]
; ... existing settings ...
OPUS_ENC_INBAND_FEC=1        ; enable Opus in-band forward error correction
OPUS_ENC_PACKET_LOSS=10      ; expected packet loss %, drives FEC redundancy
OPUS_ENC_INBAND_FEC
1 = on, 0 = off (default). With FEC on, the encoder embeds a low-bitrate copy of the previous frame inside the next packet, so the decoder can rebuild a single lost packet instead of dropping audio.
OPUS_ENC_PACKET_LOSS
The loss percentage the encoder should plan for (for example 10). It controls how much FEC redundancy is added: higher = more robust to loss but slightly less bitrate left for the main audio. Match it to the real loss on your path — 5–15 is sensible for a transatlantic hop.
Verify
On start SvxLink logs its Opus parameters. You should now see Inband FEC = YES and Expected Packet Loss = 10% instead of NO / 0%.
Build GeuReflector (trunked reflector)
What it is
A fork of SvxReflector (trunk extension by IW1GEU) that links multiple reflectors into a federated mesh — talkgroups are routed to their owning server by numeric prefix. This network runs SA2BLV's fork of it.
# Same build dependencies as the stock guide above, plus:
sudo apt install -y libhiredis-dev    `# or build with -DWITH_REDIS=OFF`

cd ~/projects
git clone https://github.com/sa2blv/GeuReflector.git
cd GeuReflector
git checkout SwedenReflectors
mkdir -p src/build && cd src/build
cmake -DCMAKE_INSTALL_PREFIX=/usr -DSYSCONF_INSTALL_DIR=/etc \
      -DLOCAL_STATE_DIR=/var -DWITH_SYSTEMD=yes ..
make -j"$(nproc)"
sudo make install && sudo ldconfig
sudo systemctl enable --now svxreflector
Configure trunks (svxreflector.conf)
How routing works
Each reflector owns all talkgroups whose number starts with its prefix (like telephone country codes). Trunk peers exchange audio over UDP and talkgroups are routed to the owning server automatically.
[GLOBAL]
LOCAL_PREFIX=240                 ; this reflector owns TG 240*, 2400*, ...

[ReflectorTrunk]
GatewayId=SE-MYREFLECTOR         ; this server's identity on the trunk network
Port=5500                        ; UDP trunk port
Peers=SE-AUX                     ; comma-separated [TrunkPeer#...] names

[TrunkPeer#SE-AUX]
Host=reflector.example.com
Port=5500
TGRule=^.*$                      ; regex: which TGs may cross this trunk
Retransmit=0
ActiveFilter=0
Key=CHANGEME                     ; shared secret, same on both sides
Joining an existing network
Both sides must agree on peer name, port and key. To peer with this network, contact the administrator.
Run your own reflector: basics & password login
Basics
In /etc/svxlink/svxreflector.conf: LISTEN_PORT=5300 is what nodes connect to, HTTP_SRV_PORT=8090 serves the /status JSON that dashboards read.
Password login (legacy v1/v2 clients)
[USERS] maps a callsign to a key group and [PASSWORDS] holds each group's secret — several nodes can share one group:
[USERS]
SM0ABC-1=MyNodes
SM0ABC-2=MyNodes
SM3XYZ=SM3XYZ

[PASSWORDS]
MyNodes="a strong shared key"
SM3XYZ="another strong password"
Certificates (PKI)
The reflector is its own CA
On first start the reflector creates a complete PKI from the [ROOT_CA], [ISSUING_CA] and [SERVER_CERT] sections — fill in your own organisation and set COMMON_NAME/SUBJECT_ALT_NAME in [SERVER_CERT] to your reflector's public hostname:
[GLOBAL]
CERT_PKI_DIR=/etc/svxlink/pki
CERT_CA_BUNDLE=/etc/svxlink/pki/ca-bundle.crt
CERT_CA_KEYS_DIR=/etc/svxlink/pki/private/
CERT_CA_PENDING_CSRS_DIR=/etc/svxlink/pki/pending_csrs/
CERT_CA_CSRS_DIR=/etc/svxlink/pki/csrs/
CERT_CA_CERTS_DIR=/etc/svxlink/pki/certs/
#ACCEPT_CALLSIGN="[A-Z0-9][A-Z]{0,2}\d[A-Z0-9]{0,3}[A-Z](?:-[A-Z0-9]{1,3})?"

[SERVER_CERT]
COMMON_NAME=reflector.example.com
SUBJECT_ALT_NAME=DNS:reflector.example.com
ORG=MYCLUB
COUNTRY=SE
EMAIL_ADDRESS=you@example.com
Signing node certificates
Incoming node CSRs land in CERT_CA_PENDING_CSRS_DIR until an administrator signs them; the signed certificate is then pushed to the node automatically over the reflector connection. Use the ACCEPT_CALLSIGN= regex to restrict who may even submit one.
AllStar → SvxReflector — native (chan_svx)
What it is
chan_svx is an Asterisk channel driver for AllStarLink 3 that connects directly to a SvxLink SVXReflector. Unlike the USRP bridge (see the SvxLink-USRP tab), it speaks the reflector protocol natively — lower latency, simpler architecture, a single Opus transcoding step, and reduced CPU/memory. SVXReflector talkgroups can be used straight from AllStarLink with no intermediate USRP hop.
Features
Native SVXReflector connectivity · direct app_rpt integration · SVXReflector v2 protocol (HMAC-SHA1) · configurable jitter buffer · adjustable RX/TX gain · optional RX/TX AGC · x86-64 and ARM64 (Raspberry Pi). Source code is private.
Requirements
Debian 12 (Bookworm) or Debian 13 (Trixie) · AllStarLink 3 (asl3-asterisk) already installed · access credentials for an SVXReflector.
1. Choose the correct package
Browse and download from the repository: git.sa7aux.se/bjorne/chan-svx-deb
Check your Debian release and CPU architecture, then pick the matching .deb (64-bit only):
. /etc/os-release; echo $VERSION_CODENAME   # trixie / bookworm
dpkg --print-architecture                   # amd64 / arm64
asl3-chan-svx_0.2.4~trixie_amd64.deb — Debian 13, x86-64
asl3-chan-svx_0.2.4~trixie_arm64.deb — Debian 13, ARM64 (Raspberry Pi OS Trixie)
asl3-chan-svx_0.2.4~bookworm_amd64.deb — Debian 12, x86-64
asl3-chan-svx_0.2.4~bookworm_arm64.deb — Debian 12, ARM64 (Raspberry Pi OS Bookworm)
2. Install
Dependencies (asl3-asterisk, libopus0, libssl3) are pulled in automatically:
sudo apt install ./asl3-chan-svx_0.2.4~<os>_<arch>.deb
3. Create /etc/asterisk/svx.conf
One section per reflector login / talkgroup. Required: host, port, callsign, password, tg. Optional: tx_hold, jitter, rx_gain, tx_gain, rx_agc, tx_agc.
4. Enable the module
In /etc/asterisk/modules.conf (remove the leading semicolon if the line is commented out):
load = chan_svx.so
5. Point app_rpt at it
In /etc/asterisk/rpt.conf, where <section> matches the svx.conf section name:
rxchannel = SVX/<section>
6. Restart & verify
A successful connection prints reflector and talkgroup information:
sudo asterisk -rx "core restart now"
sudo asterisk -rx "svx show"
Compatibility
Implements the SVXReflector v2 protocol (HMAC-SHA1). Reflectors that provide v2 compatibility can be used even if their SvxLink nodes normally operate on v3/TLS.
Notes
Reflector logins must use an upper-case callsign — SVXReflector validates callsigns case-sensitively. Match the package version to your installed AllStarLink 3 release. A full guide ships in /usr/share/doc/asl3-chan-svx/INSTALL.md, and the post-install script prints the required steps.
PBX → SvxReflector — native (chan_pbx_sat)
What it is
chan_pbx_sat is an Asterisk channel driver that connects a PBX (FreePBX or standard Asterisk) directly to SvxLink SVXReflector talkgroups — no AllStar / app_rpt in the path. A phone dials a talkgroup (PBX → SVX); a talkgroup can ring a phone or ring group (SVX → PBX). A single Opus transcoding step. Source code is private.
Two packages
chan-pbx-sat — the driver (required, any Asterisk box).
pbxsat-freepbx — the FreePBX web GUI (Connectivity → PBX ↔ SVX): trunks, routing, callsigns, talkgroups, access lists, plus a live status panel and a dashboard widget. Install it too on a FreePBX box.
Requirements
Debian 12/13 or CentOS/RHEL 7/8/9 · x86-64 · Asterisk (driver) / FreePBX (GUI) · access credentials for an SVXReflector.
1. Get the packages
All prebuilt .deb / .rpm packages live in the repository — browse and download them there:
git.sa7aux.se/bjorne/pbx-sat-deb
2. Install — Debian 12 / 13
. /etc/os-release; echo $VERSION_CODENAME       # bookworm (12) / trixie (13)
sudo apt install ./chan-pbx-sat_<ver>~<suite>_amd64.deb
# on a FreePBX box, add the GUI:
sudo apt install ./pbxsat-freepbx_<ver>~<suite>_all.deb
2. Install — CentOS / RHEL 7 / 8 / 9
sudo dnf install ./chan-pbx-sat-<ver>.<asttag>.<dist>.x86_64.rpm
# on a FreePBX box, add the GUI:
sudo dnf install ./pbxsat-freepbx-<ver>.<asttag>.<dist>.noarch.rpm
3. Configure
Copy /etc/asterisk/pbx_sat.conf.sample to pbx_sat.conf and edit it — or, with pbxsat-freepbx installed, use the GUI under Connectivity → PBX ↔ SVX (no database; it writes the same file).
4. Enable & dial
Uncomment load = chan_pbx_sat.so in /etc/asterisk/modules.conf, then point a dial-plan route at PBXSAT/<trunk>/<tg>. Full guide: /usr/share/doc/chan-pbx-sat/HOWTO.md, or follow the complete walk-through below.
Full FreePBX setup — everything, step by step

The module only writes pbx_sat.conf. A working bridge also needs a few standard FreePBX pieces (an extension, the module loaded, a dial-plan entry). This is the whole chain, in order. Replace mytrunk, 91 and the talkgroup / extension numbers with your own.

0. Prerequisites
A running FreePBX 17 (or standard Asterisk) on x86-64; at least one extension a phone can register to (Applications → Extensions); and credentials for an SVXReflector satellite trunk — its host, port, your satellite_id and the matching SECRET_<id> from the reflector's svxreflector.conf.
1. Install the packages
Install chan-pbx-sat (the driver) and, on FreePBX, pbxsat-freepbx (the GUI) — see the box above. The GUI appears under Connectivity → PBX ↔ SVX. The .deb/.rpm also drops the sample config and the group-dial voice prompt (English + Swedish).
2. Load the driver
Tell Asterisk to load the module, then confirm it is up:
# /etc/asterisk/modules.conf  (under [modules])
load = chan_pbx_sat.so

sudo fwconsole restart          # or: asterisk -rx "module load chan_pbx_sat.so"
asterisk -rx "pbxsat status"    # should print JSON, not an error
3. Create the trunk (GUI)
Connectivity → PBX ↔ SVX → Add trunk. Every field shows its default, an example and the allowed range to the right. The essentials:
  • host / port — the reflector (port defaults to 5300).
  • satellite_id + secret — your trunk login and its shared HMAC secret.
  • callsign + node_location — how you appear in lastheard (“<callsign> via <label>”).
  • tg (default talkgroup) — joined at connect and used for a bare dial.
  • Group number — the prefix a phone dials to reach this trunk with a dynamic TG (used in step 5). One per trunk, so each reflector gets its own prefix.
Leave everything else on its default unless you have a reason. Save — the module writes the section to pbx_sat.conf and reloads the driver.
4. Global lists (once, shared by all trunks)
Still in the module, the other tabs are site-wide because one reflector is shared:
  • Callsignsextension = callsign, so a caller shows as their own callsign in lastheard.
  • Talkgroups — a number = label catalogue for readability.
  • RoutingSIP → TG (a bare dial from extension X joins TG Y) and TG → SIP (an active TG rings extension/ring-group Z; used in step 6).
  • Settings — one max_dialout cap on concurrent PBX → SVX calls (blank = unlimited).
5. Dial-plan: let a phone dial a talkgroup (PBX → SVX)
The driver is dialled as PBXSAT/<trunk>/<tg>. Wire your Group number to it with a small custom context. Add this to /etc/asterisk/extensions_custom.conf (survives FreePBX reloads):
; dial 91<tg> to key up talkgroup <tg> on "mytrunk"
; (91 = this trunk's Group number; mytrunk = its name)
[pbxsat-mytrunk](+)
exten => _91.,1,Answer()
 same  => n,Dial(PBXSAT/mytrunk/${EXTEN:2})   ; :2 strips the "91" prefix
 same  => n,Hangup()
Include that context for your phones: add include = pbxsat-mytrunk to [from-internal-custom] in the same file, then sudo fwconsole reload. A softphone dialling 9124016 now keys TG 24016. Mid-call, *99/#99 key up/down and 91<tg># switches TG (the ptt_up/ptt_dn/cmd_select_tg fields).
6. Optional: let a talkgroup ring a phone (SVX → PBX)
On the trunk, set standing = yes and list the talkgroups to watch in the TG list (monitor). Then in Routing add a TG → SIP entry (e.g. 24016 = 200, or a ring-group number). When that TG goes active the trunk originates a call into pbx_context (default from-internal) and rings the number. The target extension / ring group must exist in FreePBX.
7. Access control (optional, per trunk)
The trunk's Access list gates who may pass, in either direction: pick a direction (SIP → TG, TG → SIP, or both), a SIP extension (single, 100-199 range, or any), a TG (same forms), and allow/deny. Rules match top-down, first match wins; no rules = open.
8. Apply & verify
sudo fwconsole reload to apply dial-plan changes (the module already reloads the driver on save). Check the status panel at the top of the module page and the dashboard widget: each trunk shows Online/Offline and Idle/In use, plus any live talkers. From the CLI, asterisk -rx "pbxsat status" prints the same as JSON.
Secrets
pbx_sat.conf holds the reflector secret — keep it asterisk:asterisk and mode 640. The module writes it that way; if you edit by hand, re-check the permissions.
Audio tuning (optional) — per-trunk EQ / AGC / limiter, live

Each trunk carries a full audio chain per direction (rx = reflector→phone, tx = phone→reflector): preamp gain → 7-band EQ → AGC → limiter. It is off by default — a trunk that sets nothing passes audio through bit-for-bit, so this can never colour a link you didn't ask it to. The most useful piece on a phone path is the limiter (stops a hot caller clipping into the reflector) and AGC (evens out wildly different phone levels); the EQ is there for a low-cut / presence lift if you want it.

Where
Open a trunk in Connectivity → PBX ↔ SVX. The audio fields (rx_gain/tx_gain, rx_agc/tx_agc + target, rx_lim_ceil/tx_lim_ceil, rx_eq_on/tx_eq_on, rx_eq/tx_eq) each show their default, an example and the range. The EQ is 7 dB values low→high @ 250 500 900 1.4k 2k 2.8k 3.3k Hz; a good starting “Voice” preset is 0,0,2,3,2,0,-2.
Tune it live
With a call up on the trunk, press Start live preview in the Live audio preview panel and adjust the fields — you hear each change on the active call as you type. Stop reverts the audio to the saved config; Discard also undoes your edits back to the saved values; Save writes them to the config for good (the next call reads them). An unattended preview auto-reverts after 30 s, so you can never leave a link stuck on a half-tuned setting.
By hand
The same keys work directly in pbx_sat.conf, e.g. tx_agc = yes, tx_lim_ceil = 30000, tx_eq_on = yes, tx_eq = 0,0,2,3,2,0,-2. Changes take effect on the next call — no reload needed.
For Administrators
Accounts
Manage user accounts — edit details, ban/lock/unlock, set admin levels, reset passwords, delete accounts. Click Edit on an account to manage that user's nodes and certificates.
Certificates
Manage node certificates. List pending CSRs (sign or reject), and list issued certificates with details, delete/revoke, or move a certificate back to pending for re-signing.
Control
Reload configuration, restart or shut down the reflector service.
Config
View and edit the reflector configuration file (svxreflector.conf). Save changes and reload the service to apply.
Contact
For help or questions, contact the reflector administrator at bjorne@sa7aux.se