Ilma decodes maritime weather services – unattended on a Raspberry Pi in the boat, and on a Mac for development.
ZCZC PA74 211150 UTC APR 26 MSI 132/26 BROWN RIDGE AREA 20MT ANCHOR FOUND IN POS 52-44.299N 003-11.884E DANGEROUS FOR FISHERY WIDE BERTH REQUESTED.. NNNN
SITOR-B FSK at 518 kHz. NAVAREA I stations take turns in fixed 10-minute slots, so the channel is live around the clock. When the same bulletin is re-broadcast a few hours later, Ilma merges the receptions — useful when fading varies between them.
Baudot at 50 baud. Maritime weather forecasts. Safety bulletins.
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: █
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 also tracks.
A separate process re-decodes each window from saved IQ and replaces the live transcript if it scores better.
Bulletins kept on disk and in SQLite. Search by body text, filter by area, station, subject, or date.
Daily UTC windows, editable from the phone UI. Conflicts checked against the NAVAREA I slot table.
Optional ntfy for new bulletins. SAR messages (subject D) bypass filters, per IMO MSC.1/Circ.1403.
Where I write and verify the decoder.
A 1:9 balun and a long wire is enough for bench reception. SDR++ sends audio into BlackHole 2ch and main.py --source audio reads from there. I check it against a known window — Den Helder at 14:30 UTC, or Pinneberg at 15:00 UTC.
# clone, venv, install, run $ git clone https://codeberg.org/sailingthroughcode/Ilma.git $ cd Ilma $ python3 -m venv .venv && source .venv/bin/activate $ pip install -r requirements.txt $ python3 main.py # default --source audio
A Pi Zero 2 W in a dry locker, fed by a marine NAVTEX antenna.
The Pi reads IQ directly from the dongle. Everything runs as systemd services from boot. setup_pi.sh is idempotent; it installs deps, the RTL-SDR DVB blacklist, the NetworkManager AP profile, and the systemd units.
# 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 # AP_PASSWORD, KNOWN_SSIDS $ sudo systemctl enable --now navtex.service