Atlas of Systems Atlas
MMXXVI
move your cursor through the rooms — no camera, no wearable, no app on their phone

Proximity.

Detecting a person walking through a house by watching the shadow their body casts on ambient WiFi.

FastAPI · WebSockets · Python · one stationary laptop
Proximity — a look inside, on desktop and phone
on desktop and phone
Live perturbation

A body is 60% water

Water absorbs 2.4 and 5 GHz. Walking through a room shifts RSSI by one to three dBm — and crucially, it shifts each access point by a different amount depending on what's between it and the receiver. That difference is the signal.

Z-scores against the calibrated baseline. Anything past 2.5σ trips the zone. Drag through the floorplan above and watch which BSSIDs react.

The rewrite

The first architecture was solving the wrong problem

It treated RSSI as a location fingerprint for the scanner's own position — which room is the laptop in. That's a solved and useless question when the laptop never moves.

Original model

Fingerprint the receiver. Walk the house, label rooms, classify live readings with KNN. Answers "where am I" — for a machine sitting on a desk.

Corrected model

The scanner is fixed. Detect someone else by how their body perturbs the ambient field. The dot tracks the most disturbed zone, not the receiver.

01
Baseline

Scan an empty house for 30 seconds. Compute a stable mean and standard deviation per BSSID.

02
Perturbation

Live RSSI expressed as a Z-score against that baseline. The deviation is the motion signal — raw dBm never is.

03
Zone inference

Each calibrated zone has a signature: which BSSIDs deviate, and in which direction. Match live deviations against the library.

04
Track

Zone transitions over time become a path. Room-level resolution, no better — and the code doesn't pretend otherwise.

Honest limits

Single-router RSSI is noisy as hell

What works

Presence and motion detection are reliable. Room-level zoning works after calibration. Path tracking is a sequence of transitions.

What doesn't

Sub-room positioning. Counting people. Anything through more than a couple of interior walls without a second AP in the geometry.

The upgrade path

CSI — per-subcarrier phase and amplitude — is sensitive enough to detect breathing, but needs a card with an exposed CSI driver.

The other path

802.11mc FTM gives real round-trip distance instead of inferred attenuation, if the router supports it.

Bugs that cost real time

An asyncio.Lock() constructed outside the event loop, and a deprecated @app.on_event startup hook.

The dumbest one

The Windows batch launcher died on a folder path containing spaces and a trailing backslash. Nothing to do with RF at all.

Windows-side scanning goes through netsh, which caps the poll rate and quietly caches results. That ceiling is the real constraint on temporal resolution, not the physics.