RIFP is an experimental protocol and Python implementation for sending images over low-rate radio links using a binary CPFSK profile at 433.92 MHz, with support for CCITT Group 3/4, JPEG, PNG, and other codecs.

Stars

8

7-day growth

No data

Forks

2

Open issues

0

License

BSD-2-Clause

Last updated

2026-07-28

AI repository intelligence
FR-AI / ANALYSIS

Why it is worth attention

It provides an extensible, CCITT fax-inspired framing protocol with robust error detection (CRC-32, SHA-256), out-of-order delivery, and a published IETF Internet-Draft, targeting low-bandwidth radio environments.

Who it is for

  • Amateur radio operators interested in image transmission
  • Embedded systems developers working with low-rate radio links
  • Remote sensing and IoT data relay projects
  • Packet radio enthusiasts exploring new protocols

Use cases

  • Transmitting weather or satellite images via low-power radio
  • Sending camera snapshots from remote sensors over UHF bands
  • Offline testing and conformance validation of image radio links
  • Experimental disaster communications where bandwidth is extremely limited

Strengths

  • Uses real CCITT Group 3/4 compression for efficient fax-like images
  • CRC-32 on every frame plus SHA-256 verification of complete encoded image
  • Extensible TLV headers and JSON manifests with namespaced extensions
  • Supports multiple codecs (group3, group4, jpeg, png, zlib) and automatic lossless selection

Considerations

  • Requires SDR hardware (transmit-capable like HackRF, receive with RTL-SDR) and regulatory compliance for frequency and duty cycle
  • Currently an experimental protocol (IETF draft -00) with no broad adoption
  • Offline loopback tests require manual configuration of sample/symbol rates; no built-in emulation of regulatory duty-cycle pacing

README quick start

RIFP radio image sender and receiver

The Radio Image Framing Protocol (RIFP) 1.0 is an experimental, extensible standard for sending images over low-rate radio links.

The default rifp-cpfsk-4800 profile uses binary continuous-phase FSK and can be deployed around 433.92 MHz where local regulation permits it. RIFP itself is not tied to 433 MHz or to FSK.

The implementation is not an analogue WEFAX receiver. The group3 and group4 codecs nevertheless use real CCITT Group 3/4 TIFF facsimile compression.

Protocol properties

RIFP 1.0 provides:

  • a 28-byte versioned base header;
  • 64-bit random session identifiers;
  • 32-bit sequence and chunk-count fields;
  • advisory and critical flags;
  • extensible 16-bit type/length/value header fields;
  • MANIFEST, DATA, END and CANCEL frame types;
  • JSON manifests with namespaced extension data;
  • CRC-32 on every frame;
  • CRC-32 and SHA-256 verification of the complete encoded image;
  • out-of-order delivery, repetition and duplicate detection;
  • explicit media types and content-encoding names; and
  • named radio profiles that are independent of the framing protocol.

Unknown advisory extensions are ignored. Unknown critical extensions cause the individual frame to be rejected, allowing future features such as encryption, signatures, FEC and repair requests to be introduced safely.

Dependencies

python3 -m pip install -r requirements_radiofax.txt

For live RF, install SoapySDR, its Python bindings and the hardware module for your SDR. Transmission requires TX-capable hardware such as a HackRF, LimeSDR, PlutoSDR or USRP. Many RTL-SDR devices are receive-only but can run the receiver.

Offline conformance loopback

Run the commands from the directory containing all three Python files:

python3 radiofax_sender.py example.png \
  --preset small --codec group4 --bits 1 \
  --packet-repeats 1 --manifest-repeats 1 \
  --sender-id CIRCL \
  --content-hint "scheduled weather image" \
  --manifest-extension 'org.example.source={"camera":"north"}' \
  --duty-cycle 1 --iq-output example.cf32

python3 radiofax_receiver.py \
  --iq-input example.cf32 \
  --output-dir received-radiofax

Both sides must use the same sample and symbol rates. Defaults are 96 ksample/s and 4,800 symbols/s. IQ-file mode uses --iq-gap and does not add long silence representing regulatory duty-cycle pacing.

Manif

Description

Radio Image Framing Protocol

Related repositories

Similar projects matched by category, topics, and programming language.

lopopolo
Featured
lopopolo GitHub avatar

harness-engineering

Harness Engineering is a methodology for improving coding agent outputs by carefully crafting the environment around them—providing curated context, tools, and executable constraints that encode an organization’s nonfunctional requirements and cumulative lessons.

AI & Machine LearningAI Agents
2,390
slvDev
Featured
slvDev GitHub avatar

esp32-ai

A 28.9 million parameter language model runs on an $8 ESP32-S3 microcontroller entirely on-device, generating simple stories at about 9.5 tokens per second.

AI & Machine LearningLarge Language Models
1,960
littledivy
Featured
littledivy GitHub avatar

mimic

mimic captures traffic from any iOS or web app and automatically generates a Python client library that lets you call the app's API like a regular library.

AI & Machine Learning
1,482