A local-first Home Assistant floorplan editor and live whole-home mmWave map. Place radars where they actually live, calibrate them against a known point, and see anonymous detections move through rooms and zones.
Alpha software. Map editing, persistent storage, ESPHome LD2450 discovery, native occupancy entities, and HACS packaging work today. Cross-radar target fusion is still on the roadmap.
- Fits even tall floorplans inside a compact, fixed-height viewport—no giant page or floorplan scrolling.
- Draws every live target as a moving person with an optional trail directly over the selected floor; stationary detections remain visually still.
- Supports multiple floors and multiple radars without changing cards.
- Keeps each radar, live person, and motion trail on its assigned floor; newly discovered hardware stays in an unplaced setup tray until you place it.
- Lets you edit the live dashboard directly: drag or touch-place radars, nudge with the keyboard, move them between floors, and undo, redo, cancel, or save.
- Draws rooms, walls, detection zones, exclusions, entrances, and stationary zones in the visual editor.
- Creates native occupancy, target-count, and enter/leave entities for named rooms and zones.
- Auto-discovers ESPHome LD2450 coordinate families and handles metric or Home Assistant-converted imperial units.
- Keeps floorplans, maps, and short-lived target trails local to Home Assistant and the browser.
- Use Open in HACS above, or add
https://github.com/daredoole/spatial-presenceas a custom Integration. - Install Spatial Presence, restart Home Assistant, then add it from Settings → Devices & services → Add integration.
- Add the Spatial Presence card to a dashboard.
- Open the visual editor, add the floorplans and draw rooms or zones.
- On the live card, choose Edit layout, place each unassigned radar on its real floor, and choose Calibrate placement.
- Choose Save layout. Future card loads use that saved map automatically.
See the illustrated getting-started guide for the full setup, manual installation, LD2450 entity requirements, and troubleshooting.
Affiliate disclosure: As an Amazon Associate, I may earn from qualifying purchases made through these links, at no additional cost to you.
The current reference wiring and ESPHome configuration are verified on an ESP-WROOM-32. The linked ESP32-S3 is a capable alternative, but it needs an ESP32-S3 board definition and S3-safe GPIO choices; do not copy the WROOM-32 AHT20 GPIO22 mapping because ESP32-S3 chips do not expose GPIO22.
The map opens fitted to the available card area. Pan or zoom inside the map; the dashboard page stays put. The header always reports live target and online radar counts, while magenta person markers, speed-aware walking motion, trails, and teal coverage bands remain visible over imported floorplans. Motion is disabled automatically when the browser requests reduced motion.
Choose Edit layout on the card to reveal the unplaced-radar tray and layout controls. Drag a radar with a mouse or touch, or focus it and press an arrow key to move 5 cm; hold Shift for 25 cm. Select a radar to rotate it, change floors, or remove it from the floor without deleting the Home Assistant device.
Easy Floorplan is a strong visual floorplan editor. Radar Map Manager is a strong radar placement and fusion tool. Spatial Presence focuses on the gap between them and ships explicit import/export adapters instead of copying either project. See interoperability and the schema RFC.
Requirements: Node.js 20+ and Python 3.12+.
npm ci
npm run typecheck
npm test
npm run build
python -m unittest discover -s tests/python -vRead CONTRIBUTING.md before changing the schema or an adapter. Security issues belong in GitHub private vulnerability reporting, not public issues; see SECURITY.md.
Spatial Presence is free and MIT-licensed. If it saves you time, you can buy Me a coffee. Sponsorship never buys feature priority, private support, or access to unreleased security fixes.
For help and project boundaries, see SUPPORT.md.

