ruview @ v0.7.0-esp32
integrity
- size
- 59.4 MiB
- downloaded
- last checked
release notes
ESP32 CSI Node firmware v0.7.0
Tag: v0.7.0-esp32
Date: 2026-05-23
Branch: adr-110-esp32c6 (PR #764)
Status: ADR-110 firmware-side substrate closed
Why a major bump
This release marks the end of the firmware-side ADR-110 push. Everything the firmware can deliver toward §B's multistatic alignment story without hardware-blocked dependencies is shipped, measured, and witnessed:
- §A0.7 / §A0.8 / §A0.10: ESP-NOW cross-board mesh proven and quantified (99.43–99.56 % match, 104.1 µs smoothed offset stdev, 1.4 ppm crystal-skew tracking, ≤100 µs alignment target empirically met).
- §A0.12: 32-byte UDP sync packet (magic
0xC511A110) emits alongside CSI frames so downstream multistatic fusion can pair(node_id, sequence)to recover mesh time per frame. - §A0.13 (new in v0.7.0): ADR-018 byte 19 bit 4 ("cross-node sync valid")
now sourced from
c6_sync_espnow_is_valid()too, not just the IDF-v5.4-broken 802.15.4 path. Mixed S3+C6 fleets correctly advertise sync via the working transport.
What remains is outside the firmware:
- Host-side parser (sketched as
archive/v1/src/hardware/csi_extractor.py:SyncPacketParser) - Multistatic CSI fusion in
wifi-densepose-signal - 11ax-cooperative AP (or future IDF that exposes AP-side HE config)
- INA226 / Joulescope for the ≤5 µA LP-core measurement
What's new vs v0.6.9
- Bit-4 sync-valid wire fix (
csi_collector.c:221): bit 4 is set when eitherc6_timesync_is_valid()orc6_sync_espnow_is_valid()returns true. Pre-v0.7.0 frames from sync'd ESP-NOW nodes falsely advertised "no sync" because the 802.15.4 path is broken and was the only flag source. - Python host-side stub (
archive/v1/src/hardware/csi_extractor.py):SyncPacketParser+SyncPacketdataclass ready for the sensing-server to wire in. - Doc:
ESP32BinaryParserdocstring now mentions the sibling sync packet- the v0.7.0 bit-4 broadening.
Build artifacts
| Target | Binary | Size | Partition slack |
|---|---|---|---|
esp32s3 (8 MB) |
esp32-csi-node-s3-8mb.bin |
1094 KB | 47 % |
esp32c6 (4 MB) |
esp32-csi-node-c6-4mb.bin |
1019 KB | 45 % |
SHA-256 sums in SHA256SUMS.txt. Backwards-compatible at the wire level
with v0.6.6 / v0.6.7 / v0.6.8 / v0.6.9. Mixed-version fleets keep working;
only nodes flashed with v0.7.0+ get the bit-4 fix.
Total scope of the loop sprint (iter 1 → iter 12)
10 firmware features shipped, 13 witness entries (§A0.1 → §A0.13), 3 GitHub releases (v0.6.7 / v0.6.8 / v0.6.9 / this v0.7.0), 11 commits on the branch. The firmware now ships a complete, measured, and quantitatively documented two-node mesh substrate for multistatic CSI fusion.
download
curl -fL -o v0.7.0-esp32.zip https://ratatoskr.space/pkg/ruview/v0.7.0-esp32.zip
printf '%s %s\n' 'e804906e987368abb671b56fe65187433c431ac8b9b8a853eadcca971fca1e8d' 'v0.7.0-esp32.zip' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v0.7.0-esp32.zip"
$out = "v0.7.0-esp32.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "e804906e987368abb671b56fe65187433c431ac8b9b8a853eadcca971fca1e8d") { throw "sha256 mismatch" }
curl -fL -o v0.7.0-esp32.tar.gz https://ratatoskr.space/pkg/ruview/v0.7.0-esp32.tar.gz
printf '%s %s\n' '1d5a658d963cefd11c5af129dcb543b8ebaf1912d40d7736a7c1ac5bde62a9bb' 'v0.7.0-esp32.tar.gz' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v0.7.0-esp32.tar.gz"
$out = "v0.7.0-esp32.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "1d5a658d963cefd11c5af129dcb543b8ebaf1912d40d7736a7c1ac5bde62a9bb") { throw "sha256 mismatch" }
download via yggdrasil mesh
curl -fL -o v0.7.0-esp32.zip http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.7.0-esp32.zip
printf '%s %s\n' 'e804906e987368abb671b56fe65187433c431ac8b9b8a853eadcca971fca1e8d' 'v0.7.0-esp32.zip' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.7.0-esp32.zip"
$out = "v0.7.0-esp32.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "e804906e987368abb671b56fe65187433c431ac8b9b8a853eadcca971fca1e8d") { throw "sha256 mismatch" }
curl -fL -o v0.7.0-esp32.tar.gz http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.7.0-esp32.tar.gz
printf '%s %s\n' '1d5a658d963cefd11c5af129dcb543b8ebaf1912d40d7736a7c1ac5bde62a9bb' 'v0.7.0-esp32.tar.gz' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.7.0-esp32.tar.gz"
$out = "v0.7.0-esp32.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "1d5a658d963cefd11c5af129dcb543b8ebaf1912d40d7736a7c1ac5bde62a9bb") { throw "sha256 mismatch" }
| artifact | format | size | hashes |
|---|---|---|---|
| v0.7.0-esp32.zip | zip | 59.4 MiB |
blake3-24 6812760a3dcc9f03f2336c7a13843ad2b2c5cdd28e3628ef
sha256 e804906e987368abb671b56fe65187433c431ac8b9b8a853eadcca971fca1e8d
sha1 84fe12148c2b0b1afdf4549308b9d0f82099c445
|
| v0.7.0-esp32.tar.gz | tar.gz | 57.9 MiB |
blake3-24 613423519fd5d7c58b90eeed23c701a3388f592969e047d4
sha256 1d5a658d963cefd11c5af129dcb543b8ebaf1912d40d7736a7c1ac5bde62a9bb
sha1 9758c1974bed8f1f61cc733a03ce554e12dd9e1e
|
install
http_archive(
name = "ruview",
urls = ["https://ratatoskr.space/pkg/ruview/v0.7.0-esp32.tar.gz"],
integrity = "sha256-HVpljZY879EcWvEp3LVDuOuvGRLUDXc2p8GsW95iqbs=",
strip_prefix = "ruview-v0.7.0-esp32",
)
.url = "https://ratatoskr.space/pkg/ruview/v0.7.0-esp32.tar.gz",
install via yggdrasil mesh
http_archive(
name = "ruview",
urls = ["http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.7.0-esp32.tar.gz"],
integrity = "sha256-HVpljZY879EcWvEp3LVDuOuvGRLUDXc2p8GsW95iqbs=",
strip_prefix = "ruview-v0.7.0-esp32",
)
.url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.7.0-esp32.tar.gz",