11/05/2026

Ilma, a Navtex Decoder for the Raspberry Pi

I’m a sailor and I built a Ilma,1 a Navtex2 decoder for the Raspberry Pi. Getting weather forecasts and navigational warnings is essential when sailing offshore. The Pi receives radio broadcasts, saves them as audio files and decodes them using multi-level error correction. The Navtex messages are saved in a database3 and accessible via web interface and push notification. ⇨ Ilma’s open source code

The Raspberry Pi Zero 2 W in a project box with a knob encoder and a small OLED display.

The Raspberry Pi Zero 2 W in a project box with a knob encoder and a small OLED display.

Why use a seemingly dated 1970s technology like Navtex when we can have broadband internet via satellite even in the middle of an ocean? Because Starlink, a private company, does not seem that reliable to me and needs quite a lot of power (Mini: 30 W during active use4 vs. 1–2 W for the Pi5) – significant on a sailboat. Navtex is a free international service operated by governments.

Existing software decoders6 mostly assume a sailor at a laptop. What I wanted instead was a headless service: RTL-SDR in, Pi running unattended on boat battery power and sending messages into a database, web UI and push warnings out. Standalone commercial Navtex receivers run reliably and at very low energy consumption,7 but they’re closed appliances and don’t let you extend the receiver, e.g. to RTTY, weatherfax, or the future option to republish Navtex messages on a Signal K bus for consumption by OpenPlotter. Last but not least, I enjoy developing and learning.

From the sinking of the Titanic to Navtex

Navtex is a maritime safety information system for broadcasting navigational warnings and weather forecasts. Navtex is part of the Global Maritime Distress and Safety System (GMDSS).8 On the 518 kHz medium frequency,9 messages are transmitted by stations with a range of a few hundred nautical miles. Each station has a 10-minute time slot every four hours.10 The NAVAREA I (Northeast Atlantic, North Sea, Baltic Sea) schedule fills the four-hour cycle with 21 stations across 11 countries:11

Country         B1  Station            Times (UTC)
Belgium         T   Oostende           0310 0710 1110 1510 1910 2310
                V   Oostende (UK svc)  0330 0730 1130 1530 1930 2330
Estonia         U   Tallinn            0320 0720 1120 1520 1920 2320
Faroe Islands   D   Tórshavn           0030 0430 0830 1230 1630 2030
France          A   Cross Corsen       0000 0400 0800 1200 1600 2000
Germany         S   Pinneberg          0300 0700 1100 1500 1900 2300
Iceland         R   Saudanes           0250 0650 1050 1450 1850 2250
                X   Grindavik          0350 0750 1150 1550 1950 2350
Ireland         Q   Malin Head         0240 0640 1040 1440 1840 2240
                W   Valentia           0340 0740 1140 1540 1940 2340
Netherlands     P   Coastguard Radio   0230 0630 1030 1430 1830 2230
Norway          L   Rogaland           0150 0550 0950 1350 1750 2150
                M   Jeløy              0200 0600 1000 1400 1800 2200
                N   Ørlandet           0210 0610 1010 1410 1810 2210
Sweden          H   Bjuröklubb         0110 0510 0910 1310 1710 2110
                I   Grimeton           0120 0520 0920 1320 1720 2120
                J   Gislövshammar      0130 0530 0930 1330 1730 2130
United Kingdom  E   Niton              0040 0440 0840 1240 1640 2040
                G   Cullercoats        0100 0500 0900 1300 1700 2100
                K   Niton (FR svc)     0140 0540 0940 1340 1740 2140
                O   Portpatrick        0220 0620 1020 1420 1820 2220

Navtex uses frequency-shift keying (FSK) to encode text.12 Specifically, the frequency of a carrier wave is rapidly shifted by 170 Hz, where the high frequency is a mark (1), and the low frequency is a space (0). Using FSK, 7-bit characters are encoded using the CCIR 476 set and transmitted at 100 baud (about 14 characters per second, halved by error correction). This kind of text transmission, called SITOR-B (for Simplex Teleprinter Over Radio), was developed by the Dutch PTT in 1970. It uses forward error correction (FEC)13 of characters to compensate for noise at the radio link. An example of a Navtex message looks as follows:14

OE44ISSUED BY THE MET OFFICE AT 0620 ON FRIDAY 27 MARCH
GALE WARNINGS: ROCKALL MALIN HEBRIDES SE ICELAND
THE GENERAL SITUATION AT MIDNIGHT
LOW GERMAN BIGHT 1001 MOV SEAWARDS AND LOSING ITS
IDENTITY. NEW LOW EXP JUST W OF ROCKALL 989 BY MIDNIGHT
TONIGHT
24-HR FCSTS
LUNDY FASTNET
SE VEER SW 5 OR 6, INCR 7, PERHAPS GALE 8 LATER. MOD OR
ROUGH, BECMG ROUGH OR VERY ROUGH LATER. OCCASIONAL RAIN,
FOG PATCHES DEVELOPING. GOOD BECMG POOR OR VERY POOR …

The technique is an improvement over radioteletype (RTTY) that uses the ITA2 character code. Its predecessor was the Baudot code invented for telegraphy by Emile Baudot in the 1870s. These are codes for telegraphic transmission, of which Morse was the first. The first transatlantic telegraph cable in 1858 was a glorious achievement, but of no value to ships.

The use of radio waves was a milestone for the safety of ships. Electromagnetic waves, self-sustaining oscillations of electric and magnetic fields, need no medium to travel – no aether – and propagate through vacuum at the speed of light. Guglielmo Marconi sent the first wireless telegraph signals across the Atlantic in 1901. The Marconi company was responsible for radiotelegraphy on the RMS Titanic. The two radio operators of the RMS Titanic were busy sending telegrams instead of monitoring ice reports. A significant chunk of their pay came from commissions on passenger telegrams. As a result, the ice warnings of two nearby ships, the SS Mesaba and the SS Californian, never made it to RMS Titanic’s bridge.15

The catastrophic sinking 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.16

The hardware of the Navtex receiver: a Pi

A Raspberry Pi Zero 2 W (512 MB RAM) is used with the Pi OS 64-bit Lite (Debian 13 ‘Trixie’). A UPS-HAT-(C) ensures the Pi survives power cuts on the sailboat.

The Pi lives in a small project box. A rotary knob (KY-040 encoder) lets the user choose options and safely power down the Pi. A small OLED display shows a status message – it’s much too small (128x64px) to display an entire Navtex message. A future possibility is to use a separate e-ink display to show the latest Navtex message.

An RTL-SDR V417 dongle receiver is connected via USB. It gets enough power from the Pi even without a powered USB-hub. A NASA Marine H Vector Navtex antenna18 was bought for its weather sealing – and rather than winding hundreds of turns of enamelled copper wire onto a ferrite-rod myself. For testing and receiving RTTY broadcasts on land, a simple wire antenna with DIY 1:9 balun was rigged.19

The software on the Pi

The decoding chain starts with audio: after USB demodulation, the two FSK tones land in the audible band. An FFT over a few hundred milliseconds locates them as the two dominant peaks below roughly 2 kHz; for Navtex these are near 915 and 1085 Hz, but the exact pair depends on dial offset and is estimated from each recording rather than hard-coded. Mark and space amplitudes are then tracked by narrow filters at each tone frequency.20 At every bit period (10 ms at 100 baud), the synchronous slicer compares the two amplitudes and emits 1 for mark, 0 for space. SITOR-B’s bit clock runs continuously across a message, so one symbol phase is locked at the start and reused throughout. The resulting bit stream feeds the CCIR 476 framer.21

Illustration of Navtex FSK decoding.

1. 80 ms of audio waveform. Around the middle of the snippet, the frequency of the sine changes. This is the visual signature of FSK and shows what "frequency shift keying" actually looks like in time.
2. Power spectrum (Welch, 30 s averaged). Two peaks at 915 Hz (mark) and 1085 Hz (space), 170 Hz apart, with the rest of the band three orders of magnitude below. This is what the FFT-based tone-detection step sees.
3. Mark and space amplitudes over 200 ms, with decoded bits. Blue is the mark-tone amplitude, red the space-tone amplitude, both from a sliding complex matched filter. They swap dominance every 10 ms (one bit period). The black step function is the synchronous slicer's output: 1 when mark wins at the bit centre, 0 when space wins. Reads end-to-end as the bit stream that feeds the CCIR 476 framer.

The Pi Zero 2 W’s modest capacity requires lean signal processing. Reading the RTL-SDR at its default 2.048 MS/s rate dropped parts of the signal, so the sample rate was reduced to 1.024 MS/s.22 Reading the dongle in a continuous stream and decimating on the fly didn’t work either: even on the development Mac the streaming decimator sustained only 86% of realtime, dropping samples in bursts. The fix was to read 30 seconds of samples in a single batch and decimate offline. Decimation itself was a second bottleneck. Going from 1.024 MS/s down to the 48 kS/s audio rate in a single step would have demanded a long Finite Impulse Response (FIR)23 filter running at the full input rate, around 150 million multiply-accumulates per second. The Pi can’t sustain that. A two-stage cascade does it instead: a short 81-tap filter decimates first to 256 kS/s, then a polyphase resample drops to 48 kS/s. Each stage stays under 25 million operations per second, an order of magnitude cheaper than the one-shot filter, with the same audio output.

During development, the incoming radio signal ran through SDR++ and BlackHole audio on a Mac. The next step was a sdr_source.py module wrapping pyrtlsdr and reading the signal directly inside Python. Worth noting: pyrtlsdr’s 0.4 release changed the buffer API in a way that breaks the read pattern the decoder uses. It had been unit tested against a synthetic signal, but the code had never been exercised against a real dongle.

A codebreaking-style debugging of a three-layered bug

For testing, a synthetic encoder fed the demodulator and round-tripped cleanly. The next step was using a WebSDR24 in an area with Navtex signal access. One of the early trials fed a WebSDR-recorded signal from Heraklion.25 757 seconds of strong signal produced this output: KQARK GBKGWGRH BSGKR JCQ JCQ .... No ‘ZCZC’ frame anywhere (every Navtex message is framed by ZCZC … NNNN), although the waveform clearly showed the start of the transmission.

The first bug was the alphabet table – I had somehow got it wrong. SITOR-B uses a 35-symbol code over 7-bit constant-weight codewords (four mark bits, three space bits). The synthetic round-trip had not caught the bug because encoder and decoder shared the same dictionary. Correcting the table26 produced output that was more English-shaped, but still no ‘ZCZC’.

The second bug lay in FEC: CCIR 476 mode B sends every character twice, with the second copy delayed by five codeword positions (350 ms at 100 baud);27 the receiver uses the first copy if it satisfies the 4-of-7 constant-weight check, otherwise falls back to the delayed one.28 Every codeword has exactly four marks and three spaces, so any single-bit error breaks the weight invariant and is detected without parity bits.29

The third bug was the bit order on the wire. With alphabet and FEC fixed, the only remaining unknowns were the alignment phase and the bit transform. The transmitter sends each codeword’s bits least-significant first (little-endian on the wire); the decoder had been packing them into the most-significant position (big-endian) instead of the least. The pattern is cryptanalytic: when the alphabet is right but the output is not English, enumerate the small space of remaining structural transforms, score each candidate by English-shaped statistics, take the winner.30

After correcting these three bugs, the Heraklion message dropped out immediately. ZCZC HE23 032000 UTC MAY 26 IRAKLEIO RADIO/WEATHER FORECAST.

Restoring corrupted text without AI in 2026, really?

One of the most interesting aspects of developing a Navtex receiver is applying different strategies for error correction of the transmitted characters. The International Maritime Organization (IMO) demands that NAVTEX receivers perform with a character error rate below 4% for satisfactory message reception.31

The obvious route in 2026 is to reach for AI.32 A recent paper by Cho et al.33 benchmarks dictionary lookup, character n-grams and transformer-encoder Masked Language Modeling (MLM) on this exact restoration task. The MLM wins overall: 85% restoration against 64% for 5-grams and 59% for dictionary alone.

A Pi Zero 2 W with 512 MB RAM cannot host the paper’s 50-million-parameter model trained on an A100 GPU with 80 GB memory. A model small enough to fit on the Pi collapses to n-gram quality. The MLM also masks errors uniformly at random, while real Navtex corruption comes in bursts caused by fading. The authors flag this as a limitation, having no channel statistics in their dataset.34 Finally, the model restores digits with only 45% accuracy. Navtex digits are coordinates, frequencies and timestamps – places where a confidently wrong character is actively dangerous. An asterisk (signifying a dropped character or digit) is more honest than a guess.

My decoder uses a 5-gram character model with confidence gating.35 It treats digit positions conservatively and does not try to restore them.

Take a real bulletin captured from Den Helder: 1521 characters of weather forecast, with 175 of them lost (a heavily scrambled 12%) and marked with * after SITOR-B’s forward error correction gave up. The decoder hands the body to the n-gram, which scores every vocabulary character at every asterisk and keeps only fills whose confidence exceeds a threshold. At a threshold of 0.5, the model fills 37 of the 175 asterisks at a mean confidence of 0.69. The fills that survive are mostly word-boundary spaces and word-internal letters, where the surrounding text gives the n-gram unambiguous context. The threshold is a knob, not a hidden constant. Drop it to zero and the model fills 83% of asterisks but at a mean confidence of 0.30, where most fills are guesses. Raise it to 0.7 and only 18 fills survive, at a confidence of 0.81. On a 200-message pilot corpus the same 0.5 threshold filled only 12 positions; a full year of training data from navtex.net36 tripled that with slightly higher confidence.

A bench test illustrates the shape. A constructed bulletin PA42 NAV WARN*NG TEST GA*E FORCE 8 BIGHT hands two erasures to the n-gram. It fills WARNING and GALE at a confidence of 0.39.37

Rather than extending the training corpus, I tried another approach. Navtex messages are re-transmitted at four-hour intervals, which lets a scrambled copy be repaired against a later one. A re-broadcast of an already-stored bulletin (matching frequency, station, subject, serial) is now folded into the existing row rather than appearing as a duplicate. The merge can only fill asterisks, and only when lengths match. The decoder keeps the received text and a restored sidecar text side by side. The web UI shows the received text, a checkbox swaps in the restored version per row. When a re-broadcast fills the last asterisk legitimately and the merged body has nothing left to restore by the n-gram, the sidecar is dropped.

The problem of information restoration is older than communications engineering. DNA repair has been solving the same problem – preserve a signal through a noisy channel38 – for several billion years. SITOR-B’s two-copy time diversity and my combining of repeated broadcasts are cousins of paired complementary DNA strands; the n-gram resembles translesion synthesis.

That doesn’t solve the decoder’s inability to restore a Navtex message that was not received properly. No creatio ex nihilo here.

The lightbuoy off Juist is unlit

When I was in Switzerland and not on my boat in the Netherlands, I had no access to Navtex signals – they just don’t travel that far. Therefore, I considered validating the signal chain on DCF77, the German time signal at 77.5 kHz, approximately 300 km away in Frankfurt. I plugged the wire in, fired up SDR++, tuned 77.5 kHz, and saw nothing. The reason is mundane. The RTL-SDR V4’s internal upconverter cuts off around 500 kHz; 77.5 kHz is below that. The dongle simply can’t tune low enough.

In contrast to medium-wave Navtex transmissions, Pinneberg’s short-wave broadcasts travel much further. Navtex’s groundwave propagation travels along the Earth’s surface, whereas short-wave reflects off the ionosphere for long-distance communication. The transmitter station of Deutscher Wetterdienst (DWD) near Hamburg transmits RTTY on short-wave frequencies at 50 baud with a 450 Hz shift.

RTTY is not Navtex, but parts of the decoder are general. The FSK demodulator and tone estimator are parameterised by mark, space and baud rate. A small Baudot/ITA-2 framer of around 80 lines reads the bit stream. The synchronous slicer used for SITOR-B produced regular bit slips on RTTY, because RTTY is asynchronous and resyncs on each character’s start bit. A per-character edge-aligned sampler fixed it.

The first clean message received on the Mac was a bulletin from Pinneberg of 4 May 2026, 17:00 UTC with navigational warning No. 183: a lightbuoy off Juist had gone dark overnight.

Later, and only after sundown, end-to-end RTTY decode on the Pi was successful. What a difference a day makes: lower-frequency radio signals travel much further at night.39

The Pi’s interface

Stored Navtex messages are read through a web interface from a laptop, tablet or smartphone. The Pi works in a dual-mode WiFi as a client of known SSIDs, and falls back to a private AP.40 Urgent warnings are pushed to the sailor’s smartphone via ntfy.41 A buzzer (KY-012) notifies the crew about SAR alerts arriving via Navtex.

The SQLite database allows for filtering by Navtex message area (e.g. Navarea 1 – North Atlantic, North Sea, Baltic Sea) and type (e.g. navigational or meteorological warnings, forecasts).

Beyond the Navtex side, a BME280 sensor connected to the Pi reads barometric pressure. The 3-hour pressure tendency is one of the most important weather indicators a sailor has. It’s displayed on the OLED. The web UI shows the full pressure curve.

Web interface of the Navtex receiver.

Web interface of the Navtex receiver. A filter selects message type, for example navigational warnings or meteorological forecasts.

I first wrote about the idea of a headless Pi receiver in 2023, during a stormy christmas week in the Dutch Wadden Islands playing with an RTL-SDR, a wire antenna, and a Python RTTY decoder. Then the project slept until May 2026. The arrival of LLM-based programming with Claude Code allowed me to develop the current Navtex implementation at a pace that kept my motivation high.

Footnotes

  1. Ilma, a living linguistic fossil, in Finnish means air and weather, but also a medium not unlike the aether. The Kalevala begins with Ilmatar descending from the upper air into the vast, empty sea, where she becomes pregnant through the forces of wind and water.

  2. NAVTEX is an international automated direct-printing service for promulgation of maritime safety information (MSI), navigational and meteorological warnings, meteorological forecasts and other urgent safety-related messages to ships.
    The International Maritime Organization (IMO) has finalized performance standards for NAVDAT (Navigational Data), a digital broadcasting system designed to transmit maritime safety and security information from shore to ships at high speeds using Medium Frequency (MF) and High Frequency (HF) bands. NAVDAT is designed as a next-generation successor to NAVTEX, providing much higher data capacity for text, images, and files. It’s still in limited regional deployment; NAVAREA I has no NAVDAT broadcasts to receive.

  3. Re-broadcasts of the same bulletin merge in place rather than duplicate, and an n-gram restoration sits alongside the received text.

  4. Pi Zero 2 W idle is ~0.4 W at the 5 V rail; under continuous USB read from an RTL-SDR V4 (~0.3 A on its own) and Wi-Fi active, total bus draw is roughly 1–2 W according to Raspberry Pi Ltd power docs.

  5. fldigi is the long-running open-source amateur-radio FSK suite and includes a NAVTEX mode; it assumes a desktop operator running it interactively.

  6. Tens of mA at the 12 V rail per typical datasheets, about 2 W.

  7. German DWD and the British Admiralty publish their current Navtex messages on their websites.

  8. 518 kHz medium-frequency ground-wave propagates well over saltwater with a 300-400 nautical miles coverage. ITU-R M.540 explains the allocation.

  9. A list of all Navarea coordinators.

  10. Schedule per ITU GMDSS.1/Circ.21 (31/05/2017) Annex 7 Table 4, the IMO-coordinated authoritative list of NAVTEX coast stations.
    Faroe Islands is an Associate Member of NAVAREA I. Niton (UK) and Oostende (BE) each appear twice because the same physical transmitter is used for two services: slot K carries French maritime content for the NE France coast and Channel Islands; slot V carries the UK Thames Approaches service.

  11. Operational and technical characteristics for the Navtex system ITU-R M.540. The Navtex Manual is available for download at the International Maritime Organization (IMO).

  12. Hamming RW. Error Detecting and Error Correcting Codes. Bell System Technical Journal 1950;29:147-60.

  13. Cited from the Navtex Manual available for download at the International Maritime Organization (IMO).

  14. British Wreck Commissioner’s Inquiry, 1912, evidence of Cyril Evans. Also, there is an interview with Harold Bride, one of the two radio operators of the Titanic, in The New York Times, 28 April 1912 (Jack Phillips, the other operator, died in the sinking). See the Titanic Inquiry Project.

  15. SOLAS regulation IV/12.2 states that “Every ship, while at sea, shall maintain a radio watch for broadcasts of maritime safety information on the appropriate frequency or frequencies on which such information is broadcast for the area in which the ship is navigating”.

  16. The RTL-SDR ecosystem rests on librtlsdr, the reverse-engineered driver originally by Steve Markgraf and the Osmocom team. pyrtlsdr is a Python wrapper around it.

  17. The RTL-SDR V4 has a selectable Bias Tee function providing 4.5V / 180mA.

  18. A 1:9 balun on a wire (antenna) lowers impedance ~450 Ω against ground at HF to ~50 Ω for the SDR.

  19. The classical tool for detecting a single tone is the Goertzel algorithm. It would be slow in Python because each step depends on the previous one and cannot be parallelised across samples. The decoder instead uses matched filters built on NumPy primitives that run as compiled C under the hood, which is fast enough on the Pi.

  20. Signal-processing chain: 1.024 MS/s signal from the RTL-SDR – tune to 518 kHz baseband – decimate to 256 kS/s, then resample to 48 kS/s – USB demodulation produces a real audio stream where the two FSK tones land near 915/1085 Hz – 30-second WAV files written to disk – the FFT/matched-filter/slicer/framer chain runs on the stored audio rather than on a live stream.

  21. The math allows much lower rates, but the hardware doesn’t reliably deliver them, and the engineering payoff after the cascade fix is small.

  22. An IIR filter would have lower computational cost, but linear phase matters for the synchronous FSK slicer (mark and space tones must keep the same group delay), and IIR can’t use the polyphase decimation trick that lets the FIR skip computing samples it would discard anyway. The compute advantage shrinks in a decimation context.

  23. WebSDR was developed by Pieter-Tjerk de Boer (PA3FWM), who also operates the Twente WebSDR used here. A useful list of WebSDR sites.

  24. WebSDR SV1BTL, located in Athens GR.

  25. The website of Paul Lutus has a Java NAVTEX decoder with detailed signal-processing write-up. Particularly interesting: cascaded biquad-filter slope-detection alternative to matched filtering, the documented −7.5 dB-below-noise decode threshold, the corrected CCIR 476 tables, and two short test recordings.

  26. ITU-R M.625 and various secondary references describe the same interleaving in slightly different counting conventions (some count the gap inclusively, some exclusively, some count character intervals rather than codeword positions). Empirically lag-5 codeword autocorrelation dominates real signals. This corresponds to DX(N) at even position 2N and RX(N) at odd position 2N+5, i.e. a 5-codeword (350 ms) gap.

  27. As per technical standard ITU-R M.476-5.

  28. Any single-bit flip changes the weight by 1, so 4 becomes 3 or 5 and the check fires. Even-numbered errors that swap one mark and one space preserve the weight and slip through.

  29. Shannon CE. Prediction and entropy of printed English. Bell System Technical Journal 1951;30:50-64. Link to pdf reprint.

  30. IMO MSC.148(77)

  31. Assael et al. Restoring and attributing ancient texts using deep neural networks. Nature 2022;603:280-3.

  32. Cho et al. Comparative Performance Analysis of Software-Based Restoration Techniques for NAVTEX Message. JMSE 2025;13:1657.

  33. MCAR / MAR / MNAR is a taxonomy from missing-data theory, formalized by Donald Rubin in Biometrika 1976;63:581-92. It classifies why data is missing. Applied to Navtex: when ionospheric fading drops the signal-to-noise ratio, you lose a burst of consecutive characters, not isolated ones. The missingness pattern is structured by an underlying observable: the channel state, i.e. the properties of the propagation path between transmitter and receiver.

  34. An n-gram character model is a type of probabilistic language model that predicts the next character in a sequence based on the previous characters.

  35. The Navtex Archive, run by Geir Laastad, is the largest collection of Navtex bulletins I am aware of. The n-gram training corpus for this project (year 2024) was scraped from there at one request per second.

  36. The mean confidence figure averages the softmax probability of the chosen character across positions where the model committed to a fill. A confident fill (a clear winner against the rest of the vocabulary) scores 0.7+, an ambiguous fill where the right letter wins narrowly scores 0.3-0.5. Positions where no candidate stood out stay ’*’.

  37. Shannon CE. A Mathematical Theory of Communication. Bell System Technical Journal 1948;27:379–423.

  38. Daytime attenuation of lower-frequency signals is caused by D-layer absorption. The D-layer, roughly 60–90 km high, absorbs frequencies below the 20-meter band. After dark, these lower frequencies are no longer absorbed.

  39. The Pi self-hosts the web UI on 10.42.0.1:8080 if no known SSID is reachable.

  40. Push notification is available on Android phones. On iOS it’s not as simple, as Apple demands sending over the cloud, which is not available offshore without internet access.

l>