ruview @ v0.6.1-esp32
integrity
- size
- 41.3 MiB
- downloaded
- last checked
release notes
ESP32-S3 CSI Firmware v0.6.1
Critical fix: node_id clobber on multi-node deployments
Closes #232, #375, #385, #386, #390.
Users on multi-node deployments reported that every ESP32 node transmitted node_id=1 in UDP frames, despite NVS provisioning showing the correct value. This made multi-node setups indistinguishable downstream.
What changed
Defense-in-depth fix — the firmware now captures node_id into a module-local static at init time, isolating the UDP frame header from any memory corruption of g_nvs_config:
csi_collector_init()capturesg_nvs_config.node_idintostatic uint8_t s_node_idonce at initcsi_serialize_frame()writesbuf[4] = s_node_id— bypasses the global entirely- All other consumers (
edge_processing.c,wasm_runtime.c,display_ui.c,swarm_bridge_init) use the newcsi_collector_get_node_id()accessor - Clobber canary logs
WARNifg_nvs_config.node_iddiverges from the captured value at init — helps isolate the upstream corruption path
Hardware validation (ESP32-S3 on COM8)
| Check | Result |
|---|---|
NVS node_id |
2 (provisioned) |
Boot log main: |
Node ID: 2 |
| Defensive capture log | Captured node_id=2 at init |
csi_collector init log |
node_id=2, channel=5 |
| UDP packets (15/15) | byte[4] = 2 |
| Clobber canary | Quiet (no WARN) |
| App version | 0.6.1 |
| Binary size | 865 KB (54% flash free) |
Binaries
| File | Flash size | Description |
|---|---|---|
esp32-csi-node.bin |
8MB | Main firmware |
bootloader.bin |
8MB | Bootloader |
partition-table.bin |
8MB | Partition table (dual OTA) |
ota_data_initial.bin |
8MB | OTA data |
esp32-csi-node-4mb.bin |
4MB | Main firmware (SuperMini) |
partition-table-4mb.bin |
4MB | Partition table (SuperMini) |
Flash command
python -m esptool --chip esp32s3 -p COM8 -b 460800 \
--before default_reset --after hard_reset \
write_flash --flash_mode dio --flash_size 8MB --flash_freq 80m \
0x0 bootloader.bin \
0x8000 partition-table.bin \
0xf000 ota_data_initial.bin \
0x20000 esp32-csi-node.bin
For 4MB SuperMini boards, use esp32-csi-node-4mb.bin and partition-table-4mb.bin with --flash_size 4MB.
SHA-256 hashes
7f943b26...88197f7 bootloader.bin
9e650bf1...54bd43 esp32-csi-node.bin
15c263f6...02b32 esp32-csi-node-4mb.bin
7d2c7ac4...82c62f ota_data_initial.bin
4c2cc4ff...d81f0 partition-table.bin
4c2cc4ff...d81f0 partition-table-4mb.bin
Who should upgrade
All users running multi-node ESP32-S3 deployments. Single-node users are unaffected but the upgrade is safe.
download
unix · zip
curl -fL -o v0.6.1-esp32.zip https://ratatoskr.space/pkg/ruview/v0.6.1-esp32.zip
printf '%s %s\n' '6beede858b9bceeea14d7f11e9aa5bad3b397fc928b4ca40cbf913f3c66f283b' 'v0.6.1-esp32.zip' | sha256sum -c -
windows · zip
$url = "https://ratatoskr.space/pkg/ruview/v0.6.1-esp32.zip"
$out = "v0.6.1-esp32.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "6beede858b9bceeea14d7f11e9aa5bad3b397fc928b4ca40cbf913f3c66f283b") { throw "sha256 mismatch" }
unix · tar.gz
curl -fL -o v0.6.1-esp32.tar.gz https://ratatoskr.space/pkg/ruview/v0.6.1-esp32.tar.gz
printf '%s %s\n' 'f8bd0bc129c36980698d2bd573ab68b54069e799681d999bdc6f20fb14e22b06' 'v0.6.1-esp32.tar.gz' | sha256sum -c -
windows · tar.gz
$url = "https://ratatoskr.space/pkg/ruview/v0.6.1-esp32.tar.gz"
$out = "v0.6.1-esp32.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "f8bd0bc129c36980698d2bd573ab68b54069e799681d999bdc6f20fb14e22b06") { throw "sha256 mismatch" }
download via yggdrasil mesh
unix · zip
curl -fL -o v0.6.1-esp32.zip http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.6.1-esp32.zip
printf '%s %s\n' '6beede858b9bceeea14d7f11e9aa5bad3b397fc928b4ca40cbf913f3c66f283b' 'v0.6.1-esp32.zip' | sha256sum -c -
windows · zip
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.6.1-esp32.zip"
$out = "v0.6.1-esp32.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "6beede858b9bceeea14d7f11e9aa5bad3b397fc928b4ca40cbf913f3c66f283b") { throw "sha256 mismatch" }
unix · tar.gz
curl -fL -o v0.6.1-esp32.tar.gz http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.6.1-esp32.tar.gz
printf '%s %s\n' 'f8bd0bc129c36980698d2bd573ab68b54069e799681d999bdc6f20fb14e22b06' 'v0.6.1-esp32.tar.gz' | sha256sum -c -
windows · tar.gz
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.6.1-esp32.tar.gz"
$out = "v0.6.1-esp32.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "f8bd0bc129c36980698d2bd573ab68b54069e799681d999bdc6f20fb14e22b06") { throw "sha256 mismatch" }
| artifact | format | size | hashes |
|---|---|---|---|
| v0.6.1-esp32.zip | zip | 41.1 MiB |
blake3-24 8cfdaf67a5fcc5bffaab80b5f3cbe6084eab287bfe4732c5
sha256 6beede858b9bceeea14d7f11e9aa5bad3b397fc928b4ca40cbf913f3c66f283b
sha1 1af98666d8b963fc6976901b73212fe5a3ee1d24
|
| v0.6.1-esp32.tar.gz | tar.gz | 39.9 MiB |
blake3-24 80b6f8a40e0191c54f3aff3e3738e99343fe9cd4f197c9cc
sha256 f8bd0bc129c36980698d2bd573ab68b54069e799681d999bdc6f20fb14e22b06
sha1 109e1b5178627c4ffd6672017a7cdd0227365296
|
install
bazel
http_archive(
name = "ruview",
urls = ["https://ratatoskr.space/pkg/ruview/v0.6.1-esp32.tar.gz"],
integrity = "sha256-+L0LwSnDaYBpjSvVc6totUBp55loHZmb3G8g+xTiKwY=",
strip_prefix = "ruview-v0.6.1-esp32",
)
zig
.url = "https://ratatoskr.space/pkg/ruview/v0.6.1-esp32.tar.gz",
install via yggdrasil mesh
bazel
http_archive(
name = "ruview",
urls = ["http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.6.1-esp32.tar.gz"],
integrity = "sha256-+L0LwSnDaYBpjSvVc6totUBp55loHZmb3G8g+xTiKwY=",
strip_prefix = "ruview-v0.6.1-esp32",
)
zig
.url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.6.1-esp32.tar.gz",