ALEC — Adaptive Lazy Evolving Compression
Why ALEC?
In many environments, every bit counts:
- 🛰️ Satellite communications at a few kbps
- 🌿 Battery-powered IoT sensors lasting years
- 🌍 Rural areas with limited satellite connectivity
- 🌊 Underwater acoustic links
- 🏭 Industrial networks with restricted bandwidth
ALEC addresses these challenges with an innovative approach: transmit only what has value.
Features
🦥 Lazy Compression
ALEC doesn't transmit all data — it first sends the decision, then details only if needed.
Without ALEC: [Complete data] ──────────────────────▶ 1000 bytes
With ALEC: [Alert: anomaly detected] ────────────▶ 12 bytes
[Details on demand] ──────────────────▶ 500 bytes (if requested)
🔄 Evolving Context
Encoder and decoder build a shared dictionary that improves over time.
Week 1: "temperature=22.3°C" ──────────────────────▶ 20 bytes
Week 4: [code_7][+0.3] ───────────────────────────▶ 3 bytes
⚖️ Smart Asymmetry
Computational effort is placed where resources exist.
| Mode | Encoder | Decoder | Use Case |
|---|---|---|---|
| Standard | Light | Heavy | IoT sensors, drones |
| Reversed | Heavy | Light | Broadcast distribution |
📊 Priority Classification
Each data point receives a priority that determines its handling:
| Priority | Behavior | Example |
|---|---|---|
| P1 CRITICAL | Immediate send + acknowledgment | Fire alert |
| P2 IMPORTANT | Immediate send | Anomaly detected |
| P3 NORMAL | Standard send | Periodic measurement |
| P4 DEFERRED | On demand only | Detailed history |
| P5 DISPOSABLE | Never sent | Debug logs |
Use Cases
🚜 Connected Agriculture
Field sensors monitor moisture, temperature, and nutrients. With ALEC, they run 10 years on battery by transmitting only alerts and anomalies.
🏥 Rural Telemedicine
A portable ultrasound in a remote area first sends "suspected cardiac anomaly" in 50 bytes. The remote doctor decides if they need the full image.
🚛 Vehicle Fleets
500 trucks report their position. After a few weeks, the system knows the usual routes and only transmits deviations.
🛰️ Space Observation
A satellite photographs Earth. It only sends significant changes compared to previous images.
Ecosystem
ALEC consists of multiple crates:
| Crate | Description | Features |
|---|---|---|
alec |
Core compression codec | Encoder, Decoder, Context |
alec-ffi |
C/C++ bindings | FFI interface, embedded targets |
alec-gateway |
Multi-sensor orchestration | Channel management, Frame aggregation |
alec-gateway[metrics] |
Entropy observability | TC, H_joint, Resilience R |
alec-complexity |
Anomaly detection | Baseline, Z-scores, Events |
Quick Install
# Core codec only
[]
= "1.2"
# C FFI (std)
[]
= "1.2"
# C FFI for embedded (bare-metal, no RTOS)
[]
= { = "1.2", = false, = ["bare-metal"] }
# C FFI for Zephyr RTOS
[]
= { = "1.2", = false, = ["zephyr"] }
Quick Start
Prerequisites
- Rust 1.70+ (encoder and decoder)
- Or: C compiler (embedded encoder only via
alec-ffi)
Installation
First Example
use ;
➡️ Complete getting started guide
Embedded / no_std
ALEC supports embedded targets from version 1.2.0. The alec-ffi crate provides C bindings with three feature tiers:
Feature comparison
| Feature | Allocator | Panic handler | Target |
|---|---|---|---|
std (default) |
System | System | Linux, macOS, Windows |
no_std |
User-provided | User-provided | Any embedded |
bare-metal |
embedded-alloc (8KB heap) |
loop {} |
Bare-metal (no RTOS) |
zephyr |
Zephyr k_malloc/k_free |
loop {} |
Zephyr RTOS |
Bare-metal (no RTOS)
= { = "1.2", = false, = ["bare-metal"] }
Zephyr RTOS
= { = "1.2", = false, = ["zephyr"] }
Note on target selection for Zephyr: Use
thumbv8m.main-none-eabi(noteabihf). Zephyr's nRF91 toolchain compiles innofpmode — using thehfvariant causes an ABI mismatch at link time.
CMakeLists.txt integration (Zephyr)
add_library(alec_ffi STATIC IMPORTED GLOBAL)
set_target_properties(alec_ffi PROPERTIES
IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/libalec_ffi.a
)
target_include_directories(alec_ffi INTERFACE
${CMAKE_CURRENT_SOURCE_DIR}/include
)
# Do NOT use --whole-archive — causes premature static initialisation before Zephyr heap is ready
Add a critical_section.c to your Zephyr app:
static unsigned int cs_irq_key;
void
void
Validated embedded platforms
| Platform | SoC | Feature | Status |
|---|---|---|---|
| Nordic nRF9151 SMA-DK | Cortex-M33 | zephyr |
✅ Validated |
| Generic Cortex-M33 | thumbv8m | bare-metal |
✅ Builds |
Documentation
Core Documentation
| Document | Description |
|---|---|
| Architecture | System design and ADRs |
| Getting Started | Getting started guide |
| Protocol Reference | Protocol specification |
| Security | Security considerations |
| FAQ | Frequently asked questions |
Module Documentation
| Document | Description |
|---|---|
| Gateway Guide | Multi-sensor orchestration |
| Metrics Guide | Entropy and resilience computation |
| Complexity Guide | Baseline learning and anomaly detection |
| Configuration | Complete configuration reference |
| Integration | Integration patterns |
Performance
Results on reference dataset (temperature sensor, 24h, 1 measurement/min):
| Metric | Without context | After warm-up | Target |
|---|---|---|---|
| Compression ratio | 0.65 | 0.08 | < 0.10 ✅ |
| P1 Latency | 45ms | 42ms | < 100ms ✅ |
| Encoder RAM | 12KB | 28KB | < 64KB ✅ |
Roadmap
- v1.0 — Production ready ✅
- v1.2.0 — no_std support ✅
- v1.2.1 — bare-metal embedded (Cortex-M) ✅
- v1.2.3 — Zephyr RTOS support ✅
- v1.3 — RIOT OS support
- v1.4 — FreeRTOS support
Contributing
Contributions are welcome! See:
- CONTRIBUTING.md — Contribution guide
- prompts/ — Templates for features, bugfixes, etc.
- examples/ — Example workflows
License
ALEC is dual-licensed:
Open Source (AGPL-3.0)
Free for open source projects, research, and personal use.
[]
= "1.2"
Commercial License
For proprietary use without open-source obligations. Starting at $500/year for startups.
See LICENSE for details.
Acknowledgments
ALEC draws inspiration from:
- NASA error-correcting codes (turbo codes, LDPC)
- Dictionary compression (LZ77, LZ78)
- Efficient IoT protocols (CoAP, MQTT-SN)