LXMF-rs v0.4.0 Release Notes
Date: 2026-06-14
Release ref: v0.4.0
This is the ZeroMQ SDK integration release for REM 1.1.1 and RCH pre-3.0
Rust consumers. It promotes the typed lxmf-sdk ZeroMQ path through
ZmqPipelineBackendClient so clients can rely on SDK methods instead of raw
RPC/HTTP calls for the release scope below.
This release is not a claim of complete drop-in Python Reticulum/LXMF
replacement parity. The maintained parity source of truth remains
docs/status/current-roadmap.md.
Scope
- Typed ZeroMQ SDK foundation for REM/RCH client integration.
- Basic LXMF wire field preservation through the SDK send and batch-send paths.
- Peer discovery, saved-peer lifecycle, capability announce metadata, display
names, callsigns, stale-peer filtering, and reconnect-oriented peer state. - Durable direct-chat SDK flows for one-to-one messages, conversation summaries,
receipt visibility, retry/cancel status metadata, restart-recovered history,
link-bearing message bodies, and burst-send result stability. - Propagation-first SDK coverage for peer sync, remote fetch/download/sync,
unpeer, node selection, local propagation status/config, delivery policy,
payload ingest/fetch, sync acknowledgement, recovery state, retry/timeout,
denial, queue cleanup, and persistent queue visibility.
Highlights Since v0.3.0
- Added typed ZeroMQ SDK peer identity, directory, stale-filter, saved-contact,
peer lifecycle, and capability announce surfaces. - Preserved documented LXMF custom field keys and
_lxmf_fields_msgpack_b64
through the typed SDK send path for REM/RCH payload compatibility. - Treated payload
bodyas direct-chat message content whencontentis
absent while still preserving the originalbodyfield for client renderers. - Added typed batch-send, cancel, status retry metadata, receipt terminality,
local delivery-destination lookup, durable history, and conversation summary
flows over the SDK envelope path. - Added typed propagation SDK methods and result projections for peer sync,
remote transfer lifecycle, propagation node lifecycle, local propagation
lifecycle, payload store access, recovery state, policy metadata, transfer
accounting, queue snapshots, retry/postponement, denial, timeout, and
restart-recovery diagnostics. - Updated roadmap and parity status to describe the ZeroMQ SDK release path
while keeping application-level REM/RCH schemas out of scope.
Current Version Train
GitHub release version: v0.4.0
Crate/package versions intentionally remain per the publish plan rather than one
blanket workspace version:
lxmf:0.3.0reticulum-rs-rpc:0.3.0lxmf-sdk:0.2.1lxmf-wire:0.2.0reticulum-rs-core:0.2.0reticulum-rs-transport:0.2.0- app/tool crates remain unpublished and are distributed through GitHub bundles
Validation Record
- Main integration PR for the ZeroMQ SDK stack:
#340 - PR #340 required checks passed:
quality,correctness,
build-matrix (stable),test-nextest-unit, andcontracts. - Focused local checks before integration included:
cargo test -p lxmf-sdk --features zmq-pipeline-backend zmq_pipeline -- --nocapture --test-threads=1cargo test -p reticulum-rs-rpc sdk_propagation -- --nocapturecargo fmt --all -- --checkcargo check -p lxmf-sdk --features zmq-pipeline-backendcargo clippy -p lxmf-sdk -p reticulum-rs-rpc --lib --all-features --no-deps -- -D clippy::manual_assert -D clippy::redundant_clone -D clippy::iter_cloned_collectC:\Program Files\Git\bin\bash.exe tools/scripts/check-module-size.sh
Known Limits
- Propagation interoperability and operational substitutability are still marked
partial indocs/status/current-roadmap.md. - Full Python surface parity is not achieved.
- Application-level REM/RCH schemas are out of scope for this release; LXMF-rs
provides the basic LXMF fields and typed SDK transport behavior those clients
need. - External-client compatibility claims for Sideband, MeshChatX, and Columba
require separate external-client interop gate evidence. - Hardware and prepared-host evidence for all interface paths remains broader
than the automated CI evidence.
What's Changed
- [codex] Refactor lxmf-sdk app modules by @CoteTommy in #140
- [codex] Refactor rns-rpc daemon modules by @CoteTommy in #141
- [codex] Extract rns-rpc daemon helper modules by @CoteTommy in #142
- Refactor rnx command modules by @CoteTommy in #143
- Extract rnx harness helpers by @CoteTommy in #144
- [codex] Refactor lxmd command modules by @CoteTommy in #145
- [codex] Refactor reticulumd bridge modules by @CoteTommy in #146
- [codex] Refactor reticulumd inbound worker modules by @CoteTommy in #147
- Refactor reticulumd bootstrap transport startup by @CoteTommy in #148
- Bump rusqlite to 0.37.0 by @zippy in #149
- udp multicast by @zippy in #151
- Fix CI cleanup after UDP multicast merge by @brothercorvo in #152
- Fix daemon LXMF and RNS runtime findings by @brothercorvo in #150
- Install BLE deps in nightly workflows by @CoteTommy in #153
- Add external client interop release gate by @CoteTommy in #154
- Record external interop gate evidence metadata by @CoteTommy in #155
- complete python lxmf reticulum compatibility by @CoteTommy in #158
- [codex] Refactor transport routing and daemon bridge modules by @CoteTommy in #159
- [codex] split inbound worker handlers by @CoteTommy in #160
- [codex] narrow transport internals by @CoteTommy in #162
- [codex] model receipt delivery states by @CoteTommy in #163
- [codex] move propagation control tests by @CoteTommy in #164
- [codex] move send outcome tests by @CoteTommy in #165
- rename reticulum path store module by @CoteTommy in #166
- extract peer control commands by @CoteTommy in #167
- extract announce ingest handler by @CoteTommy in #168
- extract bootstrap destination setup by @CoteTommy in #169
- make resource status predicates explicit by @CoteTommy in #170
- make link status predicates explicit by @CoteTommy in #172
- move propagation link cache state by @CoteTommy in #173
- extract python compat matrix support by @CoteTommy in #174
- extract lxmf cli compat harness by @CoteTommy in #175
- add transport path facade by @CoteTommy in #176
- extract outbound resource tracking by @CoteTommy in #177
- extract lxmd three node harness by @CoteTommy in #178
- extract python channel interop paths by @CoteTommy in #179
- extract python paper helper adapter by @CoteTommy in #180
- [codex] Rename TCP interface hot apply bridge by @CoteTommy in #181
- [codex] Extract lxmd Python compatibility surface by @CoteTommy in #182
- [codex] Extract Reticulum announce cache adapter by @CoteTommy in #183
- [codex] Extract RPC access logging by @CoteTommy in #184
- [codex] fix announce burst collapse by @CoteTommy in #185
- [codex] make sdk event driven async by @CoteTommy in #186
- [codex] bundle async SDK and LXMF parity work by @CoteTommy in #189
- Add announce slot parser and LXMF interop fixtures/tests by @brothercorvo in #192
- [codex] add parallel ZeroMQ SDK transport by @brothercorvo in #199
- [codex] Add Reticulum spec Rust fixtures by @brothercorvo in #198
- Add ZeroMQ announce SDK APIs by @brothercorvo in #200
- Add propagation download support by @CoteTommy in #190
- [codex] Add LXMF resource repro and routed transfer fixes by @brothercorvo in #205
- Improve propagation runtime by @brothercorvo in #195
- [Follow-up] Fix CI warnings in experimental transport runtime changes by @brothercorvo in #201
- Silence dead-code warnings, add link/channel retry helpers, and minor signature cleanup by @brothercorvo in #202
- Add no-alloc LXMF embedded mini crate by @brothercorvo in #188
- [codex] Fix ZMQ token auth enforcement by @brothercorvo in #206
- Keep reticulumd ZeroMQ loop alive on client disconnect by @brothercorvo in #207
- Replace ad-hoc stderr prints with structured logging (log + tracing) by @IgorShishkin12 in #209
- [codex] Scale ZeroMQ SDK delivery pipeline by @brothercorvo in #210
- [codex] Wire delivery options through SDK send paths by @brothercorvo in #212
- Auto-validate
LinkIdentifyinrns-transport, emitLinkEvent::PeerIdentifiedby @IgorShishkin12 in #213 - Document external interop gate ownership by @CoteTommy in #156
- UDP multicast follow-up fixes by @brothercorvo in #157
- Master by @brothercorvo in #215
- Preserve peer-sync parity queue behavior by @brothercorvo in #217
- Bug: ResourceReceiver prematurely killed during active large transfers by @IgorShishkin12 in #218
- ResourceSender propagates packet-build failure to caller by @IgorShishkin12 in #219
- Adaptive fragment request scheduling for active resource transfers by @IgorShishkin12 in #220
- Apply priority weighting to peer sync offers by @brothercorvo in #223
- Merge master into main before retiring master by @brothercorvo in #230
- Reject unvalidated client propagation batches by @brothercorvo in #224
- Examples + maual trigger for CI by @IgorShishkin12 in #228
- Preserve peer heard state for no-transfer sync by @brothercorvo in #227
- Preserve cumulative peer acceptance rate by @brothercorvo in #229
- Mark local peer propagation deliveries handled by @brothercorvo in #225
- [codex] Fix AutoInterface link proof multicast fallback by @brothercorvo in #233
- Reject new peer offer responses by @brothercorvo in #226
- [codex] Consolidate parity status docs by @brothercorvo in #237
- Fix Resource sizing for constrained MTUs by @brothercorvo in #236
- [codex] Clean up stale documentation archive by @brothercorvo in #238
- [codex] Gate full CI behind label by @brothercorvo in #241
- Accept Python peer destination hash records by @brothercorvo in #231
- Add isolated E2E benchmark runner for MSRV separation by @brothercorvo in #240
- Mirror remote retry peer queue snapshots by @brothercorvo in #239
- [codex] Add project and compatibility reference versions by @brothercorvo in #243
- fix(rnode-ble): three-phase BLE startup fix — stabilisation delay, probe/radio split, 5 s timeout by @IgorShishkin12 in #242
- [codex] Enable Android BLE native gates by @brothercorvo in #248
- [codex] Coerce restored Python peer costs by @brothercorvo in #245
- [codex] close C09 unknown handle conformance by @brothercorvo in #247
- [codex] close E01 paper URI ingest conformance by @brothercorvo in #249
- Avoid duplicate peer propagation receive accounting by @brothercorvo in #250
- Replay restored queues before unpeer cleanup by @brothercorvo in #251
- [codex] Prepare v0.3.0 rc1 release by @brothercorvo in #252
- Close peer replication parity gaps by @brothercorvo in #253
- Use canonical propagation ids in remote acks by @brothercorvo in #254
- Wait for propagation download haves acks by @brothercorvo in #255
- Persist local propagation processed IDs by @brothercorvo in #256
- Wait for propagation download haves ack by @brothercorvo in #257
- Add Python propagation node relay interop gate by @brothercorvo in #261
- Throttle deferred propagation offers by @brothercorvo in #260
- Honor retained propagation payloads on haves by @brothercorvo in #267
- Avoid redundant remote propagation downloads by @brothercorvo in #259
- Fallback oversized opportunistic delivery to link by @brothercorvo in #266
- Throttle invalid propagation offers by @brothercorvo in #270
- Validate selected peer sync payload batches by @brothercorvo in #272
- Honor retain-synced propagation haves by @brothercorvo in #262
- Remember stale propagation haves by @brothercorvo in #273
- Preserve held UDP announce source by @brothercorvo in #274
- Back off retryable remote peer sync errors by @brothercorvo in #275
- Clean up denied remote propagation transfers by @brothercorvo in #276
- Show peer propagation status in rnstatus by @brothercorvo in #263
- Fix remote control module-size CI after PR #254 by @brothercorvo in #265
- Enforce propagation storage limit by @brothercorvo in #269
- Show propagation peers in rnstatus by @brothercorvo in #268
- Add propagation remote status interop case by @brothercorvo in #258
- Apply propagation auth policy from lxmd by @brothercorvo in #264
- Preserve no access propagation lifecycle by @brothercorvo in #271
- Cover peer queue snapshots during propagation pruning by @brothercorvo in #278
- Add live propagation offer interop case by @brothercorvo in #279
- Allow peer sync control to find hidden peers by @brothercorvo in #281
- Back off failed remote transfer source peers by @brothercorvo in #277
- Add propagation get haves interop case by @brothercorvo in #280
- Back off source peers on malformed remote imports by @brothercorvo in #284
- Break remote unpeer peering on access denial by @brothercorvo in #282
- Report structured peer sync states by @brothercorvo in #288
- Cover propagated resource receipt tracking by @brothercorvo in #290
- Clear remote unpeer lifecycle after success by @brothercorvo in #286
- Report stored peer on denied remote transfer cleanup by @brothercorvo in #283
- Clear source backoff after remote transfer success by @brothercorvo in #287
- Validate remote download haves acknowledgements by @brothercorvo in #292
- Report remote sync failure kinds by @brothercorvo in #289
- Filter retained haves for completed peers by @brothercorvo in #291
- Surface remote link close signals by @brothercorvo in #293
- Add offer queue interop case by @brothercorvo in #294
- [codex] Add BLE MTU readiness diagnostics by @brothercorvo in #300
- Prioritize propagation storage pruning by @brothercorvo in #299
- Report failed local peer offer state by @brothercorvo in #295
- Constrain haves completion to known work by @brothercorvo in #297
- Surface remote resource terminal events by @brothercorvo in #296
- Reject ignored propagation ingests by @brothercorvo in #298
- Prepare v0.3.0 release metadata by @brothercorvo in #301
- Update README for v0.3.0 release by @brothercorvo in #303
- [codex] Split oversized Rust modules by @brothercorvo in #302
- Refresh remote transfer success attempt time by @brothercorvo in #304
- RNode BLE detection fallback + ATT MTU propagation (RNode & VRN76) by @IgorShishkin12 in #315
- Report active stamp generation progress by @brothercorvo in #305
- Publish failed remote unpeer peer events by @brothercorvo in #306
- Back off failed remote unpeer retries by @brothercorvo in #308
- Publish unavailable remote unpeer peer events by @brothercorvo in #307
- Clear stale stamp retry errors by @brothercorvo in #311
- Make peer sync offer transfers atomic by @brothercorvo in #312
- Advance remote sync bridge retry backoff by @brothercorvo in #313
- [codex] Reject ignored remote propagation imports by @brothercorvo in #316
- [codex] Deduplicate full CI gates by @brothercorvo in #317
- Preserve postponed remote transfer results by @brothercorvo in #310
- Preserve remote sync postponements by @brothercorvo in #309
- Validate full peer sync payload batch by @brothercorvo in #314
- [codex] Add ZeroMQ SDK contact methods by @brothercorvo in #318
- [codex] Expose LXMF basic field constants by @brothercorvo in #319
- [codex] Add ZeroMQ SDK peer identity methods by @brothercorvo in #320
- [codex] Route ZeroMQ SDK batch send envelopes by @brothercorvo in #323
- [codex] Preserve ZeroMQ SDK status retry metadata by @brothercorvo in #329
- [codex] Route ZeroMQ history through SDK envelope by @brothercorvo in #330
- [codex] Add ZeroMQ SDK peer directory by @brothercorvo in #331
- [codex] Add ZeroMQ SDK stale presence filtering by @brothercorvo in #332
- [codex] Preserve direct chat bodies over ZeroMQ SDK by @brothercorvo in #333
- [codex] Integrate ZeroMQ SDK 0.4 release stack by @brothercorvo in #340
- [codex] Prepare LXMF-rs 0.4.0 release notes by @brothercorvo in #341
- [codex] Finalize LXMF-rs 0.4.0 release note ref by @brothercorvo in #342
- [codex] Update 0.4.0 interop artifact baseline by @brothercorvo in #343
- [codex] Update 0.4.0 schema client baseline by @brothercorvo in #344
- [codex] Update interop artifact baseline after schema refresh by @brothercorvo in #345
- [codex] Fix Windows release artifact lookup by @brothercorvo in #346
- [codex] Refresh 0.4.0 SDK public API baseline by @brothercorvo in #347
- [codex] Refresh 0.4.0 fuzz lockfiles by @brothercorvo in #348
New Contributors
- @zippy made their first contribution in #149
- @IgorShishkin12 made their first contribution in #209
Full Changelog: v0.1.3...v0.4.0