Releases: ruvnet/RuView
ESP32-S3 CSI Firmware v0.5.0 — mmWave Sensor Fusion
ESP32-S3 CSI Firmware v0.5.0 — mmWave Sensor Fusion (ADR-063/064)
What's New
60 GHz mmWave Radar Fusion — The firmware now auto-detects mmWave radar modules connected via UART and fuses their data with WiFi CSI for dramatically improved sensing.
Supported mmWave sensors:
| Sensor | Frequency | Capabilities | Cost |
|---|---|---|---|
| Seeed MR60BHA2 | 60 GHz | Heart rate, breathing, presence, distance | ~$15 |
| HLK-LD2410 | 24 GHz | Presence, distance (motion + static) | ~$3 |
Auto-detection: The firmware probes UART1 (GPIO17/18) at boot — first at 115200 baud (MR60BHA2), then 256000 baud (LD2410). If a sensor is found, it registers capabilities and starts a background parsing task. No configuration needed.
48-byte fused vitals packet (magic 0xC5110004): When mmWave is active, vitals are fused using weighted Kalman averaging (mmWave 80% + CSI 20%). Falls back to the standard 32-byte CSI-only packet when no mmWave is detected — fully backward compatible.
Server-side fusion bridge (scripts/mmwave_fusion_bridge.py): For setups where the mmWave runs on a separate ESP32 (e.g., ESP32-C6 with ESPHome), this script reads both serial ports and fuses data in real-time.
Hardware Verified
Dual-sensor live capture (30 seconds, 2026-03-15):
- COM7 (ESP32-S3): WiFi CSI on channel 5, RSSI -41 dBm
- COM4 (ESP32-C6 + MR60BHA2): HR 75 bpm, BR 25/min, person at 52 cm
- Both sensors feeding data concurrently
Also Includes (from v0.4.3.1)
- Fall detection fix: threshold 15.0 rad/s², 3-frame debounce, 5s cooldown (#263)
- Task watchdog fix: vTaskDelay after every frame (#266)
- 4MB flash support (#265)
- All 11 QEMU CI jobs green
Download Guide
| File | Flash | Size |
|---|---|---|
esp32-csi-node.bin |
8MB | 990 KB |
bootloader.bin |
Both | 18 KB |
partition-table.bin |
8MB | 3 KB |
ota_data_initial.bin |
Both | 8 KB |
esp32-csi-node-4mb.bin |
4MB | 773 KB |
partition-table-4mb.bin |
4MB | 3 KB |
Flash — 8MB:
python -m esptool --chip esp32s3 --port COM7 --baud 460800 \
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.binFlash — 4MB:
python -m esptool --chip esp32s3 --port COM7 --baud 460800 \
write_flash --flash_mode dio --flash_size 4MB --flash_freq 80m \
0x0 bootloader.bin 0x8000 partition-table-4mb.bin \
0xF000 ota_data_initial.bin 0x20000 esp32-csi-node-4mb.binProvision:
python firmware/esp32-csi-node/provision.py --port COM7 \
--ssid "YourWiFi" --password "YourPassword" --target-ip 192.168.1.20Full Changelog
See CHANGELOG.md
Closes #269
ESP32-S3 CSI Firmware v0.4.3.1 — Watchdog Fix
ESP32-S3 CSI Firmware v0.4.3.1 — Watchdog Fix
Patch release for v0.4.3 that fixes a task watchdog crash on Core 1 (#266).
What's Fixed
Task watchdog starvation on Core 1 — The edge DSP task (biquad filters, Welford stats, BPM estimation, multi-person vitals) was CPU-intensive enough to starve the IDLE1 task, triggering the watchdog timer every 5 seconds. The firmware kept running but spammed error logs and could cause instability.
Fix: The DSP task now yields to IDLE after every processed frame (vTaskDelay(1)). At 20 Hz CSI rate this adds ~1 ms per frame — negligible for vitals extraction.
Verified on real ESP32-S3: 0 watchdog triggers in 60 seconds of live WiFi CSI (was every 5 seconds before).
Includes all v0.4.3 fixes
- Fall detection threshold 2.0 → 15.0 rad/s² (#263)
- 3-frame debounce + 5s cooldown for fall alerts
- 4MB flash support (#265)
Flash Instructions
Same as v0.4.3 — see v0.4.3 release notes for full instructions.
8MB boards:
python -m esptool --chip esp32s3 --port COM7 --baud 460800 \
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.bin4MB boards:
python -m esptool --chip esp32s3 --port COM7 --baud 460800 \
write_flash --flash_mode dio --flash_size 4MB --flash_freq 80m \
0x0 bootloader.bin 0x8000 partition-table-4mb.bin \
0xF000 ota_data_initial.bin 0x20000 esp32-csi-node-4mb.binESP32-S3 CSI Firmware v0.4.3 — Fall Detection Fix + 4MB Flash
ESP32-S3 CSI Node Firmware v0.4.3 — Fall Detection Fix + 4MB Flash Support
What's Fixed
False fall detection alerts (#263)
The previous firmware (v0.4.2 and earlier) triggered constant "Fall Detected" alerts during normal walking and movement. The threshold was set to 2.0 rad/s², but normal activity produces 2-5 rad/s².
This release fixes the problem by:
- Raising the default threshold from 2.0 to 15.0 rad/s²
- Requiring 3 consecutive frames above threshold before alerting
- Adding a 5-second cooldown between alerts
Verified on real hardware: 0 false alerts in 60s with 1,300+ live WiFi CSI frames. Previous firmware had 7 false alerts in 45s.
Already have v0.4.2? Fix without reflashing:
python provision.py --port COM7 --fall-thresh 15000What's New
4MB flash support (#265)
ESP32-S3 boards with 4MB flash (e.g. SuperMini 4MB) are now officially supported. Thanks to @sebbu for proving feasibility with a community workaround!
Download Guide
| File | Flash Size | Size |
|---|---|---|
esp32-csi-node.bin |
8MB | 978 KB |
bootloader.bin |
Both | 18 KB |
partition-table.bin |
8MB | 3 KB |
ota_data_initial.bin |
Both | 8 KB |
esp32-csi-node-4mb.bin |
4MB | 755 KB |
partition-table-4mb.bin |
4MB | 3 KB |
Flash — 8MB boards (most ESP32-S3):
python -m esptool --chip esp32s3 --port COM7 --baud 460800 \
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.binFlash — 4MB boards (e.g. SuperMini 4MB):
python -m esptool --chip esp32s3 --port COM7 --baud 460800 \
write_flash --flash_mode dio --flash_size 4MB --flash_freq 80m \
0x0 bootloader.bin 0x8000 partition-table-4mb.bin \
0xF000 ota_data_initial.bin 0x20000 esp32-csi-node-4mb.binProvision WiFi:
python firmware/esp32-csi-node/provision.py --port COM7 \
--ssid "YourWiFi" --password "YourPassword" --target-ip 192.168.1.20CI: All 11 QEMU jobs green
v0.4.2-esp32: Channel Override + MAC Filter (ADR-060)
ESP32-S3 CSI Node Firmware v0.4.2 — Channel Override + MAC Filter (ADR-060)
Boot Proof (COM7, 2026-03-13)
I (229) app_init: Project name: esp32-csi-node
I (233) app_init: App version: v0.4.2-esp32-dirty
I (238) app_init: Compile time: Mar 13 2026 08:37:29
I (243) app_init: ELF file SHA256: 6fac16e35...
I (260) efuse_init: Chip rev: v0.2
I (291) spi_flash: detected chip: gd
I (294) spi_flash: flash io: dio
I (370) nvs_config: No NVS config found, using compiled defaults
I (370) main: ESP32-S3 CSI Node (ADR-018) — Node ID: 1
I (390) wifi:wifi firmware version: 48ea317a7
I (530) wifi:mode : sta (3c:0f:02:ec:c2:28)
I (530) main: WiFi STA initialized, connecting to SSID: wifi-densepose
Firmware Binary Hashes (SHA-256)
| File | Size | SHA-256 |
|---|---|---|
esp32-csi-node.bin |
978,064 bytes | 4884001780fff646946003a462498daf6f14b70e4f369d444d9eb0f5dbb68877 |
bootloader.bin |
18,880 bytes | 7fb987037d737a6f87fe955d4fa8ae1f872f1e4f7998a572910ee669989d84fb |
partition-table.bin |
3,072 bytes | 67222c257c0477501fd4002275638dc4262b34eb68235b8289fb1337054d322b |
New Features
Channel Override (--channel)
python provision.py --port COM7 --channel 6Explicitly set CSI channel (1-14 for 2.4GHz, 36-177 for 5GHz). When omitted, firmware auto-detects channel from connected AP using esp_wifi_sta_get_ap_info().
MAC Address Filter (--filter-mac)
python provision.py --port COM7 --filter-mac AA:BB:CC:DD:EE:FFOnly collect CSI from frames matching the specified source MAC. Reduces noise in multi-AP environments.
Combined Example
python provision.py --port COM7 --ssid "MyWiFi" --password "secret" \
--target-ip 192.168.1.20 --channel 6 --filter-mac AA:BB:CC:DD:EE:FFBug Fixes
- Channel mismatch — Auto-detect AP channel after WiFi connect instead of hardcoding (#247)
- MAC filter — Drop non-matching CSI frames before processing (#229)
Capabilities Verified on Hardware
| Capability | Status |
|---|---|
| ESP32-S3 boot (QFN56 rev v0.2) | PASS |
| 8MB GD flash detection | PASS |
| NVS config load (defaults) | PASS |
| WiFi STA init + connect retry | PASS |
| ADR-018 binary frame format | PASS |
| ADR-060 channel/MAC filter fields | PASS |
| CSI collector init | PASS |
| Edge intelligence defaults (tier 2) | PASS |
| TDM defaults (slot 0, count 1) | PASS |
Flash Instructions
python -m esptool --chip esp32s3 --port COM7 --baud 460800 write_flash \
0x0 bootloader.bin \
0x8000 partition-table.bin \
0x20000 esp32-csi-node.binProvisioning All Options
python provision.py --port COM7 \
--ssid "MyWiFi" --password "secret" \
--target-ip 192.168.1.20 --target-port 5005 \
--node-id 1 \
--tdm-slot 0 --tdm-total 3 \
--edge-tier 2 \
--channel 6 \
--filter-mac AA:BB:CC:DD:EE:FFArchitecture
- ADR-060: Channel override and MAC filter design
- NVS keys:
csi_channel(u8),filter_mac(6-byte blob) - Auto-channel:
esp_wifi_sta_get_ap_info()after WiFi connect - MAC filter:
memcmp(info->mac, ...)in CSI callback
Built with ESP-IDF v5.4 | Target: ESP32-S3 | Flash: 8MB (53% free)
ESP32-S3 CSI Firmware v0.4.1 — CSI Build Fix (ADR-057)
ESP32-S3 CSI Firmware v0.4.1
Critical bugfix release — fixes CSI not being enabled in pre-built firmware binaries.
What was broken
The committed sdkconfig had CONFIG_ESP_WIFI_CSI_ENABLED disabled (line 1135), causing all builds to produce firmware that crashed at runtime with:
E (6700) wifi:CSI not enabled in menuconfig!
This affected all pre-built binaries from v0.1.0 through v0.4.0-alpha.
Fixes (ADR-057)
sdkconfig— CSI now enabled (CONFIG_ESP_WIFI_CSI_ENABLED=y)sdkconfig.defaults— Created from template so fresh builds always inherit CSIcsi_collector.c— Added#errorcompile-time guard to prevent this from recurringsdkconfig.defaults.template— Fixed NVS encryption default (was causing build failure)
Verified
- Built with Docker (
espressif/idf:v5.2) - Flashed to ESP32-S3 (QFN56, rev v0.2, 8MB GD flash)
- Boot log confirms CSI initialization without errors
- Binary size: 1,041 KB (49% partition free)
Flashing
python -m esptool --chip esp32s3 --port COM7 --baud 460800 \
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.binProvisioning (after flash)
python firmware/esp32-csi-node/provision.py \
--port COM7 --ssid "YOUR_WIFI" --password "YOUR_PASS" \
--target-ip YOUR_PC_IP --target-port 5005Hardware Support
| Variant | Status |
|---|---|
| ESP32-S3 (all: DevKitC, N16R8, Super Mini, Zero) | Supported |
| ESP32 (original D0WD) | Unsupported (use ADR-018 frame format for interop) |
| ESP32-C3 | Unsupported (RISC-V, needs separate build target) |
| ESP32-C6 | Unsupported (RISC-V, needs separate build target) |
Related Issues
- #241 — Tracking issue for this fix
- #223 — CSI not enabled in menuconfig (root cause)
- #238 — 0.4 firmware not working (original ESP32, unsupported variant)
- #234 — ESP32-C3 support request
- #210 — Flashing issues with Super Mini
- #190 — No data received from ESP32-S3
SHA256 Checksums
See SHA256SUMS.txt attached to this release.
RuView Desktop v0.4.0
RuView Desktop v0.4.0
WiFi-based human pose estimation desktop application.
Downloads
| Platform | Architecture | Download |
|---|---|---|
| macOS | Apple Silicon (M1/M2/M3) | RuView-Desktop-*-macos-arm64.zip |
| macOS | Intel | RuView-Desktop-*-macos-x64.zip |
| Windows | x64 | RuView-Desktop-*.msi or RuView-Desktop-*.exe |
Installation
macOS:
- Download the appropriate
.zipfile for your Mac - Extract the zip file
- Move
RuView Desktop.appto your Applications folder - Right-click and select "Open" (first time only, to bypass Gatekeeper)
Windows:
- Download the
.msiinstaller - Run the installer
- Launch RuView Desktop from the Start menu
Requirements
- macOS 11.0+ (Big Sur or later)
- Windows 10/11 (64-bit)
RuView Desktop v0.4.1
RuView Desktop v0.4.1
WiFi-based human pose estimation desktop application.
Downloads
| Platform | Architecture | Download |
|---|---|---|
| macOS | Apple Silicon (M1/M2/M3) | RuView-Desktop-*-macos-arm64.zip |
| macOS | Intel | RuView-Desktop-*-macos-x64.zip |
| Windows | x64 | RuView-Desktop-*.msi or RuView-Desktop-*.exe |
Installation
macOS:
- Download the appropriate
.zipfile for your Mac - Extract the zip file
- Move
RuView Desktop.appto your Applications folder - Right-click and select "Open" (first time only, to bypass Gatekeeper)
Windows:
- Download the
.msiinstaller - Run the installer
- Launch RuView Desktop from the Start menu
Requirements
- macOS 11.0+ (Big Sur or later)
- Windows 10/11 (64-bit)
Full Changelog: v0.4.0-desktop...desktop-v0.4.1
RuView Desktop v0.4.0
RuView Desktop v0.4.0
WiFi-based human pose estimation desktop application.
Downloads
| Platform | Architecture | Download |
|---|---|---|
| macOS | Apple Silicon (M1/M2/M3) | RuView-Desktop-*-macos-arm64.zip |
| macOS | Intel | RuView-Desktop-*-macos-x64.zip |
| Windows | x64 | RuView-Desktop-*.msi or RuView-Desktop-*.exe |
Installation
macOS:
- Download the appropriate
.zipfile for your Mac - Extract the zip file
- Move
RuView Desktop.appto your Applications folder - Right-click and select "Open" (first time only, to bypass Gatekeeper)
Windows:
- Download the
.msiinstaller - Run the installer
- Launch RuView Desktop from the Start menu
Requirements
- macOS 11.0+ (Big Sur or later)
- Windows 10/11 (64-bit)
Full Changelog: desktop-v0.4.1...desktop-v0.4.0
RuView Training Datasets v1.0.0
Real WiFi CSI datasets for training RuView pose estimation models.
Datasets
| Dataset | Samples | Activities | Size |
|---|---|---|---|
| csi-activity | 24 | brushteeth, cook, getintobed, sleeping, walk, washingdishes | 1 MB |
| csi-vitals | 23 | Heart rate monitoring (66-90 BPM) | 800 KB |
| csi-respiration | 1 | Breathing detection | 44 KB |
Data Source
Converted from Intel CSI Tool .dat files to RuView JSON format.
Format
Each sample is a JSON file with:
csi_features: 5600 values (100 frames × 56 subcarriers)keypoints: 17 COCO pose keypointsactivity: Activity labelmetadata: RSSI, noise, frame count
Usage
Download and extract to ~/.ruview/datasets/
RuView Desktop v0.3.0
RuView Desktop v0.3.0
WiFi-based human pose estimation desktop application.
Downloads
| Platform | Architecture | Download |
|---|---|---|
| macOS | Apple Silicon (M1/M2/M3) | RuView-Desktop-*-macos-arm64.zip |
| macOS | Intel | RuView-Desktop-*-macos-x64.zip |
| Windows | x64 | RuView-Desktop-*.msi or RuView-Desktop-*.exe |
Installation
macOS:
- Download the appropriate
.zipfile for your Mac - Extract the zip file
- Move
RuView Desktop.appto your Applications folder - Right-click and select "Open" (first time only, to bypass Gatekeeper)
Windows:
- Download the
.msiinstaller - Run the installer
- Launch RuView Desktop from the Start menu
Requirements
- macOS 11.0+ (Big Sur or later)
- Windows 10/11 (64-bit)
What's Changed
- feat: complete Tauri desktop frontend with all pages and enhanced design by @ruvnet in #198
- Add temporal graph evolution & RuVector integration research by @ruvnet in #197
Full Changelog: v0.3.0-desktop-alpha...desktop-v0.3.0