Ilma · NAVTEX receiver
NAVTEX 518 kHz RTTY 4.5 / 7.6 / 10.1 MHz WEFAX 3.8 / 7.9 / 13.9 MHz

Songs propagating through the air, decoded at sea

Ilma is software that decodes maritime weather services. You bring an RTL-SDR dongle and an antenna; Ilma runs unattended on a Raspberry Pi aboard, or on a Mac or Linux computer.

Source on Codeberg →

The interface

navtex-pi.local:8080
Ilma web interface: barometric-pressure trend in the topbar, NAVAREA and subject-code filters down the side, and a received DWD weather bulletin in the message archive.
518 kHz · MF

NAVTEX

International English service · always on between scheduled windows

SITOR-B FSK at 518 kHz. NAVAREA I stations take turns in fixed 10-minute slots, so there is traffic around the clock. When the same bulletin is re-broadcast a few hours later, Ilma merges the receptions — useful when fading varies between them. Ilma can also listen on the national-language 490 kHz channel, set through its API or as a scheduled window; no 490 bulletin has been received in the field yet.

Protocol
SITOR-B · F1B
Baud
100
Shift
±85 Hz
Areas
NAVAREA I
4.5 / 7.6 / 10.1 MHz · HF

RTTY

DDK2 · DDH7 · DDK9 — scheduled UTC windows

Baudot at 50 baud. Maritime weather forecasts and safety bulletins.

DDH7 · 7646 kHzF1B · 50 baud
ADRIA-N (44.1N  14.0E) SST: 18 C
MO 18. 00Z: S      0-2     0  M //
MO 18. 12Z: SE-S   2-3     0  M //
TU 19. 00Z: SW-W   0-2     0  M //
TU 19. 12Z: NW       3   0.5 M //
WE 20. 00Z: █
Protocol
Baudot · F1B
Baud
50
Shift
±225 Hz
Stations
DDK2 · DDH7 · DDK9
3.8 / 7.9 / 13.9 MHz · HF

Weather fax

DDK3 · DDH3 · DDK6 — Pinneberg, simultaneous

FM-modulated facsimile at 120 lines per minute. Ilma syncs to the phasing band, accumulates the image, and writes one PNG per chart. The chart below is from the Royal Navy's GYA at Northwood, which Ilma can also schedule on 2.6, 4.6, 8.0 and 11.1 MHz.

Decoded 10 m wind forecast chart received from Northwood, valid 22 May 2026 12:00 UTC, showing wind barbs and isotachs over the North Atlantic.
GYA Northwood10 m wind · 22 May 2026 12:00 UTC
Modulation
FM · 120 LPM
IOC
576
Output
PNG · trimmed
Skew
corrected per line
01

Offline re-decode

A separate process re-decodes each RTTY window from its saved recording and replaces the live transcript if it scores at least as well.

02

Archive

Bulletins kept on disk and in SQLite. Search by body text, filter by area, station, subject, or date.

03

Schedule

Daily or one-off UTC windows, editable from the phone UI. Conflicts checked against the NAVAREA I slot table.

04

Phone notifications

Optional ntfy for new bulletins. SAR messages (subject D) bypass filters, per IMO MSC.1/Circ.1403/Rev.2.

From Titanic to NAVTEX

1912 → today

The catastrophic sinking of the RMS Titanic in 1912 was the catalyst for the International Convention for the Safety of Life at Sea (SOLAS), which spurred the requirement for 24-hour radio monitoring at sea. Modern safety systems like NAVTEX are direct evolutions of these regulations. The use of radio waves was a milestone for the safety of ships.

NAVTEX uses frequency-shift keying (FSK) to encode text. It uses forward error correction (FEC) of characters to compensate for noise on the radio link. The technique is an improvement over radioteletype (RTTY).

Weather fax transmissions do not encode the image in character bits. Instead, the luminance of an image is transmitted as a grey value mapped to the 850 Hz band between 1475 Hz (black) and 2325 Hz (white). Like NAVTEX and RTTY, weather fax is received in USB mode, but it needs considerably more bandwidth. Press photo agencies had been using this technique since the 1920s. Think of the exploding Hindenburg Zeppelin in 1937 or the flag raising on Iwo Jima in 1945: iconic photos scanned on a drum and transmitted by fax.

What you need
SDR

Receiver

An RTL-SDR Blog V4 USB dongle. Ilma is the software around it, not a receiver box.

Computer

Pi, Mac or Linux

A Raspberry Pi Zero 2 W on the boat, or any Mac or Linux computer. There is no Windows installer.

518 kHz · MF

NAVTEX antenna

An active marine NAVTEX antenna such as the NASA H-Vector, or on the bench a 1:9 balun on a long wire. MF antennas are deaf on HF.

HF

RTTY and fax antenna

A separate HF antenna: a 1:9 balun feeding a 10–30 m wire, high and clear of electrical noise, or a commercial HF receive antenna.

Two ways to run it
I The bench

Mac or Linux computer with an RTL-SDR

The installer needs no sudo and puts everything in .venv. Ilma then reads the dongle directly. With a different radio, SDR++ can feed audio through BlackHole into main.py --source audio instead. To verify the setup, decode a known broadcast window, such as Den Helder at 14:30 UTC or Pinneberg at 15:00 UTC.

shell · macOS / Linux
# clone, install, run
$ git clone https://codeberg.org/sailingthroughcode/Ilma.git
$ cd Ilma
$ bash scripts/install_desktop.sh
$ .venv/bin/python main.py --source rtlsdr
$ .venv/bin/python web.py --host 127.0.0.1
SDR
RTL-SDR V4, read directly
Other radios
SDR++ · BlackHole · --source audio
Antenna
1:9 balun + long wire
Web UI
localhost:8080
II The boat

Raspberry Pi, headless, on board

The Pi reads IQ directly from the dongle. Capture and decoding are separate systemd services with a 72-hour audio ring between them. setup_pi.sh is idempotent: it installs deps, the RTL-SDR DVB blacklist, the NetworkManager AP profile, and the units. Keep the ring on a USB SSD: at 72 hours it holds about 25 GB of audio.

shell · Raspberry Pi
# one-shot install on a fresh Pi OS
$ git clone https://codeberg.org/sailingthroughcode/Ilma.git ~/navtex
$ cd ~/navtex
$ bash scripts/setup_pi.sh
$ sudo $EDITOR /etc/default/navtex
$ sudo systemctl enable --now \
    navtex-capture.service navtex-decoder.service
SBC
Pi Zero 2 W · headless
IQ rate
256 kS/s direct from pyrtlsdr
Antenna
Active marine NAVTEX
Web UI
navtex-pi.local:8080 · or 10.42.0.1 (AP)