Furniture Fit Checker 🛋️📏
The classic disaster: sofa bought online, delivery guys arrive, it doesn't
make the corner at the top of the stairs — now you own a return-shipping
nightmare. Or: desk fits the wall but blocks the door swing. This skill
runs the geometry before money changes hands.
Overview
Three checks, one tool (scripts/fit_checker.py):
- Path check — can the item pass a doorway/corridor/stairs?
The moving-industry insight: a rigid box passes through an opening if it
can be tilted diagonally. For a rectangular item (W×H×D) and a
doorway (w×h), the effective clearance is the diagonal
√(W²+D²) compared against the door width — plus corner-turning between
corridor walls with the inner-diagonal trick. Handles:
- doorway width vs item diagonal (item height vs door height)
- L-shaped corner between corridors (inner-corner + outer-wall check)
- straight staircase width vs diagonal, landing 180° turns
- elevator cab diagonal (door + interior)
- Room fit — does it fit where you want it, with walkways ≥ 30 in /
75 cm (interior-design standards: 75-90cm paths, 90+ around dining)?
Checks wall-length fit, walkway to opposing furniture/door, door-swing
clearance, and radiator/vent obstruction warnings.
- Floorplan preview — ASCII render of the room with the furniture
placed, so you can see the walkways before committing.
Everything in metric or imperial (auto-detected per value with explicit
unit suffixes).
When to Use
- "Will this sofa (86×37×35 in) fit through my 32-inch door?"
- "Can a king mattress go up my staircase with a landing?"
- "Will the desk fit in the bedroom without blocking the closet door?"
- "Does the dining table leave room to pull chairs out?"
- Pre-purchase sanity check before ordering big furniture online
- Moving-day planning: order of items through each door
Don't use for: architectural planning (load bearing, code compliance),
non-rectangular complex items (L-shaped sectionals — approximate as their
bounding boxes per section), or piano moving (hire pros, seriously).
How It Works — Steps
- Measure (a tape measure, 5 minutes): item W×D×H; door width × height
(door open 90°, measure the frame minus trim); corridor widths if any;
room dimensions; where you want it.
- Path check:
python3 scripts/fit_checker.py path --item 86x37x35in --door 32x80in
- Corner / stairs if the route has them:
python3 scripts/fit_checker.py corner --item 86x37x35in --hall-a 36in --hall-b 36in
python3 scripts/fit_checker.py stairs --item 76x16x12in --width 36in --landing
- Room fit:
python3 scripts/fit_checker.py room --item 86x37in --room 14x11ft \
--other 60x30in --floorplan
- Look at the floorplan the tool prints; adjust and re-run.
The Geometry (exact rules)
- Doorway: item passes iff
item diagonal √(W²+D²) ≤ door width AND
item min(W,D,H) ≤ door height (tilt through). Sofas: use arm-to-arm
width and seat depth; add nothing — but if legs/arms removable, measure
without them.
- Corner (two corridors): moving trick — the item must satisfy
inner diagonal check: for item length L and widths, at the critical
angle θ where it simultaneously touches both outer walls and the inner
corner: passes iff (L·sinθ + W·cosθ) ≤ min hall width for no θ...
computed numerically over θ ∈ [0°, 90°] in 0.5° steps (exact for
practical purposes).
- Stairs: straight run — diagonal check vs stair width at the
narrowest point (handrail, radiator, turn). With a 180° landing: the
item must pivot on the landing; needs
landing depth ≥ item diagonal × 0.75 (empirical moving rule; tight pivots need pros' experience).
- Room walkways: distance from furniture edge to the nearest
obstruction (wall, other furniture, door swing arc) ≥ 75cm/30in;
dining-table chairs need +90cm/36in on chair sides.
Worked Example
Sofa 86×37×35in, door 32×80in:
diagonal = √(86²+37²) = 93.6in > 32in → cannot pass flat
BUT min(86,37,35)=35in... height check: 35in ≤ 80in ✓
tilt geometry: sofa tilted on end, needs √(86²+35²)=92.9in vertical —
exceeds 80in door height → FAIL flat-on-end
workaround: angle-entry (two-person tilt) marginally possible —
tool says TIGHT, remove door if hinge-pinned, or sofa legs off.
Common Pitfalls
- Measuring the door slab, not the opening. A "34-inch door" is the
slab; the clear opening with the door open 90° is ~2in less (trim,
hinges). Measure the gap.
- Forgetting the door swings IN. An entry door opening inward eats
~door-width of maneuvering room on the delivery side; remove the door
(pop the hinge pins) for tight items.
- Ignoring ceiling height on stairs. Low ceilings above stairwells
(under stairs, sloped) block items that pass the width check — the
minimum above-step clearance matters as much as width.
- Using overall sofa dims when legs come off. 4in of legs = the
difference between fail and pass. Always check removable feet first.
- Hallway lights, radiators, baseboards narrow the nominal width by
2-6in at the critical point. Measure at the narrowest point, not the
average.
- Elevator: interior diagonal ≠ door diagonal. The cab is bigger than
its door; the binding constraint is the door, then cab depth.
- Box springs don't bend. A king mattress flexes around corners; a
box spring/rigid base does not — that's what "split king" bases exist
for.
Verification Checklist
One-Shot Recipes
Online sofa listing sanity check:
python3 scripts/fit_checker.py path --item 213x94x89cm --door 81x203cm --report
Full route audit (door → hall → corner → stairs):
python3 scripts/fit_checker.py path --item 86x37x35in --door 32x80in
python3 scripts/fit_checker.py corner --item 86x37x35in --hall-a 40in --hall-b 36in
python3 scripts/fit_checker.py stairs --item 86x37x35in --width 36in --landing 36in
Will the bed + desk both fit?
python3 scripts/fit_checker.py room --item 60x80in --room 12x11ft \
--other 48x24in --floorplan
1---2name: furniture-fit-checker3description: Check if furniture fits a room and the delivery path before buying or moving: computes doorway/hallway/stair clearance with diagonal-tilt geometry (the moving-industry standard), room layout fit with walkway widths, and draws an ASCII floorplan preview. Use when the user asks if a sofa/desk/bed/mattress will fit through a door, up stairs, around a corner, or in a room — preventing the classic bought-it-can't-move-it disaster.4license: MIT5---67# Furniture Fit Checker 🛋️📏89The classic disaster: sofa bought online, delivery guys arrive, it doesn't10make the corner at the top of the stairs — now you own a return-shipping11nightmare. Or: desk fits the wall but blocks the door swing. This skill12runs the geometry **before money changes hands**.1314## Overview1516Three checks, one tool (`scripts/fit_checker.py`):17181. **Path check** — can the item pass a doorway/corridor/stairs?19 The moving-industry insight: a rigid box passes through an opening if it20 can be **tilted diagonally**. For a rectangular item (W×H×D) and a21 doorway (w×h), the effective clearance is the diagonal22 √(W²+D²) compared against the door width — plus corner-turning between23 corridor walls with the inner-diagonal trick. Handles:24 - doorway width vs item diagonal (item height vs door height)25 - L-shaped corner between corridors (inner-corner + outer-wall check)26 - straight staircase width vs diagonal, landing 180° turns27 - elevator cab diagonal (door + interior)282. **Room fit** — does it fit where you want it, with **walkways ≥ 30 in /29 75 cm** (interior-design standards: 75-90cm paths, 90+ around dining)?30 Checks wall-length fit, walkway to opposing furniture/door, door-swing31 clearance, and radiator/vent obstruction warnings.323. **Floorplan preview** — ASCII render of the room with the furniture33 placed, so you can *see* the walkways before committing.3435Everything in metric or imperial (auto-detected per value with explicit36unit suffixes).3738## When to Use3940- "Will this sofa (86×37×35 in) fit through my 32-inch door?"41- "Can a king mattress go up my staircase with a landing?"42- "Will the desk fit in the bedroom without blocking the closet door?"43- "Does the dining table leave room to pull chairs out?"44- Pre-purchase sanity check before ordering big furniture online45- Moving-day planning: order of items through each door4647**Don't use for:** architectural planning (load bearing, code compliance),48non-rectangular complex items (L-shaped sectionals — approximate as their49bounding boxes per section), or piano moving (hire pros, seriously).5051## How It Works — Steps52531. **Measure** (a tape measure, 5 minutes): item W×D×H; door width × height54 (door open 90°, measure the frame minus trim); corridor widths if any;55 room dimensions; where you want it.562. **Path check**:57 ```bash58 python3 scripts/fit_checker.py path --item 86x37x35in --door 32x80in59 ```603. **Corner / stairs** if the route has them:61 ```bash62 python3 scripts/fit_checker.py corner --item 86x37x35in --hall-a 36in --hall-b 36in63 python3 scripts/fit_checker.py stairs --item 76x16x12in --width 36in --landing64 ```654. **Room fit**:66 ```bash67 python3 scripts/fit_checker.py room --item 86x37in --room 14x11ft \68 --other 60x30in --floorplan69 ```705. **Look at the floorplan** the tool prints; adjust and re-run.7172## The Geometry (exact rules)73741. **Doorway**: item passes iff `item diagonal √(W²+D²) ≤ door width` AND75 `item min(W,D,H) ≤ door height` (tilt through). Sofas: use arm-to-arm76 width and seat depth; add nothing — but if legs/arms removable, measure77 without them.782. **Corner (two corridors)**: moving trick — the item must satisfy79 `inner diagonal check`: for item length L and widths, at the critical80 angle θ where it simultaneously touches both outer walls and the inner81 corner: passes iff `(L·sinθ + W·cosθ) ≤ min hall width` for no θ...82 computed numerically over θ ∈ [0°, 90°] in 0.5° steps (exact for83 practical purposes).843. **Stairs**: straight run — diagonal check vs stair width at the85 narrowest point (handrail, radiator, turn). With a 180° landing: the86 item must pivot on the landing; needs `landing depth ≥ item diagonal ×87 0.75` (empirical moving rule; tight pivots need pros' experience).884. **Room walkways**: distance from furniture edge to the nearest89 obstruction (wall, other furniture, door swing arc) ≥ 75cm/30in;90 dining-table chairs need +90cm/36in on chair sides.9192## Worked Example9394```95Sofa 86×37×35in, door 32×80in:96 diagonal = √(86²+37²) = 93.6in > 32in → cannot pass flat97 BUT min(86,37,35)=35in... height check: 35in ≤ 80in ✓98 tilt geometry: sofa tilted on end, needs √(86²+35²)=92.9in vertical —99 exceeds 80in door height → FAIL flat-on-end100 workaround: angle-entry (two-person tilt) marginally possible —101 tool says TIGHT, remove door if hinge-pinned, or sofa legs off.102```103104## Common Pitfalls1051061. **Measuring the door slab, not the opening.** A "34-inch door" is the107 slab; the clear opening with the door open 90° is ~2in less (trim,108 hinges). Measure the gap.1092. **Forgetting the door swings IN.** An entry door opening inward eats110 ~door-width of maneuvering room on the delivery side; remove the door111 (pop the hinge pins) for tight items.1123. **Ignoring ceiling height on stairs.** Low ceilings above stairwells113 (under stairs, sloped) block items that pass the width check — the114 minimum above-step clearance matters as much as width.1154. **Using overall sofa dims when legs come off.** 4in of legs = the116 difference between fail and pass. Always check removable feet first.1175. **Hallway lights, radiators, baseboards** narrow the nominal width by118 2-6in at the critical point. Measure at the narrowest point, not the119 average.1206. **Elevator: interior diagonal ≠ door diagonal.** The cab is bigger than121 its door; the binding constraint is the door, then cab depth.1227. **Box springs don't bend.** A king mattress flexes around corners; a123 box spring/rigid base does not — that's what "split king" bases exist124 for.125126## Verification Checklist127128- [ ] All measurements taken at the narrowest point of the path129- [ ] Door measured as clear opening (90° open, minus trim)130- [ ] Item height-vs-doorway-height check done, not just width diagonal131- [ ] Walkway check ≥ 75cm (30in) for every side you walk past132- [ ] Door-swing arcs drawn on the floorplan output133- [ ] Removable legs/arms measured without, noted in the decision134135## One-Shot Recipes136137**Online sofa listing sanity check:**138```bash139python3 scripts/fit_checker.py path --item 213x94x89cm --door 81x203cm --report140```141142**Full route audit (door → hall → corner → stairs):**143```bash144python3 scripts/fit_checker.py path --item 86x37x35in --door 32x80in145python3 scripts/fit_checker.py corner --item 86x37x35in --hall-a 40in --hall-b 36in146python3 scripts/fit_checker.py stairs --item 86x37x35in --width 36in --landing 36in147```148149**Will the bed + desk both fit?**150```bash151python3 scripts/fit_checker.py room --item 60x80in --room 12x11ft \152 --other 48x24in --floorplan153```