AI/TLDR

RuView

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

Physical Sensing & PerceptionOpen source
Updated
16 Apr 2026
Language
Rust
License
MIT
Coverage
1 story
$docker pull ruvnet/wifi-densepose:latest

What's new

16 Apr 2026

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.

Latest news

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.

Evaluate with simulated data

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

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

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.

bashbash
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

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.

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

Use it from Python

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

pythonpython
pip install "ruview[client]"

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

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.

Commands and code are distilled from the project's own documentation — always check the official repo for the latest.

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