Get Wi-Fi CSI from a home router
A hands-on lab: 256 subcarriers, 80 MHz, 8 Tx/Rx chains on a GL-MT6000 (MT7986) router. Full reproduction guide, raw datasets, Python tooling and hard-won troubleshooting.

Measured CSI amplitude heatmap (256 subcarriers; vertical = subcarriers, horizontal = time)
Latest
- CSI dataset: 10-second sample (256 subcarriers) + the full 10-minute capture
A real home-environment router CSI dataset: a 10-second sample (312 chain records, 256 subcarriers, 8 chains), a parser, the format spec and CC BY 4.0 licensing. · 2 min read
- Live demo: playback of a real 256-subcarrier CSI heatmap
No install required: watch real router CSI in the browser — a 256-subcarrier amplitude heatmap, a Doppler/time-frequency view, and a motion metric curve, with view switching, play/pause and speed controls. Captured on a GL-MT6000. · 2 min read
- ESP32 CSI human detection: a practical, calibrated setup
How to detect humans with ESP32 CSI: capture, amplitude-variance features, threshold calibration with hysteresis, and the mistakes that make demos fail in real rooms. · 2 min read
- ESP32 CSI getting started — and how it differs from router CSI
ESP32 is the cheapest CSI platform (20 MHz / 30–64 subcarriers). Here is the fastest path in, what it can do, and when a router (80 MHz / 256 subcarriers) is the better choice. · 1 min read
- Get 256-subcarrier Wi-Fi CSI from a GL-MT6000 router (no extra hardware)
A reproducible guide: build OpenWrt with the mt76 CSI patch, flash the router, enable CSI with frame-type and MAC filters, and validate the UDP stream. · 3 min read
- mt76 rate control: why a client gets pinned at MCS0 (and how to prove it)
A measured investigation into mt76 firmware rate adaptation: which counters matter, why last-tx-bitrate misleads, the vow_atf bug that prevents recovery, and the A/B test that proves it. · 3 min read
- Nexmon CSI guide: 80 MHz / 256 subcarriers on a Raspberry Pi
Nexmon CSI patches Broadcom Wi-Fi firmware to expose channel state information. Supported chips, steps on a Raspberry Pi, output parsing, and how it compares to router-based CSI. · 1 min read
- OpenWrt Wi-Fi slow after idle: a 10-minute diagnostic
One client slow while others are fine? Run this checklist: direction test, rate sampling, byte accounting, then the two known mt76 root causes (firmware ATF, 40 MHz client in an 80 MHz BSS). · 2 min read
Wi-Fi CSI on a router: practical handbook (PDF) + reproduction scripts
30-page Chinese edition, currently being expanded (v0.1): hardware selection, OpenWrt/mt76 build, flashing and rollback, CSI capture and parsing, performance troubleshooting (ATF / 40 MHz collapse), Python analysis and visualisation. Includes one-command scripts and checksums. An English edition is planned.
- Documents the data layout of this project's 10-minute raw capture
- Includes the
mt76-csideployment checklist and watchdog script - Free preview (Chinese): 5-page sample