How house scanning works
A homeowner scans the outside of their house around the electric meter with an iPhone. The phone captures the wall, the server builds a 3D model and checks Base Power's placement rules against it, and the app shows where the battery goes, in AR, on the real wall.
Picture a home inspector with a tape measure and a checklist. The phone is the inspector's eyes and tape, and the server holds the checklist. The comparison breaks in one place, and that place shapes the design: an inspector can lean around a bush to look, but the server can judge only what the phone actually saw.
1. The problem: a battery has to fit between the rules
Wider than the screen: scroll sideways for the rest of the picture.
Base Power puts a home battery on the outside wall, close to the electric meter, because a cable runs from the meter to the battery. The battery is 31 in wide, 22 in deep and 39.5 in tall. Whether it fits, and where, depends on the clearance rules in the picture. Today someone judges that from a few customer photos, which have no scale and can't show what sits just outside the frame.
The demo's rules come from public sources and live in the server's rules file, each with its citation. Two numbers there are placeholders because no public value exists (pool 10 ft, driveway 5 ft). Base's own thresholds are private, load at runtime from a file that is not in git, and do not appear on this page.
The rules the demo uses, with sources
| Rule | Value | Source |
|---|---|---|
| Distance from the gas meter | 3 ft | Base's public help page; Austin Energy; Texas Gas Service |
| Distance from AC units, fences, other batteries | 3 ft | Base's help page |
| Distance from doors and windows that enter the home | 3 ft | IRC R328.4 |
| Clear space in front of the battery | 3 ft | Base's help page |
| Cable run from the meter | within 20 ft | Base's help page |
| Headroom | 6.5 ft | NEC 110.26, a demo choice |
| Wall behind the battery | flat, and seen by the camera | demo requirement |
| Pool, driveway | 10 ft, 5 ft | placeholders; no public value exists |
2. From scan to answer, one step at a time
The project splits into three problems: a phone that guides the homeowner until everything needed is captured, photos and their metadata turned into a 3D model, and that model checked against the rules. Two teams share them. Each picture below redraws the last and adds one step. The dashed line down the middle is the boundary between the teams.
The phone guides the scan. The app builds a live 3D map on the phone as the homeowner moves. A haze, which the team calls fog of war, covers what the phone hasn't seen and lifts as it sees it. The app routes the homeowner until every part the model needs is seen. It sends a capture packet. Today the app uploads only its measurements and exports the full packet on request; the packet's README lists what it records so far. The packet holds photos; where the camera was and which way it pointed for each one (poses); the lens's focal length and center (intrinsics); motion-sensor readings; LiDAR depth and mesh when the phone has LiDAR; and the homeowner's marks, such as the meter. The packet is the contract between the teams. The server builds a 3D model. From the packet, the server team builds a 3D model or point cloud of the wall and the ground in front of it, at real scale. Which method does this best is open; section 4 compares the options. Plain code checks the rules. The rules and their sources live in a file. Code tries the battery's footprint at every spot along the wall, and each check at each spot comes out PASS, FAIL or UNSURE. No model makes this decision, so every answer traces back to a rule and a measurement. The answer comes back to the phone. The app draws the battery on the real wall in AR. It places the battery relative to the meter's anchor, so the drawing stays on the right spot as the phone's tracking corrects itself. When a check is UNSURE, the answer names the view that would settle it, and the homeowner can capture it on the spot.
3. Four ideas that keep the answer honest
The error bar decides: PASS, FAIL or UNSURE
No measurement is exact. The phone tracks its own position by dead reckoning, like counting your steps from a doorway, so its error grows the farther it gets from the meter. The comparison has a limit: a miscounted step only stretches the walk, while the phone's error can also drift sideways.
The server widens every measurement's error bar by 0.3 ft plus 0.16 ft for each foot from the meter. On public test walks, a current iPhone's tracking stayed inside that allowance. Then each check compares the rule against the whole error bar, not a single number.
Unseen is not clear
The live map's haze works like the fog of war in a strategy game: a dark patch is unexplored, not empty. The comparison stops there. In a game, scouting reveals the truth. Here, even the parts the phone saw carry an error bar.
Coverage means 100% of what the model needs
The app doesn't need the whole house. It needs every part the rules depend on, all of it. That is a fixed zone around the meter, so the app can say exactly what is left, and the scan can end when the zone is clear.
LiDAR first, never required
Some iPhones have LiDAR, a sensor that measures depth directly by timing reflected light. Most homeowners' phones don't. The app uses LiDAR and other depth sensors whenever the phone has them, and every check must also work without them.
4. How to build the 3D model: the options
Problem 2, photos and metadata into a 3D model, is open. The server team is comparing three families of methods: broadly first, then in depth on the best. None is ruled out. The numbers so far come from public datasets whose buildings were laser-scanned, so the true shape is known to a fraction of an inch.
Traditional reconstruction, fused with LiDAR
Geometry from first principles: find the same points in several photos, work out where they sit in 3D, and merge the depth from every view into one surface. LiDAR depth drops straight into that merge.
The known weakness is that matching points across photos struggles on blank siding and has no scale of its own. LiDAR and the phone's poses supply the scale.
Evidence: the recon worker (PR #20) merges depth into one surface. With a laser scan standing in for LiDAR, its walls come out at 2.1 in (p90).
Learned depth plus the phone's poses
A neural network estimates depth from a single photo. Its own sense of scale is off by 4 to 12%, so the photos are rescaled with the phone's poses and then merged.
MapAnything, a learned model that reads several photos at once, was not a stable baseline: its scale shifted with the input resolution.
Evidence: walls about 5 in (p90) at a realistic phone error, 2.8 in with exact poses. Edges 8 in or worse in every setting.
World models
Large learned models that take photos or video and produce a whole 3D scene at once, camera positions included. Think of someone who has seen thousands of houses sketching this one from a few snapshots.
The sketch comparison also shows the risk: a good sketch fills in what the artist never saw. That is fine for a picture, but a check needs to know which parts were observed.
Evidence: not evaluated yet. The server team will.
Data table
| Path | Setting | Wall error, p90 | Source |
|---|---|---|---|
| Learned depth | model's own scale (4 to 12% off) | about 20 in | evals, PR #12 |
| Learned depth | rescaled with poses, 2% pose scale error | 5.0 in (3.8 to 6.8) | evals, PR #12 |
| Learned depth | rescaled with exact poses | 2.8 in (2.0 to 4.4) | evals, PR #12 |
| Learned depth | edges, every setting | 8 in or worse | evals, PR #12 |
| Recon worker | photos only | 2.8 in | recon, PR #20 |
| Recon worker | laser scan standing in for LiDAR | 2.1 in | recon, PR #20 |
| World models | not evaluated | server team, next |
What any path has to show
- Real scale. A model's own sense of size is off by 4 to 12%, which is 5 to 14 in across a 10 ft stretch of wall.
- Edges within the error allowance. Clearances run from the edge of a door, window or gas meter, and edges are where learned depth is worst.
- Which parts were observed. The rules can pass a check only over area the phone saw. A method that fills in plausible wall has to mark what it filled in.
- It runs on the packet the phone actually sends. That includes phones without LiDAR.
5. Where each piece lives
Files marked with a pull request exist only on that branch until it merges. Each component's README wins over this page.
| Piece | Source of truth | State |
|---|---|---|
| iPhone app | ios/README.md | Guided capture in PR #10; live 3D map in PR #21, stacked on it |
| Capture packet | packet/README.md | Spec, validator and samples in PR #22 |
| Rules engine, API, capture contract | server/README.md, "What settles each check" | PR #11; live as a public demo with public rules, and privately with Base's rules behind a key |
| Reconstruction worker | recon/HANDOFF.md | Draft PR #20, handed to the server team |
| Accuracy evals | experiments/evals/README.md | PR #12 |
| Agent rules, system overview | AGENTS.md, docs/00-overview.md | On main |
| Web review page | Parked, PR #15 |
The plan, the decisions and the full evidence list are in 00-overview.md. The public rule values, their code citations and the model and imagery licenses are in 04-prior-art-and-codes.md.