Advanced technical documentation · v1.0.262 · Appendices A-J
May 20, 2026
This appendix documents the Fast Transmission 2 (FT2) protocol at the level needed to implement it from scratch in a third-party decoder or transmitter. The specification is the one certified ADIF 3.1.7 with the unanimous 22:0 vote of March 22, 2026.
| Parameter | Value | Notes |
|---|---|---|
| Type | 4-GFSK | Gaussian Frequency Shift Keying, 4 tones |
| Number of tones | 4 | T0, T1, T2, T3 (mapped to 2 bits/symbol) |
| Tone spacing | 41.6667 Hz | exact: 41 + 2/3 Hz |
| Total RF bandwidth | 167 Hz | 3 × spacing + Gauss roll-off |
| Gauss BT filter | 1.0 | Bandwidth × Time product |
| Nominal center tone | configurable | typically 1500 Hz audio |
| Tone T0 | center − 1.5 × spacing | = center − 62.5 Hz |
| Tone T1 | center − 0.5 × spacing | = center − 20.83 Hz |
| Tone T2 | center + 0.5 × spacing | = center + 20.83 Hz |
| Tone T3 | center + 1.5 × spacing | = center + 62.5 Hz |
| Parameter | Value |
|---|---|
| Symbol rate | 41.6667 baud |
| Symbol duration | exactly 24 ms (1/41.6667 s) |
| Total frame | 79 symbols |
| Frame duration | 79 × 24 ms = 1896 ms |
| Guard time (RX→TX) | ~250 ms |
| Guard time (TX→RX) | ~150 ms |
| Total T/R cycle | 3.75 — 3.80 s |
The DECODIUM decoder works internally at 12 kHz (downsampled from the 48 kHz of the input audio). This is a WSJT-X heritage kept for compatibility.
The FT2 frame of 79 symbols is structured in three parts:
┌─────────┬────────────────────────────┬─────────┐
│ COSTAS │ PAYLOAD (FEC) │ COSTAS │
│ 7 sym │ 65 symbols │ 7 sym │
└─────────┴────────────────────────────┴─────────┘
↑ ↑
Sync 1 Sync 2
Additionally, there’s a third intermediate Costas at position 36 (frame center) for MMSE channel estimation on fading signals:
┌─────┬───────┬─────┬───────┬─────┐
│ C1 │ P1 │ C2 │ P2 │ C3 │
│ 7s │ 29s │ 7s │ 29s │ 7s │
└─────┴───────┴─────┴───────┴─────┘
where C1, C2, C3 are the
Costas arrays and P1, P2 are the two halves of
the FEC payload.
Total: 7 + 29 + 7 + 29 + 7 = 79 symbols ✓
The three Costas sequences are not equal — each Costas array has a position signature that lets the decoder know whether it’s locking onto the first, second, or third occurrence:
Costas 1 (start): [3, 1, 4, 0, 6, 5, 2]
Costas 2 (middle): [5, 2, 7, 1, 4, 0, 6]
Costas 3 (end): [0, 3, 1, 7, 4, 6, 2]
The numbers are tone indices (0-7) in an intermediate 8-tone representation which is then mapped onto the actual 4 FT2 tones via Gray-coding. This choice follows the WSJT-X MFSK convention.
For each 8-tone index used in the Costas sequences, Gray-coding modulo 4 is applied:
| 8 index | 4-GFSK tone | Bit pair |
|---|---|---|
| 0 | T0 | 00 |
| 1 | T1 | 01 |
| 2 | T3 | 11 |
| 3 | T2 | 10 |
| 4 | T0 | 00 |
| 5 | T1 | 01 |
| 6 | T3 | 11 |
| 7 | T2 | 10 |
Gray-coding ensures that adjacent symbols differ by a single bit, reducing the bit-equivalent error when the decoder makes a tone-selection error.
| Level | Bits | Size |
|---|---|---|
| User message (compressed) | 77 | 9.625 bytes |
| + CRC | 14 | 91 total bits |
| LDPC encoded | 174 | 21.75 bytes |
| Symbols (174/2 bit per symbol) | 87 | halved due to 4-GFSK |
| Effective after puncturing | 65 | distributed in 2 blocks of 29 + 7 sync |
DECODIUM uses the original LDPC code by K1JT (WSJT-X), implemented as a sparse parity matrix.
Specifications: - N (codeword length): 174 bits - K (message + CRC length): 91 bits - Rate: 91/174 ≈ 0.523 - Theoretical correction capacity: up to 14 errored bits (BER 0.08) - Check nodes: 83 - Decode algorithm: Normalized Min-Sum - Max iterations: 20 - Convergence threshold: parity check sum = 0
Generator polynomial: x^14 + x^13 + x^5 + x^3 + x^1 + 1
(hex 0x6757).
uint16_t crc14(uint8_t *msg, int nbits) {
uint16_t crc = 0;
for (int i = 0; i < nbits; i++) {
uint8_t bit = (msg[i / 8] >> (7 - i % 8)) & 1;
crc = (crc << 1) | bit;
if (crc & 0x4000) crc ^= 0x6757;
}
return crc & 0x3FFF;
}CRC is computed on the 77 payload bits before LDPC encoding. After decode, if the recomputed CRC doesn’t match, the decode is considered invalid and discarded.
The 77 bits of useful payload are used in five distinct formats, identified by the first 3 bits (i = type indicator):
Classic WSJT-X format:
[3 bits: i=0] [28 bits: callsign1] [28 bits: callsign2] [15 bits: grid4 / report] [3 bits: subtype]
[3 bits: i=1] [74 bits: free text up to 13 characters]
Supported character set: A-Z, 0-9, space, /,
., ? (39 symbols).
74 bits ÷ ⌈log₂(39)⌉ = 74 ÷ 6 ≈ 12.33 → 13 chars max.
[3 bits: i=2] [74 bits: 18-char hex string + padding]
Used for numeric sequences, sensor data, station telemetry.
Format dedicated to multi-slot DX operations:
[3 bits: i=3] [28 bits: fox callsign] [28 bits: hound callsign] [15 bits: slot + report] [3 bits: ack flag]
Allows the “Fox” (DX) to manage up to 5 hounds simultaneously on adjacent frequencies.
Exclusive to FT2. Format for the optimized 4-message flow:
[3 bits: i=4] [28 bits: callsign1] [28 bits: callsign2] [15 bits: grid + R+SNR combined] [3 bits: stage]
ASYMX does not modify the FT2 physical layer. It’s an extension of the TX timing on the transmitter side.
T = N × 7.5 s for even slots (N = 0, 2, 4, ...)
T = N × 7.5 + 3.75 s for odd slots
The transmitter always waits for the start of the next NTP-aligned slot.
T = user click moment or auto-fire condition
The transmitter can start at any moment. The signal remains identical (modulation, frame, FEC).
The standard WSJT-X/JTDX receiver receives normally because:
Caveat: in ASYMX, the decoder may see the same frame twice if the analysis window overlaps. DECODIUM uses best-of-N consolidation to avoid duplicates in the log.
decodium.ini referenceThis appendix documents every key of the configuration file, with type, valid values, default, and impact.
| OS | Canonical path |
|---|---|
| Windows | %APPDATA%\Decodium\decodium.ini |
| macOS | ~/Library/Application Support/Decodium/decodium.ini |
| Linux | ~/.config/Decodium/decodium.ini |
Backup file: decodium.ini.bak is
created at every startup in the same directory.
Format: Standard Qt INI (case-sensitive keys,
sections in [...], escape \= for literal
=).
[Station] sectionOperator and station configuration.
| Key | Type | Default | Values | Description |
|---|---|---|---|---|
MyCall |
string | "" |
valid callsign | Operator callsign |
MyGrid |
string | "" |
4 or 6 char Maidenhead | Locator |
Operator |
string | "" |
callsign or empty | Operator (if different from MyCall) |
DXCC |
string | auto |
auto / DXCC number | Override DXCC entity |
StationType |
string | Home |
Home/Portable/Maritime/Aeronautical | Station type |
Antenna |
string | "" |
free text | Antenna description (info only) |
Power |
int | 100 |
1-1500 | Nominal TX power in W |
[Radio] sectionCAT configuration.
| Key | Type | Default | Values | Description |
|---|---|---|---|---|
RigType |
string | None |
Hamlib model id | Radio model (autocomplete) |
RigPort |
string | "" |
COM3 / /dev/ttyUSB0 | Serial port |
RigBaud |
int | 9600 |
1200-115200 | Baud rate |
RigDataBits |
int | 8 |
7 or 8 | Data bits |
RigStopBits |
int | 1 |
1 or 2 | Stop bits |
RigParity |
string | None |
None/Even/Odd | Parity |
RigHandshake |
string | None |
None/Hardware/Software | Flow control |
RigDTR |
string | Empty |
Empty/ON/OFF | Forced DTR state |
RigRTS |
string | Empty |
Empty/ON/OFF | Forced RTS state |
CIVAddress |
hex | 0x94 |
0x00-0xFF | CI-V address (Icom only) |
PollInterval |
int | 1000 |
100-5000 | Polling frequency ms |
HRDBridge |
bool | false |
true/false | Enable HRD bridge |
HRDHost |
string | 127.0.0.1 |
IP | HRD server host |
HRDPort |
int | 7809 |
1-65535 | HRD TCP port |
OmniRig |
bool | false |
true/false | Use OmniRig instead of Hamlib |
OmniRigInstance |
int | 1 |
1 or 2 | OmniRig rig number |
[Audio] sectionI/O audio configuration.
| Key | Type | Default | Values | Description |
|---|---|---|---|---|
AudioIn |
string | "" |
device name | Input device (case-sensitive) |
AudioOut |
string | "" |
device name | Output device |
SampleRate |
int | 48000 |
12000/24000/48000/96000 | Sample rate Hz |
BufferSize |
int | 1024 |
256-4096 | DMA buffer frames |
Channels |
int | 1 |
1 or 2 | Mono / Stereo |
Bandwidth |
float | 3000 |
1000-3000 | Audio bandwidth Hz |
BoostRX |
int | 0 |
0-20 | Digital RX gain (dB) |
BoostTX |
int | 0 |
0-20 | Digital TX gain (dB) |
Important:
AudioInandAudioOutmust match exactly the system device names (Windows Audio Control Panel, ALSA aplay -L, macOS System Preferences). Spaces and capitalization matter.
[PTT] section| Key | Type | Default | Values | Description |
|---|---|---|---|---|
Method |
string | CAT |
CAT/VOX/RTS/DTR/External | PTT method |
Port |
string | "" |
COM3 / /dev/ttyUSB0 | Port (if different from CAT) |
Inverted |
bool | false |
true/false | Invert line polarity |
DelayMs |
int | 50 |
0-1000 | Delay after PTT before TX audio |
[FT2] sectionFT2-specific parameters.
| Key | Type | Default | Values | Description |
|---|---|---|---|---|
EnableDEEP |
bool | true |
true/false | Multi-pass Raptor |
DEEPPasses |
int | 5 |
1-10 | Number of best-of passes |
EnableASYMX |
bool | false |
true/false | Asynchronous mode |
EnableQQ |
bool | true |
true/false | Quick QSO 4-msg |
EnableMMSE |
bool | true |
true/false | MMSE channel estimation |
EnableEMA |
bool | true |
true/false | Multi-period averaging |
EMAAlpha |
float | 0.35 |
0.0-1.0 | EMA weight |
EMAMaxPeriods |
int | 4 |
1-10 | Max periods to accumulate |
LDPCMaxIterations |
int | 20 |
5-50 | Max LDPC decoder iter |
SyncThreshold |
float | 0.45 |
0.0-1.0 | Costas correlation threshold |
[Filters] section| Key | Type | Default | Values | Description |
|---|---|---|---|---|
FDR |
bool | true |
true/false | Frequency Domain Resilience |
FDRThreshold |
float | 0.3 |
0.0-1.0 | FDR aggressiveness |
SpectralMask |
bool | true |
true/false | Spectral mask filter |
SpectralMaskMargin |
int | 20 |
5-50 | Margin in Hz |
SlidingAGC |
bool | false |
true/false | Audio buffer internal AGC |
SlidingAGCWindow |
int | 200 |
50-1000 | AGC window in ms |
DupSuppress |
bool | true |
true/false | Multi-pass duplicate suppression |
MinSNR |
int | -25 |
-30..-10 | Minimum SNR threshold (below = discard) |
[UI] section| Key | Type | Default | Values | Description |
|---|---|---|---|---|
Theme |
string | ShannonDark |
ShannonDark/ShannonLight/Midnight/Classic | Active theme |
WaterfallPalette |
string | SDRClassic |
SDRClassic/ShannonLight/ShannonDark/Heat | Waterfall color palette |
WaterfallSpeed |
int | 10 |
1-100 | Refresh speed ms |
WaterfallGain |
int | 0 |
-30..+30 | Visual gain dB |
WaterfallContrast |
int | 10 |
0-30 | Contrast |
WaterfallBlack |
int | 24 |
0-50 | Black point |
FontScale |
int | 100 |
80-150 | Global font scale % |
Language |
string | en |
en/it/es/de/tr | Interface language |
CompactMode |
bool | false |
true/false | Compact mode |
ShowGridLines |
bool | true |
true/false | Waterfall frequency grid |
BoldDecodes |
bool | true |
true/false | Bold decodes |
ColorDecodes |
bool | true |
true/false | Color by band/distance |
[Logbook] section| Key | Type | Default | Values | Description |
|---|---|---|---|---|
ADIFPath |
string | auto |
path or auto | ADIF file path |
AutoLog |
bool | true |
true/false | Auto-log at QSO end |
LoTW |
bool | false |
true/false | LoTW upload enabled |
LoTWUser |
string | "" |
callsign | LoTW username |
LoTWPath |
string | "" |
TQSL path | TQSL executable path |
eQSL |
bool | false |
true/false | eQSL upload |
eQSLUser |
string | "" |
username | eQSL username |
ClubLog |
bool | false |
true/false | Club Log upload |
QRZ |
bool | false |
true/false | QRZ.com upload |
QRZAPIKey |
string | "" |
API key | QRZ API key |
Cloudlog |
bool | false |
true/false | Cloudlog/Wavelog upload |
CloudlogURL |
string | "" |
endpoint URL | Cloudlog URL |
CloudlogAPIKey |
string | "" |
API key | Cloudlog API key |
[PSKReporter]
section| Key | Type | Default | Description |
|---|---|---|---|
Enable |
bool | true |
Upload enabled |
Interval |
int | 300 |
Upload interval in seconds |
IncludeFT2 |
bool | true |
Include FT2 decodes in upload |
Server |
string | report.pskreporter.info |
PSK Reporter server |
[DXCluster]
section| Key | Type | Default | Description |
|---|---|---|---|
Enable |
bool | false |
Cluster connection enabled |
Server |
string | "" |
host:port cluster |
Login |
string | "" |
Cluster username |
Password |
string | "" |
Password (rarely used) |
AutoConnect |
bool | true |
Auto-connect on startup |
FilterBand |
bool | true |
Filter by active band |
FilterMode |
string | FT8,FT2,FT4 |
Filter by modes |
MaxAge |
int | 300 |
Max spot age in seconds |
[Advanced] section| Key | Type | Default | Description |
|---|---|---|---|
DebugCAT |
bool | false |
Detailed CAT log |
DebugAudio |
bool | false |
Audio levels per slot |
DebugDecoder |
bool | false |
Decoder details |
DebugQML |
bool | false |
QML warnings |
MaxDecodersPerSlot |
int | 12 |
Max parallel decoders |
ThreadPoolSize |
int | auto |
Worker thread pool count |
NetworkTimeout |
int | 10000 |
Network connection timeout ms |
EnableTelemetry |
bool | false |
Anonymous telemetry to team |
DECODIUM 4.0 uses Hamlib 4.7 for radio control. Hamlib supports 170+ models, but the most common radios in digital mode have operational specs worth documenting.
| Parameter | Value |
|---|---|
| Hamlib model | 2031 (TS-590S) or 2034 (TS-590SG) |
| Baud rate | 57600 (max recommended) |
| Data bits | 8 |
| Stop bits | 1 |
| Parity | None |
| Handshake | None |
| CAT mode (radio menu) | Standard Kenwood |
| Menu | Function | Recommended value |
|---|---|---|
| Menu 63 | DATA IN source | USB |
| Menu 64 | USB IN level | 5 (adjust to green level) |
| Menu 65 | USB OUT level | 5 (adjust for desired PWR) |
| Menu 76 | Auto power off | OFF |
| Menu 77 | Beep on TX | OFF (unnecessary noise in TX audio) |
IF; → query complete status
FA<freq>; → set VFO A frequency (e.g. FA00007074000;)
MD2; → set mode USB
TX0; → PTT off
TX1; → PTT on (RX→TX)
DA1; → DATA mode on
PC<pwr>; → set power level (PC100; = 100W max)
| Parameter | Value |
|---|---|
| Hamlib model | 1035 |
| Baud rate | 38400 |
| Data bits | 8 |
| Stop bits | 2 (required by FT-991A) |
| Parity | None |
| Handshake | None |
| Menu | Function | Value |
|---|---|---|
| 31 (CAT RATE) | CAT baud rate | 38400 |
| 113 (RPORTS) | RTTY/PSK ports | USB Front (for USB audio) |
| 062 (SCKMD) | Scope mode | OFF on TX |
| Parameter | IC-7300 value | IC-7610 value |
|---|---|---|
| Hamlib model | 3073 | 3081 |
| Baud rate | 19200 | 115200 |
| CI-V Address | 0x94 | 0xA4 |
| Stop bits | 1 | 1 |
| IC-7300 Menu | Function | Value |
|---|---|---|
| SET → Connectors → MOD INPUT → DATA OFF MOD | DATA mode mod source | USB |
| SET → Connectors → MOD INPUT → DATA OFF MOD LEVEL | TX audio level | 30-50% |
| SET → Connectors → CI-V → CI-V USB Baud | CAT baud | 115200 (for max throughput) |
| SET → CI-V → CI-V USB Echo Back | Echo | OFF |
0x94 standard IC-7300, 0xA4
IC-7610, 0x88 IC-9700| Parameter | K3/K3S value | K4 value |
|---|---|---|
| Hamlib model | 2029 | 2029 (K4 K3-compatible) |
| Baud rate | 38400 | 38400 |
| Stop bits | 1 | 1 |
| Menu | Function | Value |
|---|---|---|
| CONFIG:RS232 | RS232 baud | 38400 |
| CONFIG:DATA MD | Default DATA mode | DATA-A or PSK D |
PS0;DECODIUM supports TCI 1.5 (ESDR) as software bridge for FlexRadio:
| Parameter | Value |
|---|---|
| TCI server | localhost:50001 (default) |
| Audio device | Flex Audio (virtual CODEC) |
| Hamlib needed | NO — TCI handles everything |
localhost:50001| Radio | Model ID |
|---|---|
| Yaesu FT-450D | 1027 |
| Yaesu FT-857 | 1009 |
| Yaesu FT-891 | 1042 |
| Yaesu FT-950 | 1018 |
| Yaesu FT-991A | 1035 |
| Yaesu FTDX10 | 1041 |
| Yaesu FTDX101D | 1040 |
| Yaesu FTDX3000 | 1037 |
| Kenwood TS-480 | 2025 |
| Kenwood TS-570 | 2017 |
| Kenwood TS-590S | 2031 |
| Kenwood TS-590SG | 2034 |
| Kenwood TS-890S | 2036 |
| Kenwood TS-2000 | 2014 |
| Icom IC-705 | 3085 |
| Icom IC-718 | 3030 |
| Icom IC-746 | 3032 |
| Icom IC-7300 | 3073 |
| Icom IC-7600 | 3061 |
| Icom IC-7610 | 3081 |
| Icom IC-7700 | 3062 |
| Icom IC-9700 | 3079 |
| Elecraft K3 / K3S | 2029 |
| Elecraft K4 | 2029 (compat) |
| Elecraft KX2 | 2044 |
| Elecraft KX3 | 2042 |
| Xiegu X6100 | 4012 |
| Xiegu G90 | 4011 |
Full list via rigctl --list or in the Hamlib source code
in rigs/*.h.
This appendix documents where DECODIUM 4.0 saves each type of data.
C:\Users\<user>\AppData\Local\Decodium\
├── decodium.exe ← main executable
├── Qt6*.dll ← Qt runtime
├── hamlib.dll ← CAT library
├── platforms\, plugins\ ← Qt plugins
├── data\ ← static resources
└── locale\ ← .qm translations
C:\Users\<user>\AppData\Roaming\Decodium\
├── decodium.ini ← main configuration
├── decodium.ini.bak ← backup at every startup
├── log.adi ← ADIF logbook
├── log.adi.bak ← log backup
├── callsign_history.db ← callsign cache (SQLite)
├── logs\ ← log files
│ ├── decodium.log
│ ├── cat.log
│ └── decoder.log
├── cache\ ← temporary cache
│ ├── qmlcache\
│ ├── livemap_tiles\ ← cached OpenStreetMap tiles
│ └── psk_reporter\
└── macros\ ← user custom macros
└── *.macro
/Applications/DECODIUM.app/
├── Contents/
│ ├── Info.plist
│ ├── MacOS/decodium ← main executable
│ ├── Resources/ ← icons, translations
│ └── Frameworks/ ← Qt frameworks
~/Library/Application Support/Decodium/
├── decodium.ini
├── decodium.ini.bak
├── log.adi
├── logs/
├── cache/
└── macros/
~/Library/Caches/Decodium/ ← renewable cache (can be emptied)
~/.local/bin/decodium-1.0.262.AppImage ← (or wherever you put it)
~/.config/Decodium/
├── decodium.ini
├── decodium.ini.bak
└── macros/
~/.local/share/Decodium/
├── log.adi
├── log.adi.bak
├── callsign_history.db
└── logs/
~/.cache/Decodium/
├── qmlcache/
├── livemap_tiles/
└── psk_reporter/
DECODIUM automatically creates daily backups:
| File | When |
|---|---|
log.adi |
current log, always updated |
log.adi.bak |
previous startup backup |
log_YYYY-MM-DD.adi |
daily snapshot (only if enabled in Setup) |
log_export_<timestamp>.adi |
manual export from menu |
| Path | Typical size | Notes |
|---|---|---|
cache/qmlcache/ |
50-200 MB | Regenerable, emptyable |
cache/livemap_tiles/ |
100 MB - 2 GB | Grows with use, can be capped |
logs/decoder.log (debug ON) |
1-2 GB/day | DISABLE when not needed |
log.adi |
1-10 MB | Linear growth with QSO count |
callsign_history.db |
5-50 MB | Grows with stations seen |
Cache cleanup: hamburger menu → Maintenance → Clear cache removes
qmlcache/andlivemap_tiles/. Does NOT touch logs, configuration, history.
In Setup → Advanced → Debug logging, three toggles:
| Toggle | Output file | Estimated growth |
|---|---|---|
DebugCAT=true |
cat.log |
1 MB/hour of intensive use |
DebugAudio=true |
decoder.log (audio section) |
5 MB/hour |
DebugDecoder=true |
decoder.log (full) |
100-500 MB/hour |
Logs follow the Qt standard format:
[2026-05-20 14:32:18.473] [Decoder] [INFO] FT2 slot 14:32:15 → 3 decodes
[2026-05-20 14:32:18.474] [Decoder] [DEBUG] Pass 1: sync@0.532, SNR=-18.3, CRC=OK
[2026-05-20 14:32:18.475] [Decoder] [DEBUG] Pass 2: sync@0.481, SNR=-19.1, CRC=FAIL
[2026-05-20 14:32:18.476] [CAT] [DEBUG] TX: FA00007074000; → OK in 12ms
Levels: TRACE < DEBUG <
INFO < WARNING < ERROR <
CRITICAL
DECODIUM exposes Qt standard categories. To enable/disable categories via env var:
# Unix-like
export QT_LOGGING_RULES="decodium.cat.debug=true;decodium.decoder.debug=false"
./Decodium-1.0.262-x86_64.AppImage
# Windows (PowerShell)
$env:QT_LOGGING_RULES="decodium.cat.debug=true"
.\decodium.exeAvailable categories:
decodium.audio.*decodium.cat.*decodium.decoder.*decodium.network.*decodium.qml.*decodium.ui.*When reporting a bug:
tail -n 1000 decodium.log)The team accepts logs up to 50 MB via GitHub. For larger logs, use gist or file sharing.
DECODIUM does not auto-rotate logs. It’s the user’s responsibility to delete old log files if they become large.
Typical cleanup script (Linux/macOS, daily cron):
#!/bin/bash
# Keeps only the last 7 days of logs
find ~/.local/share/Decodium/logs/ -name "*.log" -mtime +7 -deleteOn Windows, PowerShell equivalent:
Get-ChildItem $env:APPDATA\Decodium\logs\*.log |
Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-7)} |
Remove-ItemDECODIUM 4.0 exposes a UDP communication channel compatible with the WSJT-X UDP protocol (port 2237 default). This allows third-party programs to receive decode notifications, logged QSOs, status changes, and to send commands.
The protocol is designed to be drop-in compatible with WSJT-X. This means existing software like Log4OM, GridTracker, JTAlert, N1MM+, DXKeeper, etc. work with DECODIUM without any modification.
FT2-specific extensions (SUBMODE=FT2 field, ASYMX flag)
are transmitted as additional fields that WSJT-X-compatible clients
ignore without errors.
In Setup → Network → UDP:
| Parameter | Default | Notes |
|---|---|---|
| Enable UDP | ✓ | Disable to turn off the API |
| Multicast address | 224.0.0.1 |
Multicast IP for reception |
| Multicast port | 2237 |
WSJT-X standard port |
| Server name | Decodium |
Identifier (visible to clients) |
| Accept commands | ✓ | Allow clients to send commands (see F.4) |
Important: If multiple DECODIUM applications (or WSJT-X) run on the same PC, they must use different UDP ports to avoid conflicts. The MultiRig CLI (Appendix G) handles this automatically with
--udp-port.
All messages are big-endian following the same encoding as WSJT-X.
Every packet starts with:
[4 bytes] Magic number: 0xADBCCBDA
[4 bytes] Schema version: 0x00000003 (compatible with WSJT-X 2.5+)
[4 bytes] Message type ID
[variable] String "Decodium" (length-prefixed)
[type-specific payload]
| Type ID | Name | Content |
|---|---|---|
| 0 | Heartbeat | Periodic status (1/sec) |
| 1 | Status | Current band, mode, frequency, callsign |
| 2 | Decode | Single decode (see F.3.3) |
| 3 | Clear | Decode list clear |
| 4 | Reply | Response to a Decode (TX prepare) |
| 5 | QSO Logged | Completed and logged QSO |
| 6 | Close | Application closing |
| 8 | WSPR Decode | WSPR decode (rare in DECODIUM) |
| 10 | Logged ADIF | QSO logged as full ADIF string |
| 12 | Highlight Callsign | Color hint for callsign in display |
| 13 | Switch Configuration | Remote config change |
The Decode format is the most important for integrations:
[Common header]
[4 bytes] new flag (1 = first time seen)
[4 bytes] UTC time (ms since midnight)
[4 bytes] SNR (signed dB)
[8 bytes] Delta-time (double, seconds)
[4 bytes] Delta-frequency (Hz)
[variable] Mode string ("FT8", "FT2", "FT4", etc.)
[variable] Message string ("CQ N2SS FM29")
[1 byte] Low confidence flag
[1 byte] Off-air flag
[variable] SUBMODE string (FT2 only: "FT2", "FT2A" for ASYMX)
FT2 extension: The final SUBMODE field is optional. WSJT-X-compatible clients that don’t know it simply stop reading the packet before — their behavior remains correct.
[Common header]
[8 bytes] Date/time off (ms since epoch)
[variable] DX call
[variable] DX grid
[8 bytes] TX frequency (Hz)
[variable] Mode ("FT8", "FT2"...)
[variable] Report sent
[variable] Report received
[variable] TX power
[variable] Comments
[variable] Name
[8 bytes] Date/time on (ms since epoch)
[variable] Operator call
[variable] My call
[variable] My grid
[variable] Exchange sent
[variable] Exchange received
[variable] ADIF property ID (for FT2: "SUBMODE")
[variable] ADIF property value (for FT2: "FT2")
To enable command reception, enable Accept commands in Setup. ⚠️ Only trusted applications should be allowed to send commands.
| Type ID | Name | Effect |
|---|---|---|
| 4 | Reply | Start QSO with indicated callsign |
| 5 | Halt TX | Immediate transmission stop |
| 6 | Free Text | Set free TX text |
| 9 | Switch Config | Load alternative configuration |
| 11 | Replay | Re-decode last slot audio |
import socket
import struct
UDP_IP = "224.0.0.1" # multicast
UDP_PORT = 2237
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(("", UDP_PORT))
# Join multicast group
mreq = struct.pack("4sl", socket.inet_aton(UDP_IP), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
while True:
data, addr = sock.recvfrom(4096)
magic, schema, msg_type = struct.unpack(">III", data[0:12])
if magic != 0xADBCCBDA:
continue
if msg_type == 2: # Decode
print(f"Decode received from {addr}: {len(data)} bytes")
# Parse decode payload here| Software | Tested version | Supported features |
|---|---|---|
| Log4OM | 2.27+ | Auto-log QSO, real-time decode |
| GridTracker | 1.25+ | Live map, Worked-Before highlighting |
| JTAlert | 2.50+ | Audio alert, wanted callsign |
| N1MM+ Logger | 1.0.10+ | Contest logging via UDP |
| DXKeeper | all | Auto-import ADIF |
| HRD Logbook | 6.x+ | Cross-reference via ADIF |
Note on JTAlert: some JTAlert-specific alerts (e.g. “needed for WAS”) depend on SUBMODE. For FT2 contacts, JTAlert version 2.55+ recognizes SUBMODE=FT2 and applies the counts correctly.
[Network] HeartbeatInterval=1000To write robust clients:
DECODIUM 4.0 supports running multiple parallel instances for stations with multiple radios. All command line options are documented here.
decodium [global options] [runtime options] [debug options]Typical launches:
# Single instance, default configuration
decodium
# Specific instance with dedicated config
decodium --instance=2 --config=secondary.ini
# Batch launch with all parameters
decodium --instance=1 \
--rig-port=COM3 \
--audio-in="USB Audio CODEC" \
--udp-port=2237 \
--config=primary.ini| Switch | Type | Default | Description |
|---|---|---|---|
--help, -h |
flag | — | Show help and exit |
--version, -V |
flag | — | Version and build info |
--config=<path> |
path | decodium.ini |
Custom config file |
--instance=<N> |
int | 1 | Instance number (1-9) |
--data-dir=<path> |
path | auto | Custom data folder |
--cache-dir=<path> |
path | auto | Custom cache folder |
--quiet, -q |
flag | false | Reduce console output |
--verbose, -v |
flag | false | Verbose output |
--no-splash |
flag | false | Skip splash screen |
| Switch | INI equivalent |
|---|---|
--rig-type=<id> |
[Radio] RigType |
--rig-port=<port> |
[Radio] RigPort |
--rig-baud=<baud> |
[Radio] RigBaud |
--rig-civ-address=<hex> |
[Radio] CIVAddress |
--hrd-bridge=<host:port> |
[Radio] HRDBridge=true, HRDHost, HRDPort |
--omnirig=<N> |
[Radio] OmniRig=true, OmniRigInstance |
| Switch | INI equivalent |
|---|---|
--audio-in=<name> |
[Audio] AudioIn |
--audio-out=<name> |
[Audio] AudioOut |
--sample-rate=<hz> |
[Audio] SampleRate |
--buffer-size=<frames> |
[Audio] BufferSize |
| Switch | INI equivalent |
|---|---|
--ptt-method=<cat\|vox\|rts\|dtr> |
[PTT] Method |
--ptt-port=<port> |
[PTT] Port |
| Switch | INI equivalent |
|---|---|
--udp-port=<port> |
[Network] UDPPort |
--udp-multicast=<ip> |
[Network] MulticastAddress |
--no-udp |
[Network] EnableUDP=false |
| Switch | INI equivalent |
|---|---|
--ft2-deep=<true\|false> |
[FT2] EnableDEEP |
--ft2-asymx |
[FT2] EnableASYMX=true |
--ft2-qq=<true\|false> |
[FT2] EnableQQ |
| Switch | Effect |
|---|---|
--start-band=<m> |
Starting band (e.g. --start-band=40 for 40m) |
--start-mode=<mode> |
Starting mode (e.g. --start-mode=FT2) |
--start-freq=<hz> |
Exact starting frequency in Hz |
--auto-monitor |
Start with MON active |
--auto-deep |
Start with DEEP active |
| Switch | Effect |
|---|---|
--debug-cat |
Equivalent to [Advanced] DebugCAT=true |
--debug-audio |
Equivalent to [Advanced] DebugAudio=true |
--debug-decoder |
Equivalent to [Advanced] DebugDecoder=true |
--debug-all |
All debug ON |
--log-file=<path> |
Output log to specific file |
# Terminal 1: FT-991A on 20m
decodium --instance=1 \
--rig-type=1035 \
--rig-port=COM3 --rig-baud=38400 \
--audio-in="USB Audio CODEC" \
--audio-out="USB Audio CODEC" \
--udp-port=2237 \
--start-band=20 --start-mode=FT8 \
--config=ft991a.ini &
# Terminal 2: FT-DX10 on 40m FT2
decodium --instance=2 \
--rig-type=1041 \
--rig-port=COM4 --rig-baud=38400 \
--audio-in="USB Audio CODEC #2" \
--audio-out="USB Audio CODEC #2" \
--udp-port=2238 \
--start-band=40 --start-mode=FT2 \
--ft2-deep=true --ft2-asymx \
--config=ftdx10.ini &# Run #1 — main contest, port 2237
decodium --instance=1 --config=contest_main.ini \
--udp-port=2237 --auto-deep --auto-monitor &
# Run #2 — multiplier hunting, port 2238 with N1MM+ feed
decodium --instance=2 --config=contest_mult.ini \
--udp-port=2238 --start-band=40 &
# N1MM+ listening on both (configure in its UDP setup)decodium --instance=3 --config=swl.ini \
--no-udp \
--start-mode=FT2 --start-band=20 \
--ptt-method=none # disable TX entirelyEach instance responds to SIGTERM (Linux/macOS) or
WM_CLOSE (Windows). For clean stop from a script:
# Linux/macOS
pkill -SIGTERM decodium
# or for specific instance:
pkill -SIGTERM -f "decodium --instance=2"
# Windows PowerShell
Get-Process decodium | Stop-ProcessWarning: a
kill -9(SIGKILL) does not save the current session. The ADIF log of the last QSO might not be flushed. Always use SIGTERM.
This appendix documents compiling DECODIUM 4.0 from GitHub source, for those who want to patch, contribute, or build custom releases.
| Repository | URL |
|---|---|
| Main upstream | https://github.com/iu8lmc/Decodium-4.0-Core-Shannon |
| Salvatore mirror | https://github.com/elisir80/Decodium-4.0-Core-Shannon |
Branch main |
Stable releases |
Branch dev |
Development, may be broken |
Branch win |
Windows-specific patches |
| Dependency | Minimum version | Notes |
|---|---|---|
| Qt | 6.11.0 | Required, CORE/QUICK/QML/NETWORK/MULTIMEDIA |
| CMake | 3.21 | Build system |
| GCC / Clang / MSVC | C++17 capable | Compiler |
| gfortran | 9.0+ | Only for lib/ft2/decode174_91_ft2.f90 |
| libfftw3 | 3.3+ | FFT |
| libsndfile | 1.0.31+ | WAV/audio I/O |
| Hamlib | 4.7+ | CAT |
Ubuntu/Debian:
sudo apt install build-essential cmake git \
qt6-base-dev qt6-declarative-dev qt6-multimedia-dev \
libfftw3-dev libsndfile1-dev libhamlib-dev \
gfortran libomp-devFedora/RHEL:
sudo dnf install gcc-c++ cmake git \
qt6-qtbase-devel qt6-qtdeclarative-devel qt6-qtmultimedia-devel \
fftw-devel libsndfile-devel hamlib-devel \
gcc-gfortran libomp-develArch Linux:
sudo pacman -S base-devel cmake git qt6-base qt6-declarative qt6-multimedia \
fftw libsndfile hamlib gcc-fortran openmpmacOS (Homebrew):
brew install cmake qt@6 fftw libsndfile hamlib gcc libomp
brew link --force qt@6Windows: requires Qt 6.11 online
installer + MSYS2 or Visual Studio
2022 with CMake. See docs/BUILD_WINDOWS.md in the
repo.
# Clone with submodules
git clone --recursive https://github.com/iu8lmc/Decodium-4.0-Core-Shannon.git
cd Decodium-4.0-Core-Shannon
# Configure build
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_PREFIX_PATH=/path/to/qt6 \
-DCMAKE_INSTALL_PREFIX=/usr/local \
..
# Compile (use all cores)
make -j$(nproc)
# or on macOS:
make -j$(sysctl -n hw.ncpu)
# Install (optional)
sudo make install
# Launch
./decodium| CMake flag | Effect |
|---|---|
-DCMAKE_BUILD_TYPE=Debug |
Build with debug symbols (+50% size) |
-DCMAKE_BUILD_TYPE=Release |
Optimized build (default) |
-DCMAKE_BUILD_TYPE=RelWithDebInfo |
Release + symbols (for profiling) |
-DENABLE_OPENMP=ON |
Multi-threading decoder (default ON) |
-DENABLE_TESTS=ON |
Build test suite (requires gtest) |
-DENABLE_TCI=ON |
Build with TCI 1.5 support for FlexRadio |
-DUSE_SYSTEM_HAMLIB=ON |
Use system Hamlib instead of bundled |
-DCMAKE_INSTALL_PREFIX=<path> |
Custom install location |
sudo apt install mingw-w64 qt6-mingw-w64-dev
cmake -DCMAKE_TOOLCHAIN_FILE=cmake/mingw-w64-toolchain.cmake \
-DCMAKE_BUILD_TYPE=Release \
..
make -j$(nproc)# On Raspberry Pi OS (64-bit)
sudo apt install qt6-base-dev qt6-declarative-dev qt6-multimedia-dev \
libfftw3-dev libsndfile1-dev libhamlib-dev gfortran
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j4 # Pi 4/5 with 4-8 GB RAMThe RPi community port is maintained by LU7DID — see
https://github.com/lu7did for his specific patches.
# After make
cd build
./tools/build_appimage.sh
# Output: Decodium-1.0.262-x86_64.AppImageThe script includes linuxdeploy + Qt6 plugin, copies runtime libraries, and creates the final AppImage.
CMake Error: Could not find Qt6 (missing: Qt6_DIR)
Solution: specify
CMAKE_PREFIX_PATH:
cmake -DCMAKE_PREFIX_PATH=/opt/qt/6.11.0/gcc_64 ..DECODIUM requires Hamlib 4.7+. On older Debian/Ubuntu, build Hamlib from source:
git clone https://github.com/Hamlib/Hamlib.git
cd Hamlib
./bootstrap && ./configure --prefix=/usr/local && make && sudo make installOpenMP not linked. On macOS:
cmake -DCMAKE_C_COMPILER=$(brew --prefix llvm)/bin/clang \
-DCMAKE_CXX_COMPILER=$(brew --prefix llvm)/bin/clang++ \
-DCMAKE_PREFIX_PATH=$(brew --prefix qt@6) \
..lib/ft2/decode174_91_ft2.f90Missing or old gfortran. Install gfortran 9+ and specify:
cmake -DCMAKE_Fortran_COMPILER=gfortran-11 ..DECODIUM 4.0 is a community-driven project. Every contribution is welcome, from bug reports to new features.
| Channel | For what |
|---|---|
| GitHub Issues | Bug reports, feature requests |
| GitHub Pull Requests | Code contribution |
| Telegram community | Discussions, user support |
| Security, vulnerabilities (private) |
# 1. Fork the repo on GitHub (Fork button top-right)
# 2. Clone your fork
git clone https://github.com/<your-user>/Decodium-4.0-Core-Shannon.git
cd Decodium-4.0-Core-Shannon
# 3. Add upstream
git remote add upstream https://github.com/iu8lmc/Decodium-4.0-Core-Shannon.git
# 4. Create dedicated branch
git checkout -b feature/<short-description>
# Examples:
# git checkout -b feature/icom-ic9700-ptt-fix
# git checkout -b feature/ft2-deep-tuning# Make changes
vim src/decoder/ft2_engine.cpp
# Commit with conventional message
git add src/decoder/ft2_engine.cpp
git commit -m "fix(decoder): preserve sync threshold across band changes
Previously, the FT2 sync threshold was reset to default on every
band change, causing decode loss for the first 2-3 slots.
Fixes #142"
# Push to your fork
git push origin feature/icom-ic9700-ptt-fixCloses #XXX)@iu8lmc and
@elisir80)All commits should follow Conventional Commits 1.0:
<type>(<optional scope>): <short description>
<optional body>
<optional footer>
| Type | When to use |
|---|---|
feat |
New feature |
fix |
Bug fix |
docs |
Documentation only |
style |
Formatting (no logic change) |
refactor |
Refactor without functional change |
perf |
Performance improvement |
test |
Add/modify tests |
build |
Build system, dependencies |
ci |
CI/CD changes |
chore |
Minor maintenance |
revert |
Revert previous commit |
decoder — DSP decoder changescat — radio controlaudio — audio pipelineui — user interfaceft2 — FT2 protocolnetwork — UDP/IPC/PSK Reporterbuild — CMake/build scriptsdocs — documentationfeat(ft2): implement Quick QSO 4-message flow
fix(cat): preserve DATA-U mode across TX/RX transitions on HRD bridge
docs(reference): add FT2 protocol full specification (Appendix A)
perf(decoder): reduce LDPC iteration count from 30 to 20 with no SNR loss
build: bump Qt requirement from 6.10 to 6.11 for new MultiMedia API
refactor(ui): extract WaterfallControls into reusable QML component
| Aspect | Convention |
|---|---|
| Indentation | 4 spaces, NO tab |
| Line length | Max 100 chars |
| Brace style | K&R (open brace same line) |
| Class naming | CamelCase |
| Method naming | camelCase() |
| Member naming | m_camelCase (m_ prefix) |
| Constant naming | kUpperCamelCase (k prefix) |
| Headers | .hpp for C++, .h for C |
| Include order | system → Qt → libs → project |
Example:
#include <iostream> // system
#include <QObject> // Qt
#include <fftw3.h> // lib
#include "decoder/ft2_engine.hpp" // project
class FT2Engine : public QObject
{
Q_OBJECT
public:
explicit FT2Engine(QObject *parent = nullptr);
void processSlot(const float *audioData, int samples);
private:
static const int kMaxPasses = 5;
int m_passCount = 0;
QString m_currentCallsign;
};| Aspect | Convention |
|---|---|
| Indentation | 4 spaces |
| Property naming | lowerCamelCase |
| Components | PascalCase.qml |
| Imports | Qt first, custom after |
| Anchors over geometry | Always |
| Inline JavaScript | Only for trivial logic |
Only for the LDPC file. We keep the style identical to K1JT/WSJT-X to facilitate upstream merging.
cmake -DENABLE_TESTS=ON ..
make decodium_tests
./decodium_testsCurrent coverage: ~40% (focus on decoder core and CAT).
Before a PR, verify:
PRs that touch persistence (INI, log) must test:
A PR adding a feature must update:
Reviews focus on 3 things:
Typical review time: 2-7 days. For urgent fixes, direct ping on Telegram.
Contributors are automatically credited in:
CONTRIBUTORS.md (alphabetical list)Help → About dialog (top contributors)For credit removal requests (privacy): email to maintainers.
This appendix collects 30+ concrete scenarios reported during Public Beta. Each scenario includes: specific symptom, diagnostic logs, identified cause, tested solution.
Symptom: Normal decoding for hours, then suddenly 0 decodes for 5+ minutes, then resumes.
Diagnostic log (decoder.log):
[12:34:56] [Decoder] [WARNING] FFT buffer underrun on slot 12:34:45
[12:35:00] [Decoder] [WARNING] Audio sample rate drift detected: 47950 Hz (expected 48000)
Cause: USB sound card clock drift. Typical on radio-integrated CODECs after long TX/RX sessions (component heating).
Solution: 1. Setup → Audio → Resample to
nominal = ✓ 2. Reduce [Audio] BufferSize from 1024
to 512 3. If persistent, consider an external USB-isolated audio
card
Symptom: 30+ FT8 decodes/slot, 0 in FT2 even with known active stations.
Probable cause: wrong FT2 frequency. The FT2 sub-band does not coincide with the FT8 one.
Solution: - 40m: FT8 = 7.074, FT2 = 7.080 ← often confused - 20m: FT8 = 14.074, FT2 = 14.080 - 15m: FT8 = 21.074, FT2 = 21.080
DECODIUM automatically changes frequency when switching modes, but if you’ve disabled auto-tune, check manually.
Symptom: counterintuitive — more decodes without DEEP than with DEEP.
Cause: system with slow CPU (RPi 3, dual-core processors <2 GHz). DEEP can’t complete the 5 passes in time, some are dropped.
Diagnosis:
[Decoder] [WARNING] DEEP pass 4/5 timeout (847ms > 800ms budget)
Solution: 1. Reduce number of passes:
[FT2] DEEPPasses=3 2. Disable MMSE:
[FT2] EnableMMSE=false (frees 15-20% CPU) 3. Hardware
upgrade if possible (Pi 4 or modern PC)
Symptom: CAT works, but every minute or so
CAT: Timeout briefly appears (yellow flash), then back to
normal.
Cause: poll interval too aggressive for the radio.
Diagnosis (cat.log):
[10:01:00] [CAT] [DEBUG] Poll IF; → response 28ms ✓
[10:01:01] [CAT] [DEBUG] Poll IF; → response 31ms ✓
[10:01:02] [CAT] [WARNING] Poll IF; → timeout after 500ms
[10:01:02] [CAT] [INFO] Retrying...
[10:01:03] [CAT] [DEBUG] Poll IF; → response 47ms ✓
Solution: increase [Radio] PollInterval
from 1000 (default) to 2000 ms.
Symptom: the radio switches to TX (red LED), the PWR meter rises but at 0W or 5W (whisper), no decoding on the other side.
Most common cause: wrong audio device or USB OUT level at zero.
Diagnosis: 1. Check TX VU meter in DECODIUM (bottom): if bar still → no outgoing audio 2. Check radio menu (Kenwood Menu 65, Yaesu Menu 114, Icom USB MOD Level)
Step solution: 1. Setup → Audio → Audio OUT: must be the radio’s USB CODEC device 2. Windows/macOS/Linux audio panel: USB CODEC speaker level at 75-100% 3. Radio USB OUT level menu: start at 5, adjust until you read desired PWR
Symptom: while operating, the radio VFO changes band or frequency in ways you didn’t request.
Most common cause: third-party software (HRD, JTAlert, GridTracker, contest logger) is sending CAT commands concurrently.
Diagnosis: 1. Close all ham software except DECODIUM 2. If the problem disappears → CAT conflict confirmed
Solution: - Option A: use HRD bridge (Setup → Radio → HRD bridge) — HRD becomes the central hub, other programs talk to HRD - Option B: use OmniRig (Windows only) — coordinates CAT access between programs - Option C: if only DECODIUM is needed, leave DECODIUM as the sole CAT software
Symptom: when listening on monitor (MON), intermittent “crackle” is heard. Decodes fail often (CRC fail).
Most probable cause: sample rate mismatch between DECODIUM and sound card, or buffer underrun.
Diagnosis (Linux):
pactl list | grep -A 20 "Source.*USB"
# Look for current sample rateSolution: 1. Setup → Audio → SampleRate: force to
48000 Hz 2. BufferSize: increase to 2048 frames (more stable, slightly
higher latency) 3. On Linux: ensure PulseAudio/PipeWire isn’t
resampling:
bash # Edit /etc/pulse/daemon.conf default-sample-rate = 48000 alternate-sample-rate = 12000 resample-method = soxr-vhq
Symptom: terrible decodes, signal visible in waterfall but decoder fails.
Cause: Windows applies “Audio Enhancements” (noise suppression, AGC, etc.) on the USB CODEC mic. These enhancements destroy the digital signal.
Solution (Windows 10/11):
Control Panel → Sound → Recording →
USB Audio CODEC (Microphone) → Properties → Advanced →
✗ DISABLE "Audio enhancements"
Also, in Enhancements tab (if present): disable everything.
Symptom: the radio is connected, Windows/macOS recognize it, but DECODIUM’s audio dropdown shows nothing.
Cause: sound card initialized after DECODIUM, or Qt didn’t enumerate it.
Solution: 1. Close DECODIUM 2. Verify the sound card
is visible from the operating system (Windows audio
panel / macOS sound preferences / aplay -L Linux) 3.
Restart DECODIUM after having connected/powered on the radio
If persistent, check the card isn’t already in use by other software (e.g. Skype, Zoom in background).
Symptom: open DECODIUM, go to Live Map, see “loading…” for 30+ seconds. Sometimes total UI freeze.
Cause: first download of a large quantity of OpenStreetMap tiles, or OSM rate limiting.
Solution: 1. First time: be
patient. Initial download can take 1-2 minutes. 2. If freeze persists:
clear cache ~/.cache/Decodium/livemap_tiles/ and retry 3.
OpenStreetMap rate limit: max ~2 req/sec. If overloaded (e.g. rapid
zoom), wait 60s
Symptom: the map appears but decodes of W6/JA/VK don’t appear as dots.
Cause: distance filter active or region filter.
Diagnosis: - In Live Map, top: buttons All, IN→ME, ME→DX, BAND - If “BAND” active → shows only current band - If “IN→ME” active → shows only PSK Reporter reverse (requires internet)
Solution: click on All, and in Setup → Live Map → distance filter: 0 (no limit).
Symptom: after update v1.0.260 → v1.0.262, existing logs don’t open or appear empty.
Cause: changed log path, or file system permission issue.
Diagnosis:
# Linux/macOS
ls -la ~/.local/share/Decodium/log.adi
ls -la ~/.local/share/Decodium/log.adi.bakSolution: 1. Verify log.adi.bak exists
(backup auto-created by installer) 2. If yes: restore it:
mv log.adi.bak log.adi 3. If no: the log should still be
where it was before (no path change in v1.0.262)
Symptom: open DECODIUM after update, need to reconfigure everything.
Cause: decodium.ini corrupted during
upgrade (rare).
Solution: restore backup:
# Linux
mv ~/.config/Decodium/decodium.ini.bak ~/.config/Decodium/decodium.ini
# Windows
move %APPDATA%\Decodium\decodium.ini.bak %APPDATA%\Decodium\decodium.ini
# macOS
mv ~/Library/Application\ Support/Decodium/decodium.ini.bak ~/Library/Application\ Support/Decodium/decodium.iniRestart DECODIUM.
Symptom: task manager shows DECODIUM at 90-100% CPU even when idle.
Possible causes: 1. DEEP active on undersized CPU 2. Debug logging left on by mistake 3. Loop bug (rare, report as issue)
Step solution: 1. Setup → Advanced → Debug logging: all OFF 2. Setup → FT2 → DEEPPasses: reduce to 3 3. Restart. If persistent, open Help → Performance Profile, wait 30s, save the file and attach to a GitHub Issue.
Symptom: memory leak. RAM grows continuously until saturated.
Known cause: Live Map tile cache growth + decoder buffers not freed on error path.
Solution (v1.0.262): significantly reduced in v1.0.262. If still present:
Temporary workaround: limit Live Map cache:
[LiveMap]
MaxCacheSizeMB=200Restart DECODIUM every 6-8 hours if needed for contest marathon
Report as issue with a Performance Profile
Symptom: DECODIUM crashes (segfault) at the end of an RX slot, seems random.
Diagnosis: - Linux/macOS: check for a core dump in
~/.local/share/Decodium/crashes/ - Windows: Event Viewer →
Application logs
Known cause: race condition between audio thread and decoder thread on multi-core systems with aggressive scheduling.
Solution (workaround v1.0.262):
[Advanced]
ThreadPoolSize=2 # instead of autoDefinitive fix planned for v1.0.263.
End of the Complete Reference Manual. For discussions, live support and bug reporting, the main channel is the Telegram community (link on ft2.it). For code contributions, GitHub Issues and PRs are the official channel.
73 de Martino IU8LMC & Salvatore 9H1SR DECODIUM / FT2 Team — ARI Caserta · Italy · GPLv3