yggvault ratatoskr-space connected via regular web
Color theme
also available via yggdrasil mesh http://[203:b338:2a84:a18f:986:47ae:1a4:d8d3]/pkg/ruview/v0.6.1-esp32
vault / ruview / v0.6.1-esp32

ruview @ v0.6.1-esp32

integrity

size
41.3 MiB
downloaded
last checked
source https://github.com/ruvnet/RuView · available · github

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:

  1. csi_collector_init() captures g_nvs_config.node_id into static uint8_t s_node_id once at init
  2. csi_serialize_frame() writes buf[4] = s_node_id — bypasses the global entirely
  3. All other consumers (edge_processing.c, wasm_runtime.c, display_ui.c, swarm_bridge_init) use the new csi_collector_get_node_id() accessor
  4. Clobber canary logs WARN if g_nvs_config.node_id diverges 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",
← v0.6.2-esp32v0.7.0 →