TextFloorPlan

I stopped asking the model for room coordinates

My first version took 186–223 seconds to generate a plan with reasoning on. Turning reasoning off gave me overlapping rooms. I built TextFloorPlan around a different split: the model describes rooms, code places them. A recorded 64.8 m² apartment took 3.6 seconds.

Fast meant overlapping rooms

Neither version was something I wanted to ship. Waiting 186–223 seconds was a poor fit for a quick floor plan sketch. Getting a drawing faster didn't help if its rooms occupied the same space.

I had asked an LLM to output room coordinates directly. That meant asking it to interpret a home description and solve the placement in the same response.

The product I wanted was simple to describe: enter one or two plain-English sentences about a home and get a to-scale concept floor plan. Each room would be a rectangle labelled with its name, width × depth, and area. A room table and scale bar would make the result easy to inspect.

But those labels made the geometry problem harder to ignore. I needed to change who was responsible for the coordinates, rather than keep choosing between the slow version and the broken one.

Where placement moved

I stopped asking the model to draw the plan. Its output became a room list containing names, target areas, and adjacency information: which rooms should sit next to which.

Code then places those rooms on a 0.1 m grid.

Here is the responsibility split in pseudocode. This shows the inputs to placement and the validation path, rather than the internal placement algorithm:

rooms = language_model(home_description)
# Each room has a name, target area, and adjacency information.
# The model does not return coordinates.

plan = place_with_code(
    rooms,
    grid = 0.1 m
)

checks = validate(
    plan,
    every_room_inside_outline,
    no_overlaps,
    floor_fully_covered,
    total_within_10_percent_of_requested_size
)

if checks_fail:
    redraw_once_and_check_again()

if checks_still_fail:
    return_error_without_using_free_allowance()

That was the useful change for me: the model describes the requested spaces, and it is no longer responsible for making the rectangles fit.

The checks have a narrower job. They validate containment, overlap, floor coverage, and the allowed total-size tolerance.

I also gave failure an explicit endpoint. A failed check gets a redraw. If that still fails, the user gets an error rather than an unchecked layout, and the attempt does not count against the free limit.

Before you try it

Try TextFloorPlan with a short home description and an approximate total size in m² or sq ft. You can generate 2 plans per day for free without signing up.

The limit matters as much as the speed: this is a concept layout, not a construction drawing.

Rooms are rectangles. The plan does not include wall thickness or structure, and it leaves out windows and stairs. It is not checked against building codes. Have a professional check anything you intend to build.

I built it for a quick, dimensioned sketch you can inspect.

The apartment I recorded

On 2026-10-04, I recorded a production run using this description:

"2-bedroom apartment with open kitchen, living room and balcony, about 65 m²"

To follow the same workflow:

  1. Enter the description. Include the rooms you want, any wishes, and the approximate total size.

  2. Read the plan and room table. The recorded result showed 64.8 m², with displayed overall dimensions of 8.0 m × 8.1 m and 7 rooms. Every room rectangle carried its own width, depth, and area.

  3. Choose units and download. One click switches the whole plan and table between metric and imperial units, including feet and inches. SVG and PNG buttons sit under the plan.

The apartment's living room was 20.1 m² and its open kitchen was 10.1 m². The bedrooms were 12.0 m² and 9.9 m². The remaining spaces were a 4.1 m² bathroom, a 4.9 m² balcony, and a 4.0 m² hall.

A request for "about 65 m²" still leaves open how much space goes to the kitchen or the bedrooms. The table makes that split visible.

Switching units showed the same apartment as 698 ft², with the living room at 214 ft².

The run passed on its first attempt, and the server took 3.6 seconds to generate it.

What the change bought me

Moving geometry into code brought generation down to a few seconds, and the model cost to about $0.0001 per plan.

In production measurements on 2026-10-04, first-attempt generation ranged from 0.8 to 3.9 seconds. One run failed the geometry check, retried, and took 26.4 seconds.

I also recorded a larger request in the same session:

"3-bedroom family house with two bathrooms, dining room and entry hall, about 110 m²"

It produced a 110.0 m² layout measuring 10.0 m × 11.0 m, with 11 rooms, on the first attempt in 2.7 seconds.

What I shipped

I launched TextFloorPlan as a solo maker on 2026-10-04.

Beyond the free allowance, the monthly option costs $9.90 for 200 generations per month. A one-time $4.90 pack includes 40 generations and is valid for 12 months. Payments go through Stripe.

You can try your own description here.