CN
CYBERNET
esp32-csi-node control surface
Not connected
Pick a device on the Connect tab

Browser support

Device

Connects over USB — a real ESP32-S3 board (CP2102, CH340, or native USB) via a data-capable cable, OTG adapter if you're on Android. The browser shows its own permission popup; nothing here talks to the device until you approve it there.

Read from device (no guessing)

Reads the board's real partition table and current NVS config instead of trusting hardcoded offsets — this is also how an offset bug between RuView firmware releases got caught while building this.

no data yet

Saved nodes

Local to this browser — a quick way to keep track of a mesh of nodes (IP / node ID) across Provision, Modules, OTA, and Dashboard.

What's real here

Every tab talks to your physical board or its own network interfaces — USB serial, the node's on-device HTTP server, or the sensing-server you run — nothing simulated. See the README's "Scope" section for the parts of the wider RuView project (cloud services, ML training, a separate desktop app) that are different software entirely and out of reach of any browser tab.

Board / flash map

Two 4MB layouts existed across RuView firmware releases — use "Read from device → Partition table" on Connect if you're unsure which one a board already has.

Fetch firmware from GitHub

Pulls real release binaries directly from github.com/ruvnet/RuView/releases — no manual downloads. Falls back to the file pickers below for anything it can't match.

Firmware images (manual — used for any slot GitHub fetch didn't fill)

OTA update (WiFi, not USB)

Real endpoints on the node's :8032 server: GET /ota/status, POST /ota with a Bearer token. Fail-closed by firmware design — rejects everything until ota_psk is provisioned (Provision tab → Security).

no data yet

WiFi + node config (NVS)

Writes directly to the device's NVS partition — csi_cfg namespace for sensing/mesh config, security for the OTA PSK — the same mechanism as the official provision.py. Full-replace semantics: every write replaces both namespaces wholesale; blank fields fall back to firmware defaults rather than keeping old values.

⚠️ Independent code review found this is compile-time optional and can be overridden at runtime — leave it checked unless you specifically need it off.

WASM edge modules

Talks to the node's own HTTP server on :8032 over WiFi (not USB) — the same interface RuView Desktop uses. Requires the node already provisioned and joined to your network, and your phone/laptop on that same network.

no data yet

Upload module (.rvf)

Modules are signed RVF containers (Ed25519), not raw .wasm — build with the wasm-edge crate, see repo docs/adr/ADR-040.

Not wired up — and why

RuView Desktop's docs describe start/stop/unload and CPU/memory monitoring for loaded modules, but don't publish exact HTTP paths for those anywhere in the public firmware docs — only /wasm/upload and /wasm/list are confirmed. Guessing endpoint names on a device that controls physical sensing hardware isn't a risk worth taking; this section stays honest about the gap instead.

Boot status

WiFi: — Streaming: — Node: — Firmware: — OTA: — WASM: —

Serial console — 115200 baud

Live sensing feed

Connects to RuView's wifi-densepose-sensing-server on your LAN (WebSocket) — run it with cargo run -p wifi-densepose-sensing-server -- --source esp32 --http-port 3000 or the Docker image, then point this at it.

Idle

Vitals

⚠️ Not a certified medical/safety device — RuView's own docs note fall/vitals detection needs more independent verification. Don't rely on this as a sole safety monitor.

Presence
bpm
Heart rate
/min
Breathing
Node

Raw feed

waiting for data…