Four independent cuts into the 2-4 hour full run, none touching the contract "a mutant must turn its guard red": - guardNeedsBundle: rollup runs only for guards that open the built bundle (demo/ smokes, golden captures, bundle:sync) — 68 of 253 registry entries. Unit and backend guards never read dist/ as a build artifact (verified against every test that mentions dist/**: they read the git checkout or synthetic files), so 185 mutants skip the most expensive step entirely. - seedTestBuild + incremental tsc: the mutant worktree starts from the main tree's warm test-build/ and .tsbuildinfo; tsc compares file hashes, not mtimes, so the fresh checkout stays warm and only the mutated delta is recompiled. This also speeds up the long guards that run tsc themselves. - --changed[=range]: run only mutants whose patch files are touched by the diff (origin/dev..HEAD by default). An empty selection is an honest success with an explicit message — the full registry remains the pre-release contract, per the workflow comment. - --shard=i/n: deterministic interleaved slices; the workflow runs a 4-way matrix, and a warm test-build step feeds every shard. Interleaving spreads the expensive browser mutants across shards instead of clumping them. Measured per mutant on this machine: unit 12-13 s (was ~50-70 s), backend 6 s, browser 32 s (unchanged — the bundle is genuinely needed there). Full run estimate drops to ~70 sequential minutes, ~20 on four shards. Unit coverage: guard classification on real registry shapes, a floor on both classes so the split cannot silently collapse, changed-selection semantics, and shard completeness/disjointness with an anti-clumping bound. Issue: #332 User-Visible: no
🏠 House Plan — a live home map for Home Assistant
📘 Full user guide · 🇷🇺 Русский · 🗂 Project issues
Your whole home at a glance
House Plan turns Home Assistant into a live map of your home. Upload a plan or draw rooms directly on the dashboard, bind them to Home Assistant areas, and the area's devices appear automatically. You can immediately see where a light is on, a door is open, a room is too cold, Zigbee signal is weak, or a leak sensor has fired.
Setup is entirely graphical: no floor-plan YAML, Inkscape, or external editor. Plan data and device positions live on the Home Assistant server and stay in sync across screens.
Edit on a desktop computer. View and kiosk are fully supported on phones and tablets. The editors are designed primarily for a mouse and keyboard; individual touch editing operations may be awkward or unavailable. See the exact touch support contract.
What House Plan provides
- Live state and safe actions. Lights and other safe devices can toggle from the plan; a lock cannot be opened by an accidental plan tap.
- Three built-in editors. Plan creates rooms, walls and openings; Device places and configures markers; Background adds lines, labels and furniture.
- Area-aware rooms. New devices appear automatically, while room cards can show temperature, humidity, light state and average LQI.
- Light and environment. Room fills, lamp Glow, wall shadows, a day-cycle backdrop and sunlight through windows.
- Doors, windows, gates and vacuums. Openings follow real contacts and locks; a robot can show its position, dock and travelled path.
- Several floors and screens. Space tabs, swipe navigation, local viewport, and a separate initial floor for each card.
- Wall-display kiosk. A plan-only view with fullscreen navigation and icon sizes saved for that display.
Your first working room
- Install the integration and add the card to a dashboard.
- Create the first space: upload SVG/PNG/JPG/WebP, reuse an uploaded image, or choose no image and draw the plan by hand.
- In Plan, select Room outline, place vertices, and click the first point to close the outline.
- Name the room and bind it to a Home Assistant area. Use “No area” for a room that has no devices.
- Open Device: devices from the bound area are already placed; drag their markers to the correct positions.
- Optionally use Background for lines, text and furniture.
- Return to View. The plan now displays live state and accepts safe actions.
Every workflow and edge case is in the full user guide. The Background editor contract and vacuum guide are the authorities for those subsystems.
Installation
HACS
House Plan is in the HACS default catalog — no custom repository needed.
- In HACS search for House Plan and install it.
- Restart Home Assistant.
- Open Settings → Devices & services → Add integration → House Plan.
The card is registered automatically. If you manage Lovelace resources manually, use the URL served by the integration:
resources:
- url: /houseplan_files/houseplan-card.js
type: module
Do not use the on-disk path inside custom_components; Home Assistant does not
serve that path as a JavaScript module.
Manual installation
Copy custom_components/houseplan to config/custom_components, restart Home
Assistant, and add the House Plan integration.
Add the card
Create a dashboard view (Panel works best) and add the card in the UI or as:
type: custom:houseplan-card
title: House plan
Different screens may start on different spaces:
type: custom:houseplan-card
default_floor: ground
All cards share server-side rooms and coordinates. Current mode, viewport and selected space remain local to the screen. Revision checks and live sync cover concurrent clients, but avoid editing the same object in two browsers at once.
Detailed documentation
- Full user guide
- Mouse/touch/keyboard matrix
- Plan tools
- Background editor
- Robot vacuums
- Touch support
Support and feedback
- Questions and plan examples: Telegram @ha_houseplan.
- Bugs and proposals: GitHub Issues.
- Before reporting, update House Plan, restart HA and hard-refresh the page. Include the version, browser, logs and reproduction steps; private entity IDs may be replaced with fictional ones.
Documentation screenshots are produced by the reproducible
npm run build && node demo/docs/capture.mjs command using synthetic data only. Scenario version,
source fingerprint and every image hash are recorded in the
screenshot index.
License: MIT.






