# RuView

> Turn ordinary WiFi into a camera-free sensor for presence, pose and vital signs

- Category: Robotics & Embodied AI / Physical Sensing & Perception
- Language: Rust
- Licence: MIT
- Repository: https://github.com/ruvnet/RuView
- Website: https://cognitum.one/ruview
- Canonical page: https://ai-tldr.dev/tools/ruview/
- Updated: 2026-04-16

## In short

RuView is an open-source WiFi-sensing platform. Every WiFi radio already floods a room with radio waves, and people disturb those waves as they move, sit and breathe. It sits in the Physical Sensing & Perception category of the Robotics & Embodied AI tools and is open-source, written in Rust and licensed MIT.

## Overview

RuView is an open-source WiFi-sensing platform. Every WiFi radio already floods a room with radio waves, and people disturb those waves as they move, sit and breathe. RuView captures those disturbances as Channel State Information (CSI) from low-cost ESP32 sensors and turns them into presence and occupancy, motion and activity, fall events, breathing and heart rate, and 17-keypoint body pose — with no camera and no wearable.

The stack is written in Rust and runs on the edge: an ESP32-S3 or ESP32-C6 node streams CSI, a bridge processes it, and small models do the inference locally. The contrastive CSI encoder is published on Hugging Face and its 4-bit variant fits in 8 KB, so it runs in microseconds on a Raspberry Pi. A Docker image with simulated data lets you evaluate the whole pipeline before buying any hardware, and Python bindings ship as a compiled PyO3 wheel on PyPI.

RuView is unusually explicit about which of its numbers are load-bearing. The README documents that the earlier "100% presence" claim was measured on a single-class recording and has been retracted in favour of a label-free held-out temporal-triplet accuracy of 82.3% for the v2 encoder, and it separates the published MM-Fi pose benchmark from the first-cut on-device pose model committed to the repo. On the integration side it speaks Home Assistant over MQTT, exposes an Apple HomeKit (HAP) bridge and a Matter endpoint, and publishes 21 entities per node covering raw signals and inferred states such as bed-exit, bathroom-occupied and no-movement.

## What it does

- Camera-free sensing from WiFi CSI: presence and occupancy, motion and activity, fall detection and multi-person counting
- Contactless vital signs — breathing rate from a 0.1–0.5 Hz phase band, heart rate from a 0.8–2.0 Hz band
- 17-keypoint pose estimation from CSI, with a published MM-Fi benchmark model and a camera-supervised fine-tuning pipeline
- Runs on the edge on $9-class ESP32-S3 / ESP32-C6 nodes, with multi-frequency mesh scanning across six WiFi channels
- Home Assistant (MQTT), Apple Home (HAP bridge), Google Home, Alexa and Matter integrations, plus starter HA blueprints
- Pretrained CSI encoder on Hugging Face, 128-dimensional and quantisable to 8 KB, with an on-device retraining path

## Getting started

The Docker image runs the full system on simulated data with no hardware, which is the fastest way to see what the pipeline produces. Live sensing needs a CSI-capable radio — a consumer laptop only gives RSSI-level presence.

1. Evaluate with simulated data

   Pull the multi-arch image and open the dashboard on port 3000. No sensor required.

```bash
docker pull ruvnet/wifi-densepose:latest
docker run -p 3000:3000 ruvnet/wifi-densepose:latest
# Open http://localhost:3000
```

2. Flash an ESP32-S3 CSI node

   Write the csi-node firmware, then provision it with your WiFi credentials and the IP of the machine that will receive the stream.

```bash
python -m esptool --chip esp32s3 --port COM9 --baud 460800 \
  write_flash 0x0 bootloader.bin 0x8000 partition-table.bin \
  0xf000 ota_data_initial.bin 0x20000 esp32-csi-node.bin
python firmware/esp32-csi-node/provision.py --port COM9 \
  --ssid "YourWiFi" --password "secret" --target-ip 192.168.1.20
```

3. Or build for an ESP32-C6

   The same firmware compiles for the C6 target and picks up its overlay automatically, adding WiFi 6 subcarrier tagging and an 802.15.4 mesh time-sync.

```bash
cd firmware/esp32-csi-node
idf.py set-target esp32c6 && idf.py build
idf.py -p COM6 flash
```

4. Use it from Python

   Both PyPI names ship the same compiled abi3 wheel. The `[client]` extra adds the asyncio WebSocket and MQTT clients.

```python
pip install "ruview[client]"

from ruview import BreathingExtractor, HeartRateExtractor
from ruview.client import SensingClient, RuViewMqttClient
```

5. Publish into Home Assistant

   One `--mqtt` flag turns the node into a Home Assistant discovery publisher; pairing as a Matter bridge exposes it to Apple Home, Google Home, Alexa and SmartThings instead. See docs/integrations/home-assistant.md in the repo.

## When to use it

- Add room-level presence and occupancy to a smart home without putting a camera in the room
- Monitor breathing, heart rate and bed-exit events for elderly-care or sleep applications, contactlessly and overnight
- Detect falls and long periods of no movement, and surface them as Home Assistant or HomeKit entities
- Research WiFi-based pose estimation with a published pretrained CSI encoder and a camera-supervised fine-tuning pipeline

## Version history

- 2026-04-16: Covered on AI/TLDR for its WiFi DensePose capability: 17-point body pose, breathing rate and heart rate estimated through walls from $9 ESP32 nodes and a 1.8M-parameter graph transformer, with no camera and no wearable.
