Low-bandwidth NUM8 update propagation in C, built for small delta streams and unreliable links.
NUM8-LUP is a compact C project for propagating small NUM8 dataset changes over LoRa-style or similarly constrained transports. The repository exposes both a legacy batch-compatible library and a newer async sender/receiver split protocol for deployments that need cleaner per-receiver progress tracking.
The project currently ships two protocol lines:
- Legacy batch API for compatibility with the original update flow.
- Async split API for single-operation delivery, retransmissions, and receiver catch-up.
For new deployments, the async split model is the recommended default.
.
|-- include/ public headers
|-- src/ library implementations
|-- tests/ verification targets
|-- examples/ sample usage
|-- docs/ protocol and publishing references
|-- wiki/ prepared GitHub wiki pages
|-- CMakeLists.txt
`-- README.md
This layout keeps the public API, implementation, tests, and documentation clearly separated.
Main headers:
include/num8lora.hinclude/num8lora_op.hinclude/num8lora_sender.hinclude/num8lora_receiver.h
Release outputs:
num8lora.dllnum8lora_sender.dllnum8lora_receiver.dll
The legacy library is declared in include/num8lora.h and implemented in:
src/num8lora.csrc/num8lora_runtime.csrc/num8lora_meta.csrc/num8lora_num8_bridge.c
It provides:
- low-level frame encoding and decoding helpers
- sender and receiver runtime state machines
- receiver metadata persistence
- optional NUM8 bridge integration
The async split model is declared in:
include/num8lora_op.hinclude/num8lora_sender.hinclude/num8lora_receiver.h
Implementation mapping:
src/num8lora_op.chandles frame encoding, decoding, and CRC validationsrc/num8lora_sender.cmanages the sender queue, per-receiver state, and retransmissionssrc/num8lora_receiver.chandles beacon processing, operation apply flow, and ACK/NACK generation
The async sender/receiver flow is designed for small, infrequent changes where delivery reliability matters more than throughput.
Sender side:
- tracks each receiver independently
- stores
ADDandREMOVEoperations in a monotonic log - emits
BEACONframes and schedulesDATAretransmissions - consumes inbound
REQUEST,ACK, andNACKframes
Receiver side:
- requests only the next missing operation
- applies one operation per
DATAframe - persists metadata across restarts
- can apply changes into a NUM8 engine through a callback helper
Protocol messages:
BEACONREQUESTDATAACKNACK
Each DATA frame carries exactly one operation with a value in the range 0..99999999.
cmake -S . -B build
cmake --build build --config Release
ctest --test-dir build -C Release --output-on-failureOn Linux with a standard GCC or Clang toolchain:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
ctest --test-dir build --output-on-failure
cmake --install build --prefix /usr/localNote:
- Linux packaging has been prepared in CMake through
install()rules. - A native Linux binary build was not verified in this Windows session because no Linux toolchain was available here.
The repository includes an end-to-end async example:
- source:
examples/async_demo.c - target:
num8lora_async_demo
Core test targets:
num8lora_testnum8lora_runtime_testnum8lora_op_testnum8lora_async_test
Additional NUM8-dependent tests:
tests/num8lora_num8_test.ctests/num8lora_flow_num8_test.c
Optional NUM8 targets are enabled only when ../NUM8-DENSE is available during CMake configure.
Primary docs:
docs/QUICKSTART.mddocs/SENDER_API.mddocs/RECEIVER_API.mddocs/WIRE_FORMAT.mddocs/DEPLOYMENT_CHECKLIST.md
Long-form technical reference:
docs/ASYNC_SPLIT_API.mddocs/LEGACY_DLL_API.mddocs/SPECIFICATION.md
GitHub publishing assets:
docs/GITHUB_METADATA.mddocs/PUBLISHING_CHECKLIST.mdwiki/
Release packaging:
- Windows binary bundle:
artifacts/release/num8-lup-v1.0.0-win64.zip - Linux source bundle:
artifacts/release/num8-lup-v1.0.0-linux-src.tar.gz
- The project uses C99 and CMake.
- Shared libraries are configured with
WINDOWS_EXPORT_ALL_SYMBOLS ON.
MIT — see LICENSE.