RuView
Applicationruvnet/RuView
Turn WiFi signals into spatial intelligence and vital sign monitoring without cameras.
Overview
RuView captures WiFi Channel State Information (CSI) from ESP32 sensors to detect presence, breathing, heart rate, and even pose estimation through walls. It runs entirely on edge hardware with no cloud or internet required.
README Preview
# π RuView\n\n\n \n \n \n\n\n> **Beta Software** — Under active development. APIs and firmware may change. Known limitations:\n> - ESP32-C3 and original ESP32 are not supported (single-core, insufficient for CSI DSP)\n> - Single ESP32 deployments have limited spatial resolution — use 2+ nodes or add a [Cognitum Seed](https://cognitum.one) for best results\n> - Camera-free pose accuracy is limited (PCK@20 ≈ 2.5% with proxy labels) — [camera ground-truth training](docs/adr/ADR-079-camera-ground-truth-training.md) targets **35%+ PCK@20**; the pipeline is implemented, but the data-collection and evaluation phases (ADR-079 P7–P9) are still pending, so no measured camera-supervised PCK@20 has been published yet\n>\n> Contributions and bug reports welcome at [Issues](https://github.com/ruvnet/RuView/issues).\n\n## **See through walls with WiFi** ##\n\n**Turn ordinary WiFi into a spatial intelligence / sensing system.** Detect people, measure breathing and heart rate, track movement, and monitor rooms — through walls, in the dark, with no cameras or wearables. Just physics.\n\n### π RuView is a WiFi sensing platform that turns radio signals into spatial intelligence.\n\nEvery WiFi router already fills your space with radio waves. When people move, breathe, or even sit still, they disturb those waves in measurable ways. RuView captures these disturbances using Channel State Information (CSI) from low-cost ESP32 sensors and turns them into actionable data: who's there, what they're doing, and whether they're okay.\n\n**What it senses:**\n- **Presence and occupancy** — detect people through walls, count them, track entries and exits\n- **Vital signs** — breathing rate and heart rate, contactless, while sleeping or sitting\n- **Activity recognition** — walking, sitting, gestures, falls — from temporal CSI patterns\n- **Environment mapping** — RF fingerprinting identifies rooms, detects moved furniture, spots new objects\n- **Sleep quality** — overnight monitoring with slee
FAQ (5)
TroubleshootingIs WiFi CSI human sensing a hoax? Why doesn't it work on my laptop?
It is not a hoax; it is well-established technology. The most common issue is using unsupported hardware. Only specific chipsets expose Channel State Information (CSI). Most consumer WiFi adapters, including built-in laptop WiFi, do not support CSI. Use compatible hardware: ESP32-S3 (cheapest, easiest), Intel 5300 NIC with modified firmware, or Atheros AR9580 with ath9k patches. For ESP32-S3, flash the firmware from firmware/esp32-csi-node/ and follow the step-by-step tutorial (see issue #34). Walk near the antenna and observe amplitude changes in the aggregator. If you still have issues after using supported hardware, provide serial output and aggregator logs in a new issue.
TroubleshootingWhy do I get 'denied' error when pulling Docker image ghcr.io/ruvnet/ruview?
The correct image name is ghcr.io/ruvnet/wifi-densepose:latest, not ghcr.io/ruvnet/ruview. The repository owner named the container wifi-densepose. Use the correct name: docker pull ghcr.io/ruvnet/wifi-densepose:latest from GitHub Container Registry, or docker pull ruvnet/wifi-densepose:latest from Docker Hub. Both amd64 and arm64 architectures are available and publicly accessible.
TroubleshootingHow to fix 404 error when opening visualization page in sensing-server?
The server serves static files from the UI directory (default: ../../ui relative to the binary). If you get a 404, the path is likely incorrect. Check that the ui folder exists and is accessible from the server's working directory. You can override it with the --ui-path flag, e.g., --ui-path ./ui or an absolute path. Restart the server and confirm the log shows the correct UI path.
TroubleshootingWhy does my ESP32 CSI node show state=8 and yield=0pps, and why is no UDP data reaching the sensing server?
The pre-built release binaries restrict CSI collection to Wi-Fi management frames (beacons, probes) only. This starves the CSI callback rate (often every ~18 seconds), preventing the aggregator from reaching the minimum frame rate needed to advance past state 8 and produce a yield. Consequently, no CSI frames are sent over UDP, and the dashboard remains OFFLINE. Workaround: Build the firmware from source with the DATA promiscuous filter enabled (modify sdkconfig or source) to capture all data frames. Permanent fix: Merged in #906 (display-less boards now capture data frames) and refreshed binaries published in #908. Use the latest release binaries or build from the main branch.
TroubleshootingWhy are CSI callbacks extremely sparse (only 3 in 70 seconds) when using ESP32-S3 promiscuous mode set to MGMT-only under heavy WiFi data traffic?
MGMT-only promiscuous mode captures only management frames (beacons, probes, etc.), not data frames. Heavy traffic like YouTube 4K + iperf consists of data frames, so CSI callbacks will only trigger on occasional management frames. To get frequent CSI from data traffic, configure the sniffer to capture DATA frames as well (e.g., enable both MGMT and DATA, or set filter to capture all frames).