WavelogGate is a desktop gateway application that connects amateur radio logging software (WSJT-X, FLDigi) and radio control hardware (FLRig, Hamlib) to the Wavelog web logging platform.
Built with Go + Wails v2 + Svelte. Ships as a single self-contained binary — no runtime dependencies.
| Port | Protocol | Direction | Purpose |
|---|---|---|---|
| 2333 (configurable) | UDP | Inbound | QSO log packets from WSJT-X / FLDigi |
| 54321 | HTTP | Inbound | QSY requests from Wavelog (GET /{freq}/{mode}) |
| 54322 | WebSocket | Outbound | Live radio status broadcast |
If any of these ports is already in use, a message is shown in the Status tab. Stop the conflicting application and restart WavelogGate.
| Field | Description |
|---|---|
| URL | Full Wavelog URL including index.php, e.g. https://log.example.com/index.php |
| API Key | Wavelog API key (found in Wavelog → Settings) |
| Station | Station profile dropdown — populated automatically from Wavelog after entering URL and key |
| Radio name | Name sent with radio status updates (default: WLGate) |
Press ↻ to reload the station list without leaving the field.
Select the backend that matches your setup:
| Type | Description |
|---|---|
| None | No radio control — WavelogGate only forwards UDP log entries |
| FLRig | Connects to a running FLRig instance via XML-RPC |
| Hamlib | Connects to a running rigctld daemon via TCP |
Enter the Host and Port for the chosen backend. Defaults are 127.0.0.1:12345 (FLRig) and 127.0.0.1:4532 (Hamlib).
Set MODE on QSY — when Wavelog sends a QSY request, also change the radio mode (LSB below 8 MHz, USB above).
Ignore Power (Hamlib only) — skip reading TX power, useful for rigs where Hamlib reports power unreliably.
| Button | Action |
|---|---|
| 💾 Save | Save the current profile settings to disk |
| Profiles | Open the profile manager (create / rename / delete / switch) |
| Test | Send a demo QSO to Wavelog's dry-run endpoint to verify connectivity |
| ⚙ Advanced | Configure UDP port and enable/disable the UDP listener |
| Quit | Exit the application |
WavelogGate supports multiple named configuration profiles. A minimum of two profiles must exist at all times.
- Switch — activates the selected profile; radio poller and Wavelog client switch immediately.
- Rename — change the display name of any profile.
- Add — create a new profile with default (empty) settings.
- Delete — remove a profile (disabled when only two remain or for the active profile).
Unsaved field changes are lost when switching profiles — save first if needed.
- TRX display — shows the current frequency and mode polled from the radio (updates every second).
- Status messages — UDP listener startup confirmation, errors, etc.
- QSO result — shows a green alert on successful Wavelog submission, red on failure, with callsign / band / mode details.
- Open WSJT-X → File → Settings → Reporting
- Enable Secondary UDP Server
- Set Server name:
localhost(or the WavelogGate machine IP) - Set Server port:
2333
Use Secondary UDP Server only — the primary server sends binary protocol packets that WavelogGate does not handle.
- Open FLDigi → Configure → User Interface → Logging
- Enable UDP log output
- Set host to
localhostand port to2333
- Install and launch FLRig, configure it for your radio.
- FLRig's XML-RPC server runs on port 12345 by default — no additional setup needed.
- In WavelogGate, set Radio type to FLRig, host
127.0.0.1, port12345, and save.
Start rigctld for your radio, for example:
# Icom IC-7300 on USB serial
rigctld -m 3073 -r /dev/ttyUSB0 -s 115200 -t 4532
# Kenwood TS-2000
rigctld -m 2 -r /dev/ttyUSB0 -s 4800 -t 4532Find your radio's model number with rigctl -l. In WavelogGate, set Radio type to Hamlib, host 127.0.0.1, port 4532, and save.
WavelogGate can control an antenna rotator via a running rotctld (Hamlib) daemon.
In the Config → Rotator section:
| Field | Description |
|---|---|
| Host | IP address of the rotctld host (leave empty to disable rotator) |
| Port | TCP port of rotctld (default: 4533) |
| Threshold Az | Minimum azimuth change in degrees before a move command is sent (default: 2°) |
| Threshold El | Minimum elevation change in degrees before a move command is sent (default: 2°) |
| Park Az / El | Target position for the Park command (degrees) |
Save the profile after changing these fields. The rotator panel in the Status tab only appears when a host is configured.
ROTATOR ● connected
Az: 123.4° El: 45.0°
○ Off ● HF Az: 270°
○ SAT Az: 180° El: 30°
[Park]
- Follow Off — rotator holds its position; no automatic moves.
- Follow HF — rotator tracks the bearing received from Wavelog's lookup result (
lookup_resultWebSocket message). - Follow SAT — rotator tracks azimuth and elevation from Wavelog's satellite tracking (
satellite_positionWebSocket message). - Park — switches follow to Off and moves to the configured park position, bypassing the movement threshold.
Start rotctld for your rotator, for example:
# Yaesu G-5500 via serial
rotctld -m 603 -r /dev/ttyUSB0 -s 9600 -t 4533
# Dummy rotator for testing
rotctld -m 1 -r /dev/null -t 4533Find your rotator's model number with rotctl -l. In WavelogGate, set Host 127.0.0.1, Port 4533, and save.
When Wavelog sends bearing data over the WebSocket connection (port 54322), WavelogGate forwards it to the rotator according to the active follow mode:
| WS message type | Follow mode | Action |
|---|---|---|
lookup_result (contains azimuth) |
HF | Move to the reported azimuth |
satellite_position (contains azimuth + elevation) |
SAT | Move to the reported az/el |
Bearing updates are rate-limited (150 ms minimum between moves). The bearing display in the Status tab updates immediately regardless of follow mode.
WavelogGate can launch and manage its own rigctld process — useful if you want a single application to handle everything without running a separate daemon.
rigctld must be available on the system. WavelogGate searches in this order:
~/.config/WavelogGate/hamlib/rigctld[.exe]— a previously downloaded managed copy- Common platform-specific paths (e.g. Homebrew on macOS:
/opt/homebrew/bin/,/usr/local/bin/) - System
PATH
Windows — click Download in the Internal Hamlib settings to automatically fetch rigctld.exe and its DLLs from the latest Hamlib GitHub release.
macOS — install via Homebrew:
brew install hamlibLinux — install via your package manager:
# Debian / Ubuntu
sudo apt install hamlib-utils
# Fedora / RHEL
sudo dnf install hamlib
# Arch / Manjaro
sudo pacman -S hamlibAfter installing, click Detect in the Internal Hamlib settings so WavelogGate can locate the binary.
Enable Internal Hamlib (select InternalHamlib as Radio type). The following fields become available:
| Field | Description |
|---|---|
| Radio model | Hamlib model number — use the search box to find your radio (e.g. IC-7300 → model 3073) |
| Serial port | Device path (e.g. /dev/ttyUSB0, /dev/cu.usbserial-*, COM3) |
| Baud rate | Serial baud rate matching your radio's CI-V / CAT setting |
| Parity | Serial parity: none, odd, or even (default: none) |
| Stop bits | Number of stop bits (0 = default; typically 1 or 2) |
| Handshake | Flow control: none, rtscts, or xonxoff (default: none) |
| rigctld port | TCP port that the managed rigctld will listen on (default: 4532) |
WavelogGate automatically passes these settings to rigctld and monitors the process. Status is shown in the Status tab (Stopped / Starting… / Running / Error: …).
- The managed
rigctldprocess is stopped and restarted whenever you switch profiles or change the Internal Hamlib settings. - If
rigctldexits unexpectedly the status changes toErrorwith a diagnostic message; fix the configuration and save to restart. - When Internal Hamlib is active, WavelogGate also connects to the managed
rigctldon the same port to poll frequency and mode — no separate Hamlib entry is needed. - On macOS the serial port is often listed under
/dev/cu.usbserial-*; use the serial port dropdown to enumerate detected ports.
Any client can connect to ws://localhost:54322 to receive live radio status:
{
"type": "radio_status",
"frequency": 14225000,
"mode": "USB",
"power": 100,
"radio": "WLGate",
"timestamp": 1700000000000
}A {"type":"welcome","message":"..."} message is sent on connect, followed immediately by the last known radio status.
WavelogGate can emit successfully logged QSO as a Wavelog-native ADIF datagram to a configurable UDP destination. This is useful for forwarding QSOs to a second application (e.g. a local logger, a contest/awawrd-collector or display tool) without having that application talk directly to Wavelog.
This only works for QSOs which are logged on the Wavelog-Site. e.g.: You log a QSO on your instance (while WavelogGate runs and is connected via Websocket) --> QSO is locally emitted to the configured Host/Port if enabled. Emitting QSOs which are alreadt generated locally (e.g.: via WSJT-X) doesn't make any sense. They're already locally
Enable and configure via ⚙ Advanced:
| Field | Description |
|---|---|
| UDP Emit | Enable / disable broadcast |
| Host | Destination host (default: 127.0.0.1) |
| Port | Destination UDP port (default: 2334) |
Each datagram contains the ADIF string for the QSO which was logged within Wavelog. The feature is disabled by default and persisted per global config (not per profile).
Port conflict — another application is using port 2333, 54321, or 54322. Find it with lsof -i :<port> (macOS/Linux) or netstat -ano | findstr :<port> (Windows) and stop it.
Station dropdown empty — check that the Wavelog URL (including index.php) and API key are correct, then press ↻.
Test returns "wrong URL" — the URL points to a page that returns HTML instead of JSON. Ensure the path ends with index.php.
No QSOs appearing — in WSJT-X, make sure you're using the Secondary UDP server, not the primary one.
macOS quarantine (Apple Silicon) — if the app is blocked after download, run:
xattr -d com.apple.quarantine /Applications/WavelogGate.app| Tool | Version | Install |
|---|---|---|
| Go | 1.23+ | https://go.dev/dl/ |
| Wails CLI | v2.x | go install github.com/wailsapp/wails/v2/cmd/wails@latest |
| Bun | any | https://bun.sh |
- wails builds - per default - against libwebkit-4.0. if webkit-4.0 isn't available on your system, because it already uses libwebkit-4.1, you need to add a swtich to dev or build (see below). The switch is called
-tags webkit2_41
cd WavelogGate-Go
wails devThis starts a live-reload server — Go and Svelte changes are picked up automatically.
wails buildThe binary is placed in build/bin/. On macOS it produces a .app bundle, on Windows an .exe, on Linux a standalone binary.
| Flag | Effect |
|---|---|
-clean |
Clean build cache before building |
-platform windows/amd64 |
Cross-compile for Windows |
-nsis |
Generate Windows NSIS installer (requires NSIS) |
-upx |
Compress binary with UPX |
Example:
wails build -clean -platform darwin/arm64