A lot of AI room apps take a photo and hand back a pretty render. I wanted the boring part too: will the furniture actually fit, and where does it go. So I built Nookflip, which runs inside Anna, an AI app marketplace, with no backend of its own.
You upload a room photo and pick a style. The model returns a plan: furniture with real dimensions, paint colors with hex codes, materials, lighting. Then every piece lands on a to-scale floor plan you can rearrange, and when the layout looks right, it renders the makeover onto your own photo.
The floor plan
The plan model places each piece in a shared frame: the far wall in the photo is the top of the plan, and the camera side is the bottom. The app draws it as an SVG at real scale, and dragging snaps to a grid and stays inside the walls.
Every move runs a live check, all plain JavaScript, no AI:
- pieces whose boxes overlap
- gaps under 45 cm between two pieces
- pieces inside the swing of a door that opens into the room
- pieces too big for the room
If the model's own placements overlap, the app falls back to its own arrangement, trying the model's spot first, then the wall the plan's text mentions, then free spots that leave a walkway. The layout logic lives in one pure module with no DOM and no network, so it's covered by a node:test suite.
Getting the render to follow the plan
This was the hard part.
- A second image made things worse. I tried sending a drawing of the plan alongside the photo. The model rebuilt the room: moved the window, added a chair nobody asked for. Now the layout goes in as words, with which way the sofa and chairs face, and pieces in the strip behind the camera left out.
- Order matters. A render swapped out a bed the user asked to keep. The fix was putting the user's notes first, word for word, before any style details.
- Styles drift. A typed-in "Contemporary" kept coming back mid-century. Now the plan writes a short style guide first, including what the style is not, and everything is built to that.
What's next
A shopping list that keeps each piece's size next to its estimated price and flags when the estimate goes over budget, plus a "render anyway?" check when a layout still has clashes. Both came from people who tried it.
It's free to try with an Anna account, and new accounts start with free credits: https://anna.partners/store/@modlyai/nookflip
If you've tried keeping an image model faithful to a layout, what worked for you?
