kymomapGitHubconnecting…
Open source · self-hosted · no account

Your house,
seen by its own Wi‑Fi.

A small box on the wall of each room. No cameras, no cloud, no account. One live map, storey by storey, drawn on a computer in your cupboard. The bill of materials below is for a twelve-node house; the reference install runs seven.

The house

Eight boxes downstairs, four up. That is the whole install.

A two-storey house on an ordinary plot. Nodes sit beside wall sockets, one charger each, antennas vertical. Every node hears every other, so the eight downstairs give 28 links through the living floor, the four upstairs give 6 through the bedrooms, and the 32 links between floors cross the ceiling — 66 in all. Accuracy on a floor is bought by nodes on that floor, which is why the floor you live on gets eight.

SITE PLAN1 : 400
drivewayhouse · 12 × 9 mtwo storeys · 12 nodesshedgarden12.0 m9.0 mNsensing is clipped to the footprint
GROUND FLOOR · 8 NODES1 : 100
LIVING5.0 × 4.9HALLSTUDY3.5 × 2.9WCDINING5.0 × 4.1KITCHEN3.5 × 3.0UTILITYcorridorN1N2N3N4N5N6N7N8● node by a socket, 1.1 m up · ─ link (12 of 28 drawn) · ◌ error ringsimulated reading: one person in the living room12.0 m
UPSTAIRS · 4 NODES1 : 100
BEDROOM 15.0 × 4.6BEDROOM 25.0 × 4.4LANDINGBATH3.5 × 3.5BEDROOM 33.5 × 2.5OFFICE3.5 × 3.0STOREN9N10N11N124 nodes = 6 links on this floor + 32 to the floor below through the ceilingstorey‑true presence; localisation is coarser up here, and the map says so12.0 m
WHY 8 / 4Measured, not a guess.

Twelve nodes with one walker downstairs, in simulation: 12/0 → 0.68 m median, 94 % of frames counted right; 9/3 → 0.96 m, 86 %; 6/6 → 1.29 m and 25 %. Eight and four keeps the living floor sharp and still gives the bedrooms a storey-true answer.

WHERE THEY GONext to the plug.

Each box has its own 5 W charger and a 6 ft cable, so a node lives within two metres of a socket at chest height. Positions are laser-measured to 2 cm from one corner of the house — only the geometry between nodes matters.

WHAT YOU SEEOne house, both floors, live.

Plan or 3D, whichever you prefer, fitted to the house rather than the plot. Zoom out and the whole building is lit floor by floor; zoom into a room and the claim narrows with the view. A person is a dot inside a shell: the calibrated error ring across — the radius that has covered the person on about 85 % of held-out frames — and a whole storey tall, because the nodes lie flat and height inside one floor is not resolved.

Scan every room, get the house in 3D

Walk each room with your phone. The hub builds the building.

A free LiDAR app on an iPhone Pro captures each room as a mesh — no app of ours, nothing uploaded to us. The hub reads the meshes, levels them, joins them at the doorways and derives the walls. Tap a node’s box on the scan and it is placed to a few centimetres. What you get back is one seamless house: fly in from above, down through the roof, into any room, with the live map painted on the real geometry.

3D VIEW · ASSEMBLED FROM 13 ROOM SCANSsimulated reading
.livinghallstudydiningkitchenutility1 person · ring 0.9 mbedroom 1bedroom 2bathofficebedroom 3landingupper floor lifted · walls cut at 1.2 m · mesh from the phone, walls by the hubfrom above → through the roof → into a room
ZOOM · BUILDINGfrom outside
Someone is home.

The whole house lit floor by floor. At this distance the map claims only that, and which storey.

ZOOM · FLOORroof off
Downstairs, living side.

Rooms come from the scanned walls. The warm patch sits where the links say; a person still is held for ~30 s, then confirmed by breathing.

ZOOM · ROOMinside
Here, within 0.9 m.

The real geometry of the room from your scan, the person as a soft disc sized to the calibrated error — never sharper than the radio supports.

The claim narrows with the zoom; it never sharpens past the evidence. Room scans are optional — without them you draw the outline and place nodes by hand, and the map is a plan instead of a house.
01Scan3D Scanner App (free) on an iPhone Pro, one room at a time, export a mesh.
02ImportDrop it on the hub’s page. It is read, levelled and scale-checked there — it never leaves your LAN.
03JoinTie rooms at their doorways; the hub solves the fit and reports the residual before it applies it.
04PlaceTap each node’s box on the model. Position and its uncertainty are computed, not typed.
How

Radio in, a map out. All of it on the hub.

node N2a body bends itnode N652 amplitudeshub · inverse10 Hzmap · where
01
The nodes take turns transmitting

ESP-NOW broadcasts, ten sweeps a second, no router in the loop. Every frame is sealed with the installation key; the hub refuses what it cannot verify.

02
Every receiver reports the channel

52 subcarrier amplitudes per link, per sweep. Phase is unusable across commodity radios, so the pipeline never pretends to have it.

03
Tomography over the building

Links become ellipses through voxels; a regularised inverse turns 66 numbers into a field, clipped to the walls you drew. Ten times real time on a laptop.

Honest numbers

What it does, and what it doesn’t.

Every row says where its number was measured. The rig has been running on real hardware since 2026-09-07, but no row below has been re-measured on it yet, so they still say “simulation”. The word changes before the claim does.

CapabilityStatusMeasured in
Motion / no motionsolid, on a single linksimulation
Presence, by floor299 of 300 frames on the right storeysimulation
One person, located0.68–0.98 m median after a calibration walksimulation
Occupancy countone person; two in a room read as one 76–93 % of the timesimulation
Still presence (breathing)works only at low per-link drift, and is switched off by the shipped calibration windowsimulation
Following people through a crossingdoes not work — identity lost in 36 of 40simulation
Breathing rate, in breaths per minutenot shipped — computable, never checked against a real chest—
Heart ratenot possible on this hardware: amplitude only, no phase, room-scale linksdocs/vital-signs.md
Who it is by gait · pets · fallsno · no · out of scope: not a medical device—
Set up

An afternoon, and it survives a reboot.

1
Where is it? Rough dimensions, or install a map of your region once and look the address up on the hub. Optional.
2
Scan the rooms. A free LiDAR app on an iPhone Pro; the hub derives the walls. No app of ours. Optional.
3
Floors and nodes. Draw each storey, claim each box, blink it to find it, laser its position or tap it on the scan.
4
Leave the building. The hub measures the empty house and records that baseline from the measurement, not a form.
5
Live. Connection, readiness and frame age shown apart. A paused map never looks like a current one.
The rig · about $690 · arrived 2026-09-07
1GMKtec G10 mini PCthe hub · Ryzen 5, 16 GB, 1 TB
15Seeed XIAO ESP32-C6twelve placed, three spare
123 dBi antenna + U.FL pigtailbulkhead through the lid
20ABS box, 80 × 50 × 26 mmone per node
165 W USB-C charger, 6 ftone per node, beside the socket
1Laser measure, ±2 mmpositions bound everything
git clone https://github.com/Marlow-Systems-LLC/kymomap.git
cd kymomap && make setup && make serve-sim
# or: docker compose -f docker-compose.hub.yml up

Firmware compiles in CI against ESP-IDF v5.5.5 and has run on the reference rig since 2026-09-07: nodes associate, sound, and deliver CSI to the hub. The numbers in the table above are still the simulator’s — a first-day install is not a measurement — and the word changes before the claim does.