Skip to content

Skills · interior-designer

furniture-layout

Lay out the furniture in a room at real sizes and draw it as a dimensioned SVG, with a script that fails the layout when pieces overlap or leave the room, block a door's swing, or leave a walkway, bed side, chair pull-back or wheelchair turning space narrower than it needs. Use when a designer or homeowner asks to "lay out this living room", "will a king bed fit", "arrange the furniture", "plan this office for 8 desks", "check the clearances", or has a room's size, its doors and windows and a list of furniture.

Pack interior-designerTier heavyJob Furnish a roomv0.2.1

npx skilldrop-cli install furniture-layout
Other ways to install

With the sibling skills it hands off to:

npx skilldrop-cli install furniture-layout --with-related

The whole pack it belongs to:

npx skilldrop-cli install --pack interior-designer

By hand, from a clone of the repo:

cp -R packs/interior-designer/skills/furniture-layout ~/.claude/skills/

In Claude Code, with the interior-designer plugin installed, invoke it as:

/interior-designer:furniture-layout

Try it

A realistic prompt from the skill's acceptance evals:

Lay out our bedroom: 3.6 m wide × 3.3 m deep, door at the right end of the south wall opening in, window centred on the north wall with a 0.9 m sill. Furniture: a king bed (1.8 × 2.0 m), two nightstands, a 1.2 m wardrobe with hinged doors, and a small desk with a chair.

What a good result looks like

Example output

Worked example: a king bed that "fits" by area · the skill's own worked example, source

Worked example

Input → output oracle for furniture-layout. The room passes an area check easily: 11.9 m² of floor for 5.2 m² of furniture. It fails twice on geometry before it passes. The first draft puts the desk in the door's swing. The second leaves a 0.81 m diagonal between the desk and the bed, under the 0.9 m walkway, so the wardrobe can't be reached. The answer keeps the king bed and changes the one piece that can give: the desk.

Input

Lay out our bedroom: 3.6 m wide × 3.3 m deep, door at the right end of the south wall opening in, window centred on the north wall with a 0.9 m sill. Furniture: a king bed (1.8 × 2.0 m), two nightstands, a 1.2 m wardrobe with hinged doors, and a small desk with a chair.

The zoning

  • The bed's head goes on the north wall, under the window: it is the only wall long enough to give the bed 0.6 m on both sides.
  • The wardrobe takes the west wall beside the bed, so its doors open into the bed's own side clearance, not into the route.
  • The desk takes the south-west corner, away from the door's swing.
  • The route runs from the door along the foot of the bed to both bed sides and the wardrobe.

What the checker caught

Draft 1 had the bed centred, the wardrobe on the west wall by the door, and the desk on the east wall by the door:

FAIL Desk is in the swing of Door: the door can't open fully
FAIL nothing 0.90 m wide clears the way in at Door

Draft 2 moved the bed 0.3 m east and the desk into the south-west corner, still at the standard small-desk size of 1.0 × 0.5 m:

FAIL no clear 0.90 m route from the entrance reaches Wardrobe (its front side)

The desk's corner at (1.0, 0.5) and the bed's foot corner at (1.2, 1.3) leave a diagonal of 0.81 m. That's enough to squeeze past, but not the 0.9 m walkway. A 0.9 × 0.45 m desk opens the gap to 0.94 m.

The layout that passes

layout.json (excerpt):

{
  "title": "Bedroom, 3.6 × 3.3 m: king bed, wardrobe and desk",
  "units": "m", "size": [3.6, 3.3],
  "doors": [{"name": "Door", "at": [3.1, 0], "width": 0.8, "hinge": "left", "swing": "in", "entrance": true}],
  "windows": [{"at": [1.8, 3.3], "width": 1.2, "sill": 0.9}],
  "furniture": [
    {"name": "King bed", "type": "bed", "width": 1.8, "depth": 2.0, "at": [1.2, 1.3], "facing": "S"},
    {"name": "Left nightstand", "type": "nightstand", "width": 0.45, "depth": 0.4, "at": [0.75, 2.9]},
    {"name": "Right nightstand", "type": "nightstand", "width": 0.45, "depth": 0.4, "at": [3.0, 2.9]},
    {"name": "Wardrobe", "type": "wardrobe", "width": 1.2, "depth": 0.6, "at": [0, 1.6], "facing": "E"},
    {"name": "Desk", "type": "desk", "width": 0.9, "depth": 0.45, "at": [0, 0], "facing": "N"}
  ]
}
| King bed | bed | 1.8 × 2 | 1.2, 1.3 | S | front 0.6, left 0.6, right 0.6 |
| Left nightstand | nightstand | 0.45 × 0.4 | 0.75, 2.9 | S | none |
| Right nightstand | nightstand | 0.45 × 0.4 | 3, 2.9 | S | none |
| Wardrobe | wardrobe | 1.2 × 0.6 | 0, 1.6 | E | front 0.6 |
| Desk | desk | 0.9 × 0.45 | 0, 0 | N | front 0.9 |

Floor 11.88 m² · furniture 5.09 m² (43 %) · walkway 0.90 m

PASS no overlaps, every piece in the room, no door swing blocked, every clearance clear,
every piece reached at the walkway width.

The drawing is king-bed-bedroom.svg.

The reply

The plan is in bedroom.svg. The king bed sits against the north wall under the window, the wardrobe on the west wall beside it, and the desk in the south-west corner. From the door there's a clear 0.9 m route along the foot of the bed to both sides and the wardrobe.

PieceSizeWhere
King bed1.8 × 2.0 mhead on the north wall, 1.2 m from the west wall
Nightstands0.45 × 0.4 meither side of the bed's head
Wardrobe1.2 × 0.6 mwest wall, doors opening east beside the bed
Desk0.9 × 0.45 msouth-west corner, chair facing the wall

One change from what you asked: the desk is 0.9 × 0.45 m, not a standard 1.0 × 0.5 m. At the standard size, its corner comes within 0.81 m of the bed's foot. You could squeeze past, but not walk through, to the wardrobe. If you'd rather keep a full-size desk, a queen bed (1.5 × 2.0 m) in the same place, its left edge 0.3 m further east, leaves room for it; that layout passes the same checks.

Assumed: nightstands 0.45 × 0.4 m. The door is hinged on the east side as you face it from inside, swinging into the room.

This is a schematic. It meets the clearances set here: 0.6 m beside and at the foot of the bed, 0.6 m in front of the wardrobe, 0.9 m behind the desk, and a 0.9 m route. It isn't a check against any building or accessibility code. Measure the real room, and the wardrobe's door width, before you buy.

Why this is the oracle

  • Area is not fit. 43 % coverage looks comfortable. The failures are a door swing and a 0.81 m diagonal, which no area sum shows.
  • A layout is shown only after it passes, and when the list doesn't fit as given, the reply names the piece, the number (0.81 m, not 0.9) and the smallest change that works.
  • The reply is for the client. It gives a plan, a table, one change with its reason, the assumptions and what the plan is not. It never mentions the checker, the JSON or where the file was written from.

A cheaper pass answers "yes, it all fits: 5 m² of furniture in a 12 m² room". It then puts the desk by the door, where the door hits it on every opening. Or it puts the full-size desk in the corner and leaves a gap you turn sideways to get through to the wardrobe.

How it's checked

Admitted against plain Claude Code, on its third draft: on held-out evals written blind from its description, two judges preferred it in 2 of 4 and 2 of 4 pairs, and it met 91% of their checks, against 91% without it (RFC-0077). How skills are checked

68 assertions across 9 acceptance evals, and 9 trigger queries. Every skill's checks

What the output must do
  • Writes a layout file, runs the layout checker, and shows a plan only after the checker passes (no FAIL lines in the final run)
  • Writes an SVG plan in the working directory with the room's overall dimensions, each piece's size, a scale bar and a north arrow
  • The king bed has at least 0.6 m clear on both sides and at the foot, and nothing sits in the door's swing
  • The wardrobe's doors open into clear floor, not against the bed or the desk
  • If any piece had to change size or be left out to fit, says which one, by how much, and why, with the number
  • States the zoning (where the bed's head goes and why, where the route runs) before or with the plan
  • Does not call the layout code- or accessibility-compliant, and does not mention scripts, JSON or skill folders in the reply
  • Converts the feet-and-inches measurements correctly (16 ft 6 in × 12 ft 9 in, about 5.03 × 3.89 m), and gives the plan in the units the notes use or both
  • Shows a plan only after the layout checker passes, with the route from the front door to the kitchen doorway clear at the walkway width
  • Nothing sits in the front door's swing, and nothing blocks the kitchen doorway
  • The sofa and loveseat face the TV console or each other across the coffee table, and the route doesn't run through the middle of the seating group
  • Keeps tall pieces (the 6 ft bookcase) out from in front of the window, and says what it did with the radiator
  • Every piece on the list is on the plan, or the reply says which piece was left out and the dimension that kept it out
  • Does not invent furniture, doors or windows that the notes don't mention
  • Uses the brief's 1.2 m route width and the 1.5 m turning space, not a narrower default
  • Answers the question directly: whether all 8 desks fit, and if not, the largest number that passes the checker and what stops the next one, in metres
  • No desk, chair zone or the cabinet's door zone overlaps the column or another piece
  • Every desk's chair side is reachable from the door on a 1.2 m route, and a 1.5 m turning circle is reachable
  • The plan shown has passed the checker, drawn as a dimensioned SVG with the column marked
  • Makes no accessibility-code compliance claim; says the plan meets the widths the brief set
  • Does not ask a follow-up question; anything it assumes (chair depth, desk orientation) is stated as an assumption
  • Writes the layout, runs the furniture-layout check script on it, and shows a layout only after a run with no failures, drawn as a dimensioned SVG per room in mm (room sizes, piece sizes, door swings)
  • Places all 8 desks (7 bench desks and Noor's height-adjustable desk, each 1600 x 800) in the open office, each with 750 mm clear behind it for the chair and at least 900 mm clear in the aisle between desk rows, and none overlaps the 400 x 400 column at 4600-5000 E-W / 2800-3200 N-S
  • Keeps every piece and every chair space out of all four door swings (900 mm leaves opening inwards; the kitchenette door is hinged on the east side at 3100), with nothing overlapping or outside its room, and treats the fitted kitchen run (y 3000-3600) as fixed
  • Gives Noor's desk a clear 1500 mm turning circle beside it and a route at least 900 mm wide from the open office door to it, and gives the meeting room a clear 1500 mm turning circle
  • Seats 8 at the 2400 x 1000 meeting table with 750 mm behind every chair (3900 x 2500 mm including the chair spaces) and puts the 1600 x 450 credenza where it doesn't cut into any chair space
  • Keeps the 1000 mm in front of the kitchenette counter clear, gives the 1200 x 800 cafe table 750 mm of chair space for its 4 chairs, and leaves a route at least 900 mm wide from the kitchenette door to the counter
  • Uses only the pieces and quantities in the schedule (8 desks, 9 task chairs, 3 cabinets, 1 printer station, 8 meeting chairs and so on, with the pedestals under the desks) and does not invent furniture, rooms or dimensions not in the survey or schedule
  • Runs the furniture-layout check script on the layout as supplied and reports what it fails before changing anything
  • Finds the living room coffee table (X 85-145) overlapping the sofa (X 0-95) by 10 cm and moves it clear of the sofa
  • Finds the study bookcase on the west wall (Y 30-120) inside the 80 cm swing of the study door hinged at X 15, and moves it out of the swing
  • Finds only 60 cm between the study desk's front edge (Y 230) and the reading armchair (top at Y 170), short of the 75 cm for the chair, and moves the armchair so the chair space is clear
  • Says the 180 x 200 bed cannot have 70 cm on both sides in the 290 x 290 bedroom whichever way it faces (180 + 70 + 70 = 320 > 290; the layout's 55 cm each side is the most it gets), and puts this to the clients with options (a 150 cm bed gives exactly 70 both sides, or accept 55) rather than claiming a fix or breaking another clearance to get it
  • Does not flag correct entries as errors: the 90 cm between the armchair and the TV unit on the way to the balcony door and the 90 cm at the foot of the bed meet the walkway rule
  • Re-runs the check on the corrected layout so only the bed-side shortfall remains, and draws the corrected rooms as a dimensioned SVG
  • Does not invent furniture, rooms or measurements that are not in the layout or the measurements file, such as a new bedside table or a different room size
  • Seats at least 26 covers, including one wheelchair place, using only the stock owned (at most 6 four-tops, 8 two-tops and 32 chairs), and the cover count stated matches the drawing
  • Leaves a clear route at least 1200 wide from the entrance door (south wall, x 600-1500) to the ordering zone at the counter and to the WC door (west wall, y 4800-5650), with no tables or chair zones in it
  • Keeps clear the 1200-deep queue zone in front of the counter (x 6200-10200, y 4800-6000), the column (x 2950-3350, y 5300-5700), the 900 swing of the entrance door, the 850 swing of the WC door, and the 1500 turning circle in front of the WC door
  • Gives every chair 750 behind the table edge, and keeps at least 900 between neighbouring tables' chair zones (or a chair zone and a bare table edge), with no table or chair zone overlapping another
  • One table has a wheelchair place with its chair taken away and a 1500 turning circle clear of furniture right in front of it
  • Delivers a to-scale SVG with dimensions showing the 10200 x 6800 room, the counter, the column, both doors with their swings and the clearance zones, plus a table schedule giving each table's position from the SW corner for the fitters
  • Reports the result of checking the layout against each of the consultant's five requirements, and every one passes
  • Does not invent furniture (no banquettes, extra tables, or the high stools the stock list says are no longer needed), and does not move the counter, column or doors or change the room's size
  • Flags that the side table (y 3900-4350) overlaps the armchair (from y 4300) by 50 mm, and moves it clear
  • Flags that the luggage rack (x 1500-1950, y 300-1200) is inside the entrance door's 900 swing (its nearest corner is about 626 from the hinge), and moves it somewhere outside both door swings and every clearance zone
  • Flags that neither side of the bed meets standard (c): 1350 on the west side to the wall and 1050 on the east side to the armchair, against 1500 on one side. It fixes this, for example by moving the bed and both bedside tables 150 east, giving 1500 on the west and 900 on the east (at least 800 needed) while keeping the 900 at the foot clear
  • Flags that the 1500 turning circle in front of the bathroom door cannot be met: the lobby is only 1350 wide between the built-in wardrobe (x 1500) and the bathroom pod (x 2850), both fixed, so no furniture move fixes it. It is reported as needing a building change or a brand waiver, not as passing
  • Raises no false alarms: the desk chair's 750 pull-back zone, the 900 clear at the foot of the bed, and the routes to the desk and bathroom door are not reported as failures
  • The corrected layout meets every part of the standard except (d): no overlaps, nothing in either door swing, 1500 and at least 800 at the bed sides, 900 at the foot, 750 at the desk, and a 900 route from the entrance to the bed's 1500 side, the desk and the bathroom door
  • Returns room_214_layout.csv in the same columns with the moved items' new X/Y marked, plus a dimensioned SVG plan showing the door swings and clearance zones
  • Does not move or resize the built-in wardrobe, the bathroom pod, the doors or the room, and does not add or remove furniture
  • Places every piece on the client's list at its listed size - 8 waiting chairs, the two-seat sofa, the bariatric chair, coffee table, play table, toy box, leaflet bookcase, water cooler and plant (16 pieces) - giving all 11 seats the list allows
  • Keeps a clear 1500 x 1500 mm turning space directly in front of the accessible WC door on the right-hand wall (0.7-1.6 m from the front wall), with no furniture in it or in that door's outward swing
  • Keeps a clear 1500 x 1500 mm space in front of the lowered left-hand 900 mm of the reception counter (4.0-4.9 m from the left-hand wall), not in front of the full-height part
  • Provides one 900 x 1400 mm wheelchair waiting space next to other seats and outside every walkway
  • Keeps the entrance door's inward swing clear and shows clear routes at least 1200 mm wide from the entrance to the counter, the WC and the corridor door
  • Converts the furniture sizes from centimetres to the same units as the room (e.g. the 140 cm sofa as 1400 mm) rather than mixing units
  • Delivers a dimensioned plan (SVG or equivalent) of the 6800 x 5400 mm room and runs or reports a clearance check of the layout
  • Does not invent furniture, doors, sockets or room features not in the input, such as new chairs, a TV, a second entrance or a radiator
  • Flags that reading table RT3 leaves only 600 mm on its north long side to the shelving ranges (900 mm needed for chair pull-back) and fixes it, e.g. RT3 at Y 900 giving 900 mm both sides
  • Flags the returns trolley TR1 sitting in the main door's swing (the door opens in, 4000-4900 mm from the west wall) and moves it out of the swing and the main route
  • Flags the 800 mm aisle between ranges R3 and R4 (1000 mm needed) and moves a range to restore it without breaking another clearance
  • Flags that the newspaper stand DS1 narrows the route to the fire exit to 800 mm above the shelving ranges (1200 mm needed) and moves it to restore the route
  • Says the 1500 x 1500 turning space in front of T5 cannot fit in the window bay because the bay between fixed ranges S1 and S2 is only 1300 mm wide, reports it as unmet rather than passing, does not move S1, S2 or T5 in the schedule, and gives the librarian options to decide on
  • Returns the schedule as CSV with the same columns, header, row order, refs and millimetre units, changing only the positions of the pieces it moved
  • Does not report false problems with pieces that already meet the standards, such as RT1, RT2, R5 or the lounge chairs
  • Does not invent furniture, dimensions, doors or standards not in the input, such as a new location for the floor box or a second accessible table
When it should and shouldn't activate

Should activate:

  • Lay out this living room: 5 × 4 m, door in the corner, here's our furniture
  • Will a king bed fit in a 3.4 × 3 m bedroom with the wardrobe?
  • Arrange the furniture in our studio flat so we can still walk round
  • Plan this office for 8 desks and check the clearances
  • Where should the sofa go so the door doesn't hit it?

Should leave to another skill:

  • Draw a floor plan for these rooms in a 12 × 15 m footprint
  • Lay out a 2-bed apartment's rooms in a 7.2 × 10.8 m footprint
  • Check our checkout page for WCAG contrast and keyboard issues
  • Reorganise our help centre's layout so people can find articles

Hands off to

Source

SKILL.md · the whole folder on GitHub.