LXMF Protocol Specification

This appendix specifies the LXMF messaging protocol. Its canonical wire fixture is generated from the Python LXMF 1.1.0 reference (reference/LXMF, commit 795fdaa) running on Reticulum 1.3.5 (commit d5e62d4), and is the compatibility contract for leviculum-lxmf. The original symbol inventory and much of the source-line audit were captured against LXMF 0.9.6 (8499729); changed wire surfaces are called out and tested against the active 1.1.0 lock.

LXMF (Lightweight Extensible Message Format) is the store-and-forward messaging layer of Reticulum. It defines how a message is structured, signed, encrypted, sized, and delivered (opportunistically as a single packet, directly over a link, via a propagation node, or on paper), plus the anti-spam stamp and ticket mechanisms. It moves opaque bytes over Reticulum primitives; it carries no media processing of its own.

The Rust implementation is intentionally client-only for propagation: it can discover a propagation node, upload a recipient-encrypted message as a raw Link Packet or Resource, and perform the /get list, download, and acknowledgement exchange. Propagation-node hosting, transit storage, /offer, and peer synchronisation are documented only as Python-reference context and are not implemented by leviculum-lxmf. The current /get path supports canonical single-segment Link request and response Resources. Packed request or response values above Reticulum's 1,048,575-byte efficient Resource limit, and incoming split request/response advertisements, are rejected until semantic segment reassembly is implemented.

How to read this specification

  • Normative statements use RFC 2119 keywords (MUST, SHOULD, MAY) and specify behaviour an interoperable implementation has to reproduce. Every normative fact carries either a file:line citation into the reference, a derivation with the arithmetic shown, or a labelled test vector [VEC-...].
  • Informative sections describe internal reference behaviour (router scheduling, queues, persistence) that an implementation MAY diverge from without breaking wire or semantic compatibility.
  • Test vectors are the genuine byte output of the reference, regenerated by vectors/gen_vectors.py and pinned to the submodule commits. A citation proves "the code says this"; a vector proves "these are the bytes".

Sections