# FloorPlanCraft > FloorPlanCraft is a web floor planner for commercial spaces: restaurants, cafés, indoor playgrounds, gyms, salons, clinics, classrooms, shops, offices, warehouses and more, in 2D, 3D and a first-person walkthrough. Its plans are concept layouts, not certified architectural, engineering, safety or code documents. Every docs page is also plain Markdown: add `.md` to its address (`https://floorplancraft.com/docs/.md`) or ask for it with `Accept: text/markdown`. Everything in one file: https://floorplancraft.com/llms-full.txt --- # What FloorPlanCraft is > A web floor planner for commercial spaces: draw the space, furnish it from catalogs made for your business, and see it in 3D. FloorPlanCraft is a floor planner that runs in your browser. You draw your space in 2D, furnish it from a catalog made for your kind of business, and look at the result in 3D or walk through it at eye level. ![The Olive & Oak restaurant template in the 3D view, with the mood panel, finish labels and the bar of themes, Golden light, time of day and Materials.](https://floorplancraft.com/docs/screenshots/view-3d.webp) ## What you can do - **Start fast** from a furnished template, a ready plan at a common size, or one blank room. See [Start a plan](https://floorplancraft.com/docs/start-a-plan.md). - **Draw** rooms, walls, doors, windows, floors and stairs in the 2D plan. See [Rooms and walls](https://floorplancraft.com/docs/rooms-and-walls.md). - **Furnish** from the catalog for your business: real branded products where the catalog has them, and generic concept models. See [Add and arrange items](https://floorplancraft.com/docs/add-and-arrange-items.md). - **Check** the layout as you work: the plan check flags overlapping items, blocked doorways and tight spaces. See [Plan check and clearances](https://floorplancraft.com/docs/plan-check-and-clearances.md). - **See it in 3D**: turn the model, paint walls and floors, and walk through it. See [Look at your plan in 3D](https://floorplancraft.com/docs/the-3d-view.md) and [Walk through your plan](https://floorplancraft.com/docs/walk-through-your-plan.md). - **Share** a view-only link, save a picture, or export the plan as PNG, PDF, SVG or JSON. See [Share and export a plan](https://floorplancraft.com/docs/share-and-export.md). - **Show it live**: with Live 3D, a connected restaurant, booking or play venue app shows its tables, bookings or play zones on your plan as they change. See [What Live 3D is](https://floorplancraft.com/docs/what-is-live-3d.md). ## Who it is for People who plan a business space and want to try a layout before they spend money on it. Each kind of space has its own starter plans and catalog, including: - Indoor playgrounds and soft play - Restaurants, cafés and commercial kitchens - Dental clinics, medical clinics, hospital units and labs - Classrooms and daycares - Home gyms, hair salons and offices - Shops, supermarkets, pharmacies and furniture showrooms - Warehouses and auto repair shops ## What a plan is, and is not A plan is a concept layout: a way to test sizes, spacing and flow, and to show the idea to your team, landlord or contractor. > **Warning:** A plan is not a certified architectural, engineering, safety, accessibility or building-code document. Its checks are planning guidance. Have a qualified professional review anything you build. ## What you need A web browser. You can try the planner without an account; saving a plan and sharing a link need one. See [Accounts and signing in](https://floorplancraft.com/docs/accounts-and-signing-in.md). Drawing rooms and walls needs a desktop or laptop. On a phone you can open plans, look at them in 3D, add items, change finishes and share. See [A tour of the planner](https://floorplancraft.com/docs/planner-tour.md#on-a-phone). ## Related - [Start a plan](https://floorplancraft.com/docs/start-a-plan.md) - [A tour of the planner](https://floorplancraft.com/docs/planner-tour.md) - [Look at your plan in 3D](https://floorplancraft.com/docs/the-3d-view.md) - [Plan check and clearances](https://floorplancraft.com/docs/plan-check-and-clearances.md) --- Source: https://floorplancraft.com/docs/what-is-floorplancraft · Updated 2026-11-07 --- # Start a plan > Open a furnished template, a ready plan at a common size, or one blank room, as a guest or signed in to your account. You can start a plan three ways: from a furnished template for your kind of business, from a ready plan at a common size, or from one blank room you size yourself. You don't need an account to start. ## Start from a template A template is a furnished starter plan for one kind of business, such as a [restaurant](https://floorplancraft.com/planner?template=restaurant&view=showcase), a [dental clinic](https://floorplancraft.com/planner?template=dental&view=showcase) or an [indoor playground](https://floorplancraft.com/planner?template=playground&view=showcase). It also decides which catalog **Add items** shows, so pick the one closest to your business. 1. On the website, open **Solutions** and pick a kind of space, or press **Explore the planner** to open the restaurant template. 2. The plan opens in the 3D view. Drag to turn it and scroll to zoom. 3. Press **Make it yours** at the top right to edit the plan in 2D. > **Note:** Looking at a template saves nothing. Once you change it, it is your plan, ready to save. ## Choose from the template gallery Inside the planner, the template gallery lists a starter for every kind of space. 1. Open **More** (⋯) in the top bar and choose **Templates**. On a new blank plan you can also press **Start from a template**. 2. Pick a card. The template your plan came from has a **Current template** badge. 3. Press **Use template**. To start empty instead, pick **Blank plan** and press **Create blank plan**. The plan you have open does not change. If it has unsaved changes, the button reads **Open in new tab**: the new plan opens in another tab and your changes stay where they are. ![The Choose a template dialog with the Restaurants card marked as the current template.](https://floorplancraft.com/docs/screenshots/template-gallery.webp) ## Start from a plan sized for your space [Floor plans by size](https://floorplancraft.com/floor-plans) has ready plans at common sizes, such as a 1,500 sq ft restaurant, a 3-chair dental clinic or a classroom for 25 students. Each is furnished from the catalog for its kind of space. 1. Open [Floor plans by size](https://floorplancraft.com/floor-plans) and choose a plan. 2. Press **Open this plan in the planner**. It opens in the 3D view. 3. Press **Make it yours** to edit it. Each size page also offers the plan as a PDF to download. ## Start with a blank room A blank plan asks one question, **How big is your space?**, and draws one room of that size. 1. Open a [blank plan](https://floorplancraft.com/planner?start=blank): **Start with a blank canvas** on the homepage, **Start blank plan** on the planner's first panel, **Start a blank plan** on [Floor plans by size](https://floorplancraft.com/floor-plans), **New plan** in the account bar, **Create plan** in your [plan library](https://floorplancraft.com/library), or **Blank plan** in the template gallery. 2. Type the size into **Width (m)** and **Length (m)**. In feet the fields read **Width (ft)** and **Length (ft)**. The card starts at 12 × 10 m. 3. Press **Create room**. The planner draws the room and says “Room created. Add items next.” Sizes run from 0.5 m to 100 m (1.64 ft to 328 ft). To draw the rooms yourself instead, press **Draw it myself**: the **Add room** tool starts. See [Rooms and walls](https://floorplancraft.com/docs/rooms-and-walls.md#add-a-room). ![A blank plan asking How big is your space?, with Width and Length fields, Create room and Draw it myself.](https://floorplancraft.com/docs/screenshots/blank-start-card.webp) > **Warning:** A blank plan always uses the indoor playground catalog, so **Add items** shows playground equipment. For a restaurant, clinic, shop or any other business, start from that business's template instead and change its rooms to fit your space. ## As a guest or signed in Without an account you get the whole editor. An account adds saving and a view-only link. | Feature | Guest | Signed in | | --- | --- | --- | | Draw, furnish, 3D and walkthrough | Yes | Yes | | Save image and every export | Yes | Yes | | Save the plan | No | Yes, as a new version each time | | View-only share link | No | Yes | | Where the plan lives | Only in the open browser tab | Your [plan library](https://floorplancraft.com/library) | > **Warning:** A guest's plan lives only in the open browser tab. Reload or close the tab and the plan is gone, after the browser warns you. An exported file cannot be opened in the planner again, so sign in before you close the tab if you want to keep working on the plan. To keep a guest plan, press the status chip that reads **Local draft · not saved**, or choose **Sign in** in **More**. Sign in or create an account in the same tab, and your draft reopens in the planner, ready to save. See [Accounts and signing in](https://floorplancraft.com/docs/accounts-and-signing-in.md#bring-a-guest-draft-with-you) and [Save your plan](https://floorplancraft.com/docs/saving-your-plan.md). ## Related - [A tour of the planner](https://floorplancraft.com/docs/planner-tour.md) - [Rooms and walls](https://floorplancraft.com/docs/rooms-and-walls.md) - [Add and arrange items](https://floorplancraft.com/docs/add-and-arrange-items.md) - [Save your plan](https://floorplancraft.com/docs/saving-your-plan.md) --- Source: https://floorplancraft.com/docs/start-a-plan · Updated 2026-11-07 --- # A tour of the planner > Find your way around the planner: the 2D, 3D and walkthrough views, the top bar, the tool bar, the drawers and the Inspect card. The planner shows one plan three ways. You do most of your work in the 2D plan; the 3D view and the walkthrough show the result, and you can still move items and paint there. ![The restaurant template in the 2D plan: the plan name, save status, 2D, 3D and Walkthrough, Plan check and Share along the top; the floor chip, tool bar and zoom controls along the bottom.](https://floorplancraft.com/docs/screenshots/planner-2d-tour.webp) ## Three views | View | What it is for | | --- | --- | | **2D** | The plan from above. Draw rooms, walls, doors and windows, place items, and change anything from its card. | | **3D** | A lit model of the current floor. Turn and zoom it, move items, paint walls and floors, preview themes and light, save a picture or present it. | | **Walkthrough** | Walk through the plan at eye level with the keyboard and mouse. On a phone it is called **Walk**. | Switch views with the three buttons at the top. **3D** and **Walkthrough** are unavailable while a review is open: apply or cancel it first. > **Note:** When you are signed in, leaving the 3D view or the walkthrough saves a plan that has unsaved changes. Looking at a template saves nothing. ## The top bar | Part | What it does | | --- | --- | | Logo | Goes to the homepage. The browser warns you first if the plan has unsaved changes. | | Plan name | Opens the plan file menu. Signed in, it holds **Plan name**, **Save plan** (or **Save changes**), **Save & share** and, for a shared plan, **Unshare…**. A guest sees **Sign in to save**. See [Save your plan](https://floorplancraft.com/docs/saving-your-plan.md). | | Status chip | Says whether the plan is saved. Press it to save, or as a guest to sign in. See [the status chip](#the-status-chip). | | **2D**, **3D**, **Walkthrough** | Switch views. | | **Undo** and **Redo** | Step back and forward through your changes, up to 100 steps. | | Plan check chip | Sums up the automatic layout checks. Press it for the list. See [the Plan check chip](#the-plan-check-chip). | | **Share** | Signed in, create a view-only link. As a guest, save a picture or sign in to get a link. Both can export the plan. See [Share and export a plan](https://floorplancraft.com/docs/share-and-export.md). | | **More** (⋯) | **Templates**, **Help and docs**, **Measurement units** (**Metres** or **Feet**) and, for a guest, **Sign in**. | ## The status chip | It says | What it means | | --- | --- | | **Local draft · not saved** | You are a guest. The plan lives only in this browser tab. | | **New plan · not saved** | You are signed in, and this plan has never been saved. | | **Unsaved changes** | The plan was saved and has changed since. | | **Saved** | Everything is saved. | | **Read-only**, then a reason | You can look at the plan and export it, but not change it. | In a narrow window the chip shortens to **Not saved**, **Unsaved**, **Saved** or **Read-only**. On a phone it is a coloured dot. ## The Plan check chip | It says | What it means | | --- | --- | | **Status: OK** | Nothing is flagged. | | **nothing to review** | There are only information notes. | | **2 to review** | Warnings to look at, marked amber. | | **1 blocking** | Problems such as overlapping items or a blocked doorway, marked red. | | **checking** | The clearance guidance is still loading. | | **clearance guidance unavailable** | The clearance guidance did not load. Open the chip and press **Try again**. | Press the chip to open the **Plan review summary**. It is not shown in the walkthrough. See [Plan check and clearances](https://floorplancraft.com/docs/plan-check-and-clearances.md). ## The tool bar In 2D the tool bar runs along the bottom, with the floor chip on its left and the zoom controls on its right. | Tool | What it does | | --- | --- | | **Select** | Select, move and resize what is on the plan. | | **Add room** | Place a rectangular room. See [Rooms and walls](https://floorplancraft.com/docs/rooms-and-walls.md). | | **Draw wall** | Draw a wall from point to point. A wall across a room divides it. | | **Draw zone** | Mark a rectangle of floor, such as a play area or a seating area. | | **Doors and windows** | Add a door or a window to a wall. See [Doors, windows and exits](https://floorplancraft.com/docs/doors-windows-and-exits.md). | | **More tools** (⋯) | **Identify room**, **Place column**, **Place stair**, **Venue size** and **Floor settings**. | | **Add items** | Open the catalog to place furniture and equipment. See [Add and arrange items](https://floorplancraft.com/docs/add-and-arrange-items.md). | | **Finishes** | List every room's walls and floor, its zones and the outside walls, so you can pick one and change its finish. See [Paint walls and change floors](https://floorplancraft.com/docs/materials-and-paint.md). | The floor chip shows the current floor; open it to switch floors or add one (see [Floors and stairs](https://floorplancraft.com/docs/floors-and-stairs.md)). The zoom controls hold **Zoom out**, the zoom level (press it to reset the view), **Zoom in**, **Pan view** and **View options** (see [Columns, zones, venue size and the view](https://floorplancraft.com/docs/more-drawing-tools.md)). While a tool is on, a card above the tool bar says what to do next and offers **Cancel** (`Esc`). Messages appear above it and fade after a few seconds; a refusal stays until your next action. A change made from a card offers **Undo** beside its message. ## Drawers and the Inspect card **Add items**, **Finishes**, **Venue size** and **Floor settings** open in a drawer on the left, one at a time. Close it with its close button, or press `Esc` while you are working in it. Select anything on the plan and its card opens on the right. The card's title says what you selected: an item, room or zone by its name; a wall as **Exterior wall**, **Interior wall** or **Partition wall**; or **Door**, **Window**, **Column** or **Stairs**. The line under the title gives its kind and place, such as the room an item stands in. Close the card with **Close inspector**, or click an empty part of the plan. In a narrower window the drawer and the card take turns on screen. ## The 3D view and the walkthrough In **3D**, drag to turn the model and scroll or pinch to zoom. **Reset view** at the top right goes back to the opening view. Click an item to select it, or drag it along the floor to move it. The bar along the bottom holds the theme and time-of-day previews, **Golden light**, **Materials** for painting, **Save image** and **Present**. See [Look at your plan in 3D](https://floorplancraft.com/docs/the-3d-view.md). In the **Walkthrough**, the walk starts on its own and takes over the mouse (if the bar shows **Start walking**, press it first). Move with W A S D or the arrow keys and look around with the mouse. `Esc` pauses and gives you the mouse back. To leave, choose **2D** or **3D** in the top bar. See [Walk through your plan](https://floorplancraft.com/docs/walk-through-your-plan.md). ## On a phone - The drawing tools are hidden: drawing needs a larger screen. **Select**, **Add items**, **Finishes** and **More** stay in the bottom bar. - **More** also holds **Redo**, **View options…**, **Floors…**, **Plan check…** and **Plan file…**, and in 3D, **Present**, **Save image** and **Golden light**. - The card opens as a sheet from the bottom of the screen. Press **Show all details** to see all of it. - The status chip is a coloured dot, and **Walkthrough** is called **Walk**. ## Related - [Start a plan](https://floorplancraft.com/docs/start-a-plan.md) - [Keyboard shortcuts](https://floorplancraft.com/docs/keyboard-shortcuts.md) - [Rooms and walls](https://floorplancraft.com/docs/rooms-and-walls.md) - [Look at your plan in 3D](https://floorplancraft.com/docs/the-3d-view.md) --- Source: https://floorplancraft.com/docs/planner-tour · Updated 2026-11-07 --- # Keyboard shortcuts > Every keyboard shortcut in the planner, grouped by where it works: the 2D plan, the item card, the 3D view, painting and the walkthrough. Shortcuts work while the focus is in the planner, not while you type in a field. On a Mac, press `⌘` where this page says `Ctrl`. ## Everywhere in the planner | Keys | What they do | | --- | --- | | `Ctrl` + `Z` | Undo. | | `Ctrl` + `Shift` + `Z`, or `Ctrl` + `Y` | Redo. | | `Esc` | Closes an open menu, cancels a review or leaves the tool you are using. In 2D it works one step at a time: see below. | Undo and redo don't work while you present the plan. ## The 2D plan | Keys | What they do | | --- | --- | | `Esc` | One step per press: ends a drag, cancels an open review, clears a wall's start point or a zone's first corner, leaves the tool, then clears the selection (with the plan focused) or closes the drawer (with the focus in it). | | `Delete` | Opens the removal review for what you selected. Nothing is removed until you confirm. Works with **Select** on. | | `Tab` | With the plan focused, moves between rooms, walls, doors, windows, columns, stairs and items. | | `Enter` or `Space` | Selects the object that has the focus. | | `R` | Turns the item you are placing to its next allowed angle, with the plan focused. | | `↑` `↓` `←` `→` | Move a focused resize handle of a room, wall, door or window by one grid step, or 10 mm with **Snap to grid** off. With **Pan view** on and the plan focused, they move the view. | | `Ctrl` + mouse wheel | Zooms in or out at the pointer. | ## The rotation dial On an item's card, with the **Rotation** dial focused: | Keys | What they do | | --- | --- | | `→` or `↑` | Turns the item clockwise to its next allowed angle. | | `←` or `↓` | Turns it anticlockwise. | | `Home` or `End` | Jumps to the first or the last allowed angle. | | `Esc` | While you drag the needle, puts it back. | ## The 3D view | Keys | What they do | | --- | --- | | `↑` `↓` `←` `→` | Turn and tilt the view. | | `+` or `=`, and `-` | Zoom in and out. | | `Home` | Goes back to the opening view, like **Reset view**. | | `Enter` or `Space` | Selects the item in the middle of the view. | | `F` | Starts or ends **Present**, with the focus in the 3D view or on the view buttons. | | `Esc` | Leaves Present. With an item selected, lets it go. | | `←` `→`, `Home` `End` | On a selected item's toolbar, move between its buttons. | More about the 3D view in [Look at your plan in 3D](https://floorplancraft.com/docs/the-3d-view.md). ## Materials, themes and time | Keys | What they do | | --- | --- | | `←` `→`, `Home` `End` | In **Materials**, move between the finish tiles. | | `Esc` | In **Materials**, one step per press: ends a drag, closes the choice of where to apply a finish, puts the picked finish down, then closes the palette. | | Arrow keys | On the theme choices, move to the next or the previous theme. | | Arrow keys | On the **Time of day** slider, move by 5 minutes. | | `Page Up` or `Page Down` | On the **Time of day** slider, jump to the next or the previous preset. | More about painting in [Paint walls and change floors](https://floorplancraft.com/docs/materials-and-paint.md). ## The walkthrough | Keys | What they do | | --- | --- | | `W` and `S`, or `↑` and `↓` | Walk forward and back. | | `A` and `D`, or `←` and `→` | Step left and right. | | Mouse | Look around while the walk has the mouse. | | `Esc` | Pauses the walk and gives you the mouse back. Press **Resume** to go on. | More about walking in [Walk through your plan](https://floorplancraft.com/docs/walk-through-your-plan.md). ## Related - [A tour of the planner](https://floorplancraft.com/docs/planner-tour.md) - [Look at your plan in 3D](https://floorplancraft.com/docs/the-3d-view.md) - [Walk through your plan](https://floorplancraft.com/docs/walk-through-your-plan.md) - [Rooms and walls](https://floorplancraft.com/docs/rooms-and-walls.md) --- Source: https://floorplancraft.com/docs/keyboard-shortcuts · Updated 2026-11-07 --- # Rooms and walls > Place and size rooms, let rooms share walls, join or delete rooms, draw walls that divide a room, and change a wall from its card. Rooms are the building blocks of a plan. Add a room, size it, and place the next one against it so the two share a wall. Use **Draw wall** to divide a room or to add a wall of its own. All of this happens in the 2D plan. ## Add a room 1. Press **Add room** in the tool bar. 2. Move the pointer over the plan. The outline of a 4 × 4 m room follows it. It snaps to the grid, or to a free spot when the grid would put it on a wall. 3. Click to place the room. The planner goes back to **Select** with the new room selected. Where a room can't go, the outline turns red and the notice at the foot of the plan says why. Press `Esc` or **Cancel** to stop without placing a room. When the floor already has rooms, the card also offers **Divide this room**, which switches to **Draw wall**. ## Shared walls Place a new room against an existing one and the two share one wall. When the outline comes within 0.3 m of a room's wall, it snaps against it and the notice reads “Shares a wall with” and that room's name. A door already in the shared wall then connects the two rooms. A room can't overlap another room or cross its walls, and it can't block a doorway. The outline turns red and the notice says what to do instead, for example “Room walls overlap. Place the room against the wall to share it, or leave space between rooms.” A shared wall belongs to both rooms. Its side can't move, and rooms that share a wall can't be moved as a whole: resize their other sides instead. ## Resize and move a room Click a room's floor to select it. Then: - Drag the floor to move the room. - Drag one of the eight square handles on its corners and sides to resize it. A greyed-out handle belongs to a side that is part of another wall; point at it to see why it can't move. - Focus a handle and press the arrow keys to move that side by one grid step, or by 10 mm with **Snap to grid** off. - Click the size label next to the room to type exact sizes on its card. Each change is one undo step: “Room updated. Undo restores the previous room.” ![A room selected in 2D, its card showing Room name, Room size and Finish.](https://floorplancraft.com/docs/screenshots/room-card.webp) ## The room card | Part | What it does | | --- | --- | | **Room name** | Renames the room. | | **Room size** | For a rectangular room: **Inside width (m)** and **Inside depth (m)** with **Apply**, and under **Position**, **Room X (m)** and **Room Y (m)**. Sizes run from 0.5 m to 100 m. | | **Finish** | The finish of the room's **Floor** or **Ceiling**. See [Paint walls and change floors](https://floorplancraft.com/docs/materials-and-paint.md). | | **Use as walkthrough start** | The walkthrough starts in this room. Press **Clear walkthrough start** to undo it. See [Walk through your plan](https://floorplancraft.com/docs/walk-through-your-plan.md#choose-where-the-walk-starts). | | **Join to** … | One button for each side that stands back to back with another room. See below. | | **Delete room** | Removes the room and what is in it. | ## Join two rooms When two rooms stand back to back, each with its own wall, the room's card shows **Join to** and the other room's name. Joining replaces the double wall with one shared wall, and the selected room grows to meet it. The message says by how much, for example “Joined Kitchen to Dining room. Kitchen is now 0.3 m wider inside.” ## Delete a room **Delete room** removes the room straight away, with its outside walls and their doors and windows, any free-standing walls inside it, and the items inside it. Walls it shares with other rooms stay. The message lists what went, for example “Deleted Kitchen, its door and 3 items. Undo restores them.” If the room held the plan's last exit, it adds “The plan has no exit now.” There is no confirmation step: press **Undo** to bring everything back. ## Draw a wall 1. Press **Draw wall** in the tool bar. 2. Click where the wall starts. The message reads “Start point set. Click the wall end point.” 3. Click where the wall ends. The planner goes back to **Select** with the new wall selected. Points snap to the grid while **Snap to grid** is on. A wall from one side of a room to the other divides the room in two, as one undo step, and the message names the new room. If the planner can't tell which side should keep the room's name, finishes and walkthrough start, it asks you to click inside that side; **Cancel room split** backs out. The first `Esc` clears the start point; the second leaves the tool. ## The wall card Click a wall to select it. The card's title says what kind of wall it is, **Exterior wall**, **Interior wall** or **Partition wall**, with the room or rooms it belongs to underneath. | Part | What it does | | --- | --- | | **Finish** | Paint, wallpaper or a print, for each face of the wall. See [Paint walls and change floors](https://floorplancraft.com/docs/materials-and-paint.md). | | **Add to this wall** | **Add door** or **Add window**, in the middle of the wall. See [Doors, windows and exits](https://floorplancraft.com/docs/doors-windows-and-exits.md). | | **Size and position** | **Wall thickness**, **Wall height source** (the floor's ceiling, or **Custom wall height**) and **Move wall**. | | A review button | At most one, such as **Review room merge** or **Review deletion**. Nothing changes until you apply it in the review. | ![An exterior wall selected in 2D, its card showing Add door, Add window and the open Size and position section.](https://floorplancraft.com/docs/screenshots/wall-card.webp) To make a wall longer or shorter, drag the handle at either end, or focus it and use the arrow keys. The label beside it shows the new length, or **Cannot resize here**. To move a wall, or one of its ends, to exact coordinates, open **Size and position** and use **Move wall**. Choose a **Move target** (**Start junction**, **End junction** or **Whole wall**), enter the new position or the distance to move, and press **Review move**. The review lists the walls, doors and rooms affected: press **Apply move** or **Cancel**. **Review room merge** appears on a wall between two rooms. Applying it removes the wall and makes one room; you choose which room's name and settings carry on, and **Undo** brings both rooms back. > **Note:** While a review is open, saving, sharing, exporting, the other views and **Undo** are unavailable until you apply or cancel it. `Esc` cancels it. ## Identify a room Walls you draw yourself can close in an area that is not a room yet. Open **More tools** (⋯), choose **Identify room** and click inside the closed walls. The area becomes a room you can name on its card. If the area is already a room, the planner selects it instead. ## Related - [Doors, windows and exits](https://floorplancraft.com/docs/doors-windows-and-exits.md) - [Floors and stairs](https://floorplancraft.com/docs/floors-and-stairs.md) - [Columns, zones, venue size and the view](https://floorplancraft.com/docs/more-drawing-tools.md) - [Paint walls and change floors](https://floorplancraft.com/docs/materials-and-paint.md) --- Source: https://floorplancraft.com/docs/rooms-and-walls · Updated 2026-11-07 --- # Doors, windows and exits > Add doors and windows to walls, choose a door's type and swing, size and move openings, and mark a door as an exit. Doors and windows sit in walls. Add one from the tool bar or from a wall's card, then set its type, size and place on the wall from its own card. ## Add a door or a window 1. Press **Doors and windows** in the tool bar and choose **Doors** or **Windows**. 2. Click the wall you want. The card above the tool bar reads “Add a door to this wall.” 3. Press **Add door** (or **Add window**). It goes in the middle of the wall and is selected. Quicker: select a wall and press **Add door** or **Add window** on its card. | Opening | Starts as | Needs | | --- | --- | --- | | Door | 900 mm wide and 2,100 mm high | A wall at least 1.3 m long | | Window | 1,200 × 1,200 mm, with its sill 900 mm above the floor | A wall at least 1.6 m long and 2.1 m high | If the wall is too short or too low, the message says so and nothing is added. ## Choose the door type Select a door to open its card. Under **Door type**: - **Door operation**: **Swing / sliding** or **Overhead door**. - For a swing or sliding door, pick **Single left**, **Single right**, **Double door** or **Sliding door**, then the **Door swing direction**: **Open inward** or **Open outward**. - For an overhead door, pick the **Overhead door style** (**Sectional**, **Roll-up** or **Dock**) and the **Overhead door position** (**Closed** or **Raised**). Each choice changes the door at once, as one undo step. ![A door selected in 2D, its card showing the door type, swing direction, size and position, Mark as exit and Finish.](https://floorplancraft.com/docs/screenshots/door-card.webp) ## Size and move a door or window - Drag a door or window along its wall to move it. - Drag either end handle to make it wider or narrower, or focus a handle and use the arrow keys. - Or type exact values under **Size and position**: **Wall offset**, the distance from the wall's start, and **Opening width**. Windows and overhead doors also have **Opening height**, and windows **Sill height**. A door or window has to fit inside its wall, and two openings in the same wall can't overlap: “Openings cannot overlap. Leave space between the door and window.” ## Keep doorways clear The plan check keeps an approach clear on both sides of every door. An item, column or stair standing in it is a blocking issue: “Door opening and both approach areas must remain traversable.” Where the depth kept clear is the planner's own default, **Space around** on an item's card says so: it is not a published standard. A new room can't be placed in front of a doorway either. Every room also needs a route through clear doorways from a door in an outside wall. A room without one is flagged as blocking, and so is a plan with no door to the outside. See [Plan check and clearances](https://floorplancraft.com/docs/plan-check-and-clearances.md). ## Mark a door as an exit 1. Select the door. 2. Under **Exit**, press **Mark as exit**. The door gets an **EXIT** marker on the 2D plan and the label “Exit”, which you can change in **Exit label**. The plan check then looks for a route from an entrance to each exit in an outside wall. Windows can't be marked as exits. To take the marking off, press **Remove exit designation**, then **Remove designation** in the review. Only the marking goes; the door stays. > **Warning:** An exit marker is a planning note, not an egress or fire design. Have a qualified professional plan and review exits and escape routes. ## Remove a door or window Press **Remove opening** on its card, or `Delete`. A review shows what changes: press **Remove opening** again to confirm, or **Cancel**. A door marked as an exit needs its exit marking removed first. ## Related - [Rooms and walls](https://floorplancraft.com/docs/rooms-and-walls.md) - [Plan check and clearances](https://floorplancraft.com/docs/plan-check-and-clearances.md) - [Columns, zones, venue size and the view](https://floorplancraft.com/docs/more-drawing-tools.md) --- Source: https://floorplancraft.com/docs/doors-windows-and-exits · Updated 2026-11-07 --- # Floors and stairs > Add floors to a building, set each floor's name, elevation and ceiling height, and connect floors with stairs you can walk. A plan can have several floors, and you draw each one on its own in 2D. Stairs connect them, and the walkthrough can climb them. ## Switch floors The floor chip at the bottom left shows the floor you are on. Open it and pick another floor. In the 3D view of a plan with more than one floor, the chip also offers **Whole building**, a plain 3D view of every floor at once. See [Look at your plan in 3D](https://floorplancraft.com/docs/the-3d-view.md#see-every-floor-at-once). ![The floor menu of a two-storey café, listing Ground floor and First floor, with Add floor and Floor settings.](https://floorplancraft.com/docs/screenshots/floor-chip.webp) ## Add a floor 1. Open the floor chip and choose **+ Add floor**. 2. The new floor goes above the top floor and **Add room** starts, so you can place its first room. A building can have up to 32 floors. **Undo** removes a new floor. To start from a copy instead, open **Floor settings** on the floor you want to copy and press **Duplicate this floor**. The copy gets the rooms, furniture and finishes, with their walls, doors, windows, zones and columns. Stairs are not copied: add them separately. ## Floor settings Open **Floor settings** from the floor chip or from **More tools** (⋯). It shows the floor you are on: | Field | What it sets | | --- | --- | | **Floor name** | The name the floor chip and the cards use. | | **Floor elevation (m)** | How high the floor's level is. Each floor needs a different elevation. | | **Floor ceiling height (m)** | The ceiling height. Walls that follow the ceiling change with it. | | **Duplicate this floor** | Adds a copy of this floor. | Press **Apply** to make the change, as one undo step. The ceiling has to stay above the top of every door and window in the walls that follow it. ## Place a stair A stair needs another floor to lead to, at a different elevation. Until there is one, **Place stair** is greyed out and **More tools** offers **Set up stair destination** instead. 1. Go to the floor the stair starts on. 2. Open **More tools** (⋯) and choose **Place stair**. The card names the floor it leads to: the nearest other floor. 3. Click inside the room where the stair goes. When the stair fits, it goes inside the room you clicked, clear of the walls. Its length grows with the height between the floors and is never shortened to fit, so if it doesn't fit, the message says so and suggests turning it or using a larger room. ![Stairs selected on a two-storey café: the card says they are connected and walkable, with Destination level and the footprint fields.](https://floorplancraft.com/docs/screenshots/stairs-card.webp) ## The stairs card The card's first line says whether the stair can be walked: “Connected and walkable …” or “Not walkable yet …”. To make a stair walkable, give both floors a room where it lands, keep both landings clear and lined up, and give it enough width and length for the height between the floors. | Part | What it does | | --- | --- | | **Destination level** | The floor the stair leads to. | | **Footprint** | **Footprint anchor X** and **Footprint anchor Y**, **Stair footprint width** and **Stair footprint depth**, and **Stair rotation (degrees)**. | | **Review stair deletion** | Opens a review; **Delete stair** removes the stair. | The steps, the landings and the opening in the floor follow the stair's size. In the walkthrough, walk onto a connected stair to change floors: see [Walk through your plan](https://floorplancraft.com/docs/walk-through-your-plan.md). > **Note:** The stair models in **Add items** are pictures only: they don't connect floors. Use **Place stair** for a stair you can walk. > **Warning:** Stairs in a plan are concept geometry, as the card says: “Concept only; professional review required.” Have a qualified professional design and review any real stair. ## Destination levels **Floor settings** has an **Advanced stair destinations** section, which **Set up stair destination** opens for you. **Add destination level…** asks for a **Level name**, an **Elevation (m)** and a **Ceiling height (m)**, then **Add level** adds that floor. It shows in the floor chip like any other floor, ready for a stair to lead to. Each level in the list has two buttons, **Edit** and **Review removal for**, each followed by the level's name. They work only while that floor is still empty; **Remove level** in the review takes the level away. ## Related - [Rooms and walls](https://floorplancraft.com/docs/rooms-and-walls.md) - [Columns, zones, venue size and the view](https://floorplancraft.com/docs/more-drawing-tools.md) - [Walk through your plan](https://floorplancraft.com/docs/walk-through-your-plan.md) - [Look at your plan in 3D](https://floorplancraft.com/docs/the-3d-view.md) --- Source: https://floorplancraft.com/docs/floors-and-stairs · Updated 2026-11-07 --- # Columns, zones, venue size and the view > Place columns, mark zones, resize the whole venue, and control the 2D view: zoom, pan, the grid, snapping and what is shown. Besides rooms and walls, the 2D plan has tools for columns and zones, a way to resize the building's outside walls, and controls for the view itself. ## Place a column 1. Open **More tools** (⋯) and choose **Place column**. 2. Click the plan where the column stands. Select the column to change it on its card: **Column shape** (**Rectangle** or **Circle**), **Column height**, **Column X position** and **Column Y position**, and **Column width** and **Column depth**, or **Column diameter** for a round one. To remove it, press **Review column deletion**, then **Delete column**. The plan check flags an item or a stair that overlaps a column, and a column in a door's approach, as blocking. ## Mark a zone A zone marks part of a floor, such as a play area, a seating area or a waiting area, with its own name and floor finish. 1. Press **Draw zone** in the tool bar. 2. Drag a rectangle on the plan, or click two opposite corners. The new zone is named **Zone** and a number. On its card you can change its **Zone name** and **Finish**. To change its shape, press **Edit boundary**. Each corner has its own fields, such as **Vertex 1 X** and **Vertex 1 Y**, and buttons such as **Insert after vertex 1** and **Remove vertex 1**; a zone keeps at least three corners. Press **Apply boundary** to use the new shape, or **Cancel**. To remove a zone, press **Review zone removal**, then **Remove zone**. ## Resize the venue **Venue size** changes the outside size of the building on the floor you are on, while one corner stays where it is. 1. Open **More tools** (⋯) and choose **Venue size**. The drawer shows the **Current outside dimensions**. 2. Under **Resize shell**, type the **Outside width (m)** and **Outside depth (m)**, and choose the corner that stays put in **Keep corner fixed**: **Top left**, **Top right**, **Bottom left** or **Bottom right**. 3. Check the diagram: solid is the current outline, dashed is the new one, and the dot marks the fixed corner. 4. Press **Review resize**. The review lists the walls, doors, windows and rooms that change. Press **Apply resize**, or **Cancel**. Items, zones, columns and stairs stay where they are. If the new size won't work, for example because something would end up outside the walls, the message says why and nothing changes. > **Note:** Venue size works when the floor's outside walls form one rectangle with an even thickness on each side. Otherwise the drawer explains why it can't resize. ![The Venue size drawer with a larger outside width typed in and a diagram of the current and proposed outline.](https://floorplancraft.com/docs/screenshots/venue-size-panel.webp) ## Zoom and pan | Control | What it does | | --- | --- | | **Zoom in** and **Zoom out** | Zoom between 100% and 400%, a quarter at a time. | | The zoom level, such as **100%** | **Reset view**: back to the whole plan at 100%. In a narrow window it shows an icon instead. | | **Pan view** | While it is on, drag the plan to move it around, or press the arrow keys with the plan focused. Turn it off to edit again. | | `Ctrl` + mouse wheel | Zooms in or out at the pointer. | ## View options **View options**, at the end of the zoom controls, holds: | Option | What it does | | --- | --- | | **Show structure** | Shows or hides everything except the items: walls, rooms, doors, windows, zones, columns and stairs. While it is off, the drawing tools and painting are unavailable. | | **Show items** | Shows or hides the items. While it is off, you can't place items. | | **Show grid** | Shows or hides the grid. | | **Snap to grid** | Rooms, walls, items and handles snap to the grid as you place and move them. | | **Grid spacing** | The size of a grid step, in the unit you use. | These settings belong to the plan: they are saved with it, and **Undo** reverses them. The 3D view has its own view options for walls and room labels; see [Look at your plan in 3D](https://floorplancraft.com/docs/the-3d-view.md#choose-how-walls-show). ![The 2D View options panel: Show structure, Show items, Show grid, Snap to grid and Grid spacing.](https://floorplancraft.com/docs/screenshots/view-options-2d.webp) ## Metres or feet Open **More** (⋯) and choose **Metres** or **Feet** under **Measurement units**. Every field, label and size follows, and this browser remembers the choice. Switching units doesn't resize anything. ## Related - [Rooms and walls](https://floorplancraft.com/docs/rooms-and-walls.md) - [Floors and stairs](https://floorplancraft.com/docs/floors-and-stairs.md) - [Keyboard shortcuts](https://floorplancraft.com/docs/keyboard-shortcuts.md) - [A tour of the planner](https://floorplancraft.com/docs/planner-tour.md) --- Source: https://floorplancraft.com/docs/more-drawing-tools · Updated 2026-11-07 --- # Add and arrange items > Place furniture and equipment from your plan's catalog, then move, turn, duplicate, align and remove items on the plan or from the item card. Items are the furniture, fixtures and equipment in your plan. They come from the catalog of your plan's kind of business, and each one keeps the size of its catalog item. > **Note:** The catalog comes with the plan. A blank plan uses the indoor playground catalog; for a restaurant, clinic, shop or any other business, start from that business's template so **Add items** shows its items. See [Start a plan](https://floorplancraft.com/docs/start-a-plan.md). ## Find an item 1. In the 2D plan, press **Add items** in the tool bar. The library opens in the drawer on the left. 2. Press a category to browse it, or **Browse all** to see every item. To search, type in the box at the top, which reads **Search** and the number of items. 3. In a category, buttons with each family's name and count narrow the list. **Categories** takes you back. Where a catalog has real products from several brands, the **Brand: Any** menu filters them, and **Generic** shows only the generic concept models. Each tile shows the item's name, its brand (or **Generic**, where the catalog mixes both) and its footprint. The list shows 12 items at a time: scroll, or press **Load more equipment**. ![The Add items drawer of a restaurant plan: a search box over 1,023 items and category cards such as Storage, Tables and Seating.](https://floorplancraft.com/docs/screenshots/add-items-library.webp) ## Place an item 1. Press an item's tile. The card on the right is titled **Placing** and the item's name. 2. Move the pointer over the plan. A coloured outline of the item follows it, snapped to the grid while **Snap to grid** is on. 3. To turn it, press `R` or **Rotate preview**. Both work only for items that can stand at more than one angle. 4. Click the plan to place the item. | Outline | The card says | What it means | | --- | --- | --- | | Green | **Fits here** and the position | The plan check flags nothing about the item there. | | Amber | **Can place here · review** and a count | It can go there, but the plan check will flag something about it. | | Red | **Cannot place here · choose another point** | The catalog's rules don't allow it there, and a click won't place it. | Once the item is placed, the planner goes back to **Select** with the new item selected, and the message says whether the plan check found warnings or blocking issues. To place another, press its tile again. **Cancel** or `Esc` stops placing. On a touch screen, tap the plan to place the item. **Model details** on the placing card shows the item from above, a 3D model behind **Show 3D model**, and its product sheet or its size. ![An item being placed in an empty room: its outline on the plan, and the Placing card reading Fits here with the item's position.](https://floorplancraft.com/docs/screenshots/placing-item.webp) *A blank plan uses the indoor playground catalog, so this item is play equipment.* ## Move and turn an item - Drag an item with **Select** on to move it. It snaps to the grid while **Snap to grid** is on, and its outline turns the same colours as when you place it. - Or type its position into **X** and **Y** on its card. - Turn it with the **Rotation** dial on its card: drag the needle, press one of the two turn buttons beside it, or focus the dial and use the arrow keys. The needle points the way the item's front faces; 0° faces the top of the plan. - **Rotate**, on the toolbar that appears with the selected item on the plan, turns it to its next allowed angle. - In the 3D view, drag an item along the floor to move it, or click it for a toolbar with a rotate button, **Duplicate**, **Swap**, **Finish** and **Remove**. See [Look at your plan in 3D](https://floorplancraft.com/docs/the-3d-view.md#move-and-change-items-in-3d). Items stop only at the angles their catalog allows. With a single allowed angle the dial says **The only allowed angle**; an item standing at an angle its catalog doesn't allow says **Not an allowed angle** until you turn it. ## The item card Click an item to open its card. The title is the item's name, with its category and room underneath. | Section | What it holds | | --- | --- | | **Position** | **X**, **Y**, the **Rotation** dial and the **Space around** switch. See [Plan check and clearances](https://floorplancraft.com/docs/plan-check-and-clearances.md#space-around). | | **Size** | Width, depth and height. Sizes follow the exact catalog item, and most can't be changed. | | **Finish** | The finish colours this catalog offers, and **Reset**. See [Paint walls and change floors](https://floorplancraft.com/docs/materials-and-paint.md). | | **Swap for a similar item** | Trade it for a similar item in the same spot. See [Swap an item](https://floorplancraft.com/docs/swap-an-item.md). | | **Align with another item** | Line it up with another item on the same floor. | | **More properties** | The angles the catalog allows, and buttons to duplicate or remove the item, named with your plan's word for an item, such as **Duplicate furniture item**. | | **Product details** | For a real product: its brand, published size, sources and a **View at** link to the retailer. | ![A table selected in 2D, with Rotate, Duplicate, Swap and Delete above it, and its card showing position, the rotation dial, size and finish.](https://floorplancraft.com/docs/screenshots/item-card.webp) ## Duplicate an item Press **Duplicate** on the selected item's toolbar, on the plan or in 3D, or the duplicate button in the card's **More properties**. The copy appears beside the original with a gap of one grid step, with the same size, angle and finish, and is selected. ## Align items 1. Select the item you want to move. 2. Open **Align with another item** on its card and choose the **Reference item**. 3. Press **Left edges**, **Horizontal centers**, **Right edges**, **Top edges**, **Vertical centers** or **Bottom edges**. Only the selected item moves; the reference item stays where it is. ## Remove an item 1. Select the item and press `Delete`, or **Delete** on its toolbar on the plan, **Remove** on its 3D toolbar, or the remove button in the card's **More properties**. 2. A review opens. It shows the item, its floor, position, angle, size and finish, and how the plan check counts change. 3. Press the remove button, such as **Remove furniture item**, to confirm, or **Cancel**. Nothing is removed until you confirm, and one **Undo** brings the item back. ## Words differ by business Buttons and messages use your plan's word for an item, so the same button can read differently from one plan to another: | Plan | An item is called | | --- | --- | | Restaurants, cafés, dental clinics, classrooms, daycares and offices | furniture item | | Indoor playgrounds, blank plans, medical clinics, hospital units, labs, commercial kitchens, warehouses and auto repair shops | equipment item | | Home gyms | equipment | | Hair salons, boutiques, supermarkets, pharmacies and furniture stores | fixture | For example, the removal button reads **Remove furniture item** in a restaurant plan and **Remove fixture** in a shop. ## Related - [Swap an item](https://floorplancraft.com/docs/swap-an-item.md) - [Plan check and clearances](https://floorplancraft.com/docs/plan-check-and-clearances.md) - [Start a plan](https://floorplancraft.com/docs/start-a-plan.md) - [Keyboard shortcuts](https://floorplancraft.com/docs/keyboard-shortcuts.md) --- Source: https://floorplancraft.com/docs/add-and-arrange-items · Updated 2026-11-07 --- # Swap an item > Trade an item for a similar one from the same catalog without moving it: same spot, same facing, one undo step for each swap. Swap replaces the selected item with a similar one, in the same spot and facing the same way. Use it to try another chair, table or machine without placing it again. ## Swap an item 1. Select the item, in the 2D plan or the 3D view. 2. Press **Swap** on the toolbar that appears with it, or open **Swap for a similar item** on its card. 3. Press one of the tiles. The item changes at once. The panel stays open, so you can try one item after another. Each swap is one undo step, and the message after it offers **Undo**. ![A chair selected, its card open on Swap for a similar item, with other chairs to choose from.](https://floorplancraft.com/docs/screenshots/swap-panel.webp) ## What Swap offers The panel, headed **Swap for a similar item · same spot, same facing**, shows up to 24 items from your plan's catalog, each with a picture, its name and its footprint: - first, items of the same kind, such as other chairs for a chair; - then, when there are fewer than three of those, the other items in the same category. When the catalog has nothing similar, Swap doesn't appear for that item. ## What changes and what stays - **The spot stays.** The new item stands where the old one stood. - **The facing stays** when the new item's catalog allows that angle. Otherwise it turns to its first allowed angle. - **The size changes.** The new item has its own catalog size, so check the space around it. A swap is checked like any other change. If the catalog's rules don't accept the new item there, nothing changes and the message says why. If the swap leaves blocking issues, the message ends with “Review the blocking issues below.” > **Tip:** A bigger item can end up against a neighbour or in a doorway. Open **Space around** on its card to see the gaps, or press the Plan check chip. See [Plan check and clearances](https://floorplancraft.com/docs/plan-check-and-clearances.md). ## Related - [Add and arrange items](https://floorplancraft.com/docs/add-and-arrange-items.md) - [Plan check and clearances](https://floorplancraft.com/docs/plan-check-and-clearances.md) - [Look at your plan in 3D](https://floorplancraft.com/docs/the-3d-view.md) --- Source: https://floorplancraft.com/docs/swap-an-item · Updated 2026-11-07 --- # Plan check and clearances > Read the plan check: what blocking issues, warnings and info notes mean, how Space around shows and fixes gaps, and why it is guidance only. As you work, the planner runs automatic layout checks on your plan: overlapping items, blocked doorways, rooms no doorway reaches, and clearance guidance where your catalog has it. The Plan check chip in the top bar sums them up, and **Space around** on an item's card shows the gaps around one item. > **Warning:** The plan check is automated planning guidance, not a code, safety or accessibility review. A plan with nothing flagged is still a concept plan: have a qualified professional review it before you build, fit out or buy anything. ## The Plan check chip | It says | What it means | | --- | --- | | **Status: OK** | Nothing is flagged. | | **nothing to review** | There are only information notes, with nothing to fix. | | **3 to review** | Warnings to look at, marked amber. | | **1 blocking** | Blocking issues to fix, marked red. | | **checking** | The clearance guidance is still loading. Blocking issues show in the meantime. | | **clearance guidance unavailable** | The clearance guidance didn't load. The other checks still ran. | The chip shows in 2D and 3D, not in the walkthrough. In a narrow window it shows only the count; on a phone, open it from **More** → **Plan check…**. ## The Plan review summary Press the chip to open the **Plan review summary**: - A count line, such as “0 blocking · 2 warnings · 1 info”. - The findings, blocking ones first. Each starts with the place it is about, such as an item's name, a wall and its room, or “Opening 2”, then says what is wrong. - The first six findings show; a **Show all** button with the total lists the rest. - **Try again**, when the clearance guidance didn't load. - “No automatic findings.” when there is nothing to list. ![The Plan review summary after a table was moved too close to its neighbour: one blocking issue and one warning, with the planning-guidance note.](https://floorplancraft.com/docs/screenshots/plan-check-popover.webp) ## Blocking issues, warnings and info | Kind | What it means | Examples | | --- | --- | --- | | Blocking | A problem with the layout itself. Fix it before you rely on the plan. | “Item footprints must not overlap.” “Door opening and both approach areas must remain traversable.” “Item footprint overlaps solid wall geometry.” A room that no clear doorway reaches. | | Warning | Something to look at, usually a clearance figure from a published source. | “Keep 1.83 m (6 ft) clear around play equipment (US CPSC playground handbook). Guidance, not a compliance check.” | | Info | A note, not a problem. | The planner tidied a value, such as an item's angle. | No finding stops you from saving, sharing or placing items. When a change leaves blocking issues, its message ends with “Review the blocking issues below.” Clearance figures come with the catalog, and each warning names its source. Clearance guidance is always a warning, never a blocking issue. ## Space around **Space around** shows the gaps around one item, so you can see what a finding means and fix it. 1. Select an item. 2. On its card, look at the **Position** section. Sides the plan check flags always show there, with a warning or blocking mark. 3. Press **Space around**, at the end of the **Position** line, to see the gaps on the other sides too. Each row names a side of the item and what it faces, with the gap: for example **Front to wall** and a distance, or **Left to** another item's name. Items with a 3D model name their own sides (**Front**, **Back**, **Left**, **Right**); others use the plan's (**Top**, **Bottom**, **Left**, **Right**). Where there is no gap, the row says **touching** or **overlapping**. A flagged side also says what to aim for, such as “Aim for 0.6 m of clear space here.”, and whether Plan check lists it to review or counts it as blocking. ![Space around for a table: an overlap marked blocking and a gap marked as a warning, each with a Move 31 cm button.](https://floorplancraft.com/docs/screenshots/space-around.webp) ## Fix a gap in one press For the first two flagged sides, the planner looks for a move that clears the gap and offers it as one button, such as **Move 15 cm**. Press it and the item moves; the message offers **Undo**. Where no move works, the card says “There is no room to move it clear here.” If the plan has changed since and the move would now add a blocking issue, the item doesn't move and the message says why. ## Guidance, not compliance - The checks cover what the planner can measure in a concept plan: overlaps, doorway approaches, rooms and exits a route reaches, and the clearance figures in your catalog. - Each clearance warning names its source and ends with “Guidance, not a compliance check.” - Where a figure is the planner's own default, such as the depth kept clear at a doorway, **Space around** says it is not a published standard. - Codes and standards differ from place to place, and much of what they ask is not checked here. > **Warning:** The plan review summary ends with the product's own words: “Automated layout checks only. Findings are planning guidance, not certified compliance. A professional must review this concept before construction or purchasing.” ## Before you share The **Share** dialog repeats the plan check in one line under **Before you share**, for example “The automatic layout checks flagged 2 things to look at, for example: …”, with **See Plan check** to open the list. It never stops you from sharing. See [Share and export a plan](https://floorplancraft.com/docs/share-and-export.md). ## Related - [Add and arrange items](https://floorplancraft.com/docs/add-and-arrange-items.md) - [Doors, windows and exits](https://floorplancraft.com/docs/doors-windows-and-exits.md) - [Swap an item](https://floorplancraft.com/docs/swap-an-item.md) - [What FloorPlanCraft is](https://floorplancraft.com/docs/what-is-floorplancraft.md) --- Source: https://floorplancraft.com/docs/plan-check-and-clearances · Updated 2026-11-07 --- # Paint walls and change floors > Change paint, wallpaper, prints and floors with Materials in the 3D view, on a surface's card in 2D, or from the Finishes list. Every wall face, room floor, ceiling and zone in your plan can have its own finish. There are three places to change one: - **Materials** in the 3D view: pick a finish, then click a wall or a floor, or drag it on. The quickest way to try a look. - The **Finish** section of a surface's card in 2D: every option, including your own colours, sheen and print sizes. - The **Finishes** list in 2D: every room's walls and floor in one list, to find a surface and open its card. Each change is one step that **Undo** (or `Ctrl` + `Z`) takes back. Finishes are saved with the plan and show on its shared link. ## Paint in 3D with Materials 1. Switch to **3D** in the top bar, then press **Materials** in the bar along the bottom of the view. 2. Choose **Walls** or **Floors** at the left of the palette. 3. Click a finish. The line under the tiles says it is ready, for example “Soft sage is ready. Click a wall, or drag it on.” 4. Point at a wall or a floor to preview the finish on it, then click to apply it. You can also drag a tile straight onto a surface. 5. For a wall, choose how far the finish goes: **This wall**, **Whole room** or **All outside walls**. 6. Press **Done**, or `Esc`, to close the palette. ![The 3D view with the Materials palette open along the bottom, showing floor finishes grouped as Wood, Tile & stone and Soft floors.](https://floorplancraft.com/docs/screenshots/materials-palette.webp) | Choice | What it paints | | --- | --- | | **This wall** | Only the wall face you clicked. | | **Whole room** | Every inside wall of the room that face belongs to. | | **All outside walls** | Every outside face of the building on this floor. | A choice that would change nothing is greyed out. The result shows under the tiles, such as “4 walls in Kitchen are now Soft sage”, with **Undo** beside it. | Tab | Group | Finishes | | --- | --- | --- | | **Walls** | Paint | Warm ivory, Soft sage, Clay, Sky, Honey, Chalk | | **Walls** | Wallpaper | Botanical, Linen stripe, Playful confetti | | **Walls** | Prints | Little Grove, Warm sunrise, Quiet mountains | | **Floors** | Wood | Oak planks, Dark wood | | **Floors** | Tile & stone | Polished concrete, Terrazzo, Ceramic tile | | **Floors** | Soft floors | Rubber tiles in blue, green or grey, Artificial turf, Carpet in charcoal or navy, Interlocking mats | - Paint from the palette is matte. For a satin sheen or a colour of your own, use the wall's card in 2D. - A print is sized to fit the wall it lands on. Change its size and position on the wall's card. - Wall finishes go on walls and floor finishes on floors. Drop one on the wrong kind of surface and the palette says “Drop wall samples on a wall” or “Drop floor samples on a floor”. - If a theme preview is on, painting turns it off so you see the real finish, and the result ends with “Theme preview off.” - **Materials** is greyed out while the plan's structure is hidden. Turn on **Show structure** in **View options** in 2D. > **Tip:** `Esc` works one step at a time: it ends a drag, then closes the wall choices, then puts the picked finish down, then closes the palette. With a tile focused, the arrow keys move along the row. ## Change a finish on its card In 2D, click a wall, a room's floor or a zone to open its card. Every choice in its **Finish** section applies at once; there is nothing to confirm. ![An exterior wall's card on Finish: Inside or Outside, Paint, Wallpaper or Print, the paint swatches, a custom colour and Apply to whole room.](https://floorplancraft.com/docs/screenshots/wall-finish-card.webp) On a wall's card: - **Wall face** picks the side you are changing: **Inside** or **Outside** on an outer wall, **Side A** or **Side B** on a wall between two rooms or a free-standing wall. - **Finish type** switches between **Paint**, **Wallpaper** and **Print**, each with its own tiles. - Paint adds **Custom colour**, with a colour picker and a **Hex colour** field, and **Sheen**: **Matte** or **Satin**. - Wallpaper adds **Pattern size**. A print adds **Width**, **Height**, **From left** and **From floor**. A size applies when you press `Enter` or leave the field. - **Apply to whole room** copies this face's finish to every inside wall of the room. On a face with no finish of its own it reads **Reset whole room** and puts the room's walls back to the default. - **Reset finish** puts this face back to the default. On a room's or a zone's card: - On a room, **Space surface** switches between **Floor** and **Ceiling**. - For a floor or a zone, **Finish type** switches between **Photo floors** and **Colours**. Six photo floors show first; the rest are under **More floors**. - **Colours** are the colour finishes of your plan's catalog. A ceiling offers these only. - **Reset** puts the surface back to the default. Items, and the sides of a door or window opening, have a **Finish** section with the catalog's colours too. ## Find a surface in the Finishes list 1. In 2D, press **Finishes** in the tool bar at the bottom. 2. Find the room. Each room has a **Walls** row, a **Floor** row and a row for each zone in it, and every row names its finish now. **Outside walls** lists the outside of the building. On a plan with several floors, rooms are grouped by floor. 3. Click a row. The planner selects that surface and opens its card. A **Walls** row opens one of the room's walls on its inside face; **Apply to whole room** there changes them all. 4. To try finishes on the model instead, press **Paint in 3D**. The 3D view opens with Materials. ![The Finishes drawer listing each room's Walls and Floor with their current finishes.](https://floorplancraft.com/docs/screenshots/finishes-drawer.webp) ## Paint while you walk In the walkthrough, **Paint walls** pauses the walk and opens Materials. See [Walk through your plan](https://floorplancraft.com/docs/walk-through-your-plan.md#paint-and-preview-while-you-walk). > **Note:** A finish's name describes how it looks. It does not mean a floor or wall covering is suitable or rated for any use, such as fall protection under play equipment. ## Related - [Look at your plan in 3D](https://floorplancraft.com/docs/the-3d-view.md) - [Walk through your plan](https://floorplancraft.com/docs/walk-through-your-plan.md) - [Rooms and walls](https://floorplancraft.com/docs/rooms-and-walls.md) --- Source: https://floorplancraft.com/docs/materials-and-paint · Updated 2026-11-07 --- # Look at your plan in 3D > Turn and zoom the 3D model, choose how walls show, preview themes, time and Golden light, change items, present it and save a picture. Press **3D** in the top bar to see the current floor as a lit model. It is built from the same plan as 2D, so a change in one shows in the other. You can move and change items and paint surfaces here; drawing rooms and walls stays in 2D. ![The Olive & Oak restaurant template in the 3D view, with the mood panel, finish labels and the bar of themes, Golden light, time of day and Materials.](https://floorplancraft.com/docs/screenshots/view-3d.webp) ## Move around | To | Mouse or touch | Keyboard | | --- | --- | --- | | Turn the view | Drag | Arrow keys | | Zoom | Scroll, or pinch | `+` and `-` | | Go back to the opening view | **Reset view** at the top right | `Home` | | Select an item | Click it, or tap it | `Enter` or `Space` selects the item in the middle | The keys work while the view has focus; [Keyboard shortcuts](https://floorplancraft.com/docs/keyboard-shortcuts.md) lists them all. The view turns around the plan; it does not pan. Left alone, it slowly turns by itself until you click, drag or press a key, unless your device asks for reduced motion. ## Choose how walls show **View options**, at the top right of the 3D view, changes only your own view in this browser, never the plan. | Option | What it does | | --- | --- | | **Walls**: **Up** | Every wall stands at full height. | | **Walls**: **Cutaway** | The default. Walls between you and the rooms are cut low so you can see in, and they change as you turn. | | **Walls**: **Down** | Every wall is cut to a low stub, so the whole floor shows. | | **Room labels** | A tag over each room with its name and floor area, such as “12 m²”. On until you turn it off. Not shown on phones. | ## Preview themes, time of day and light The bar along the bottom of the 3D view tries looks on the plan. They are previews: none of them changes the plan or its finishes. - **Themes**: **As designed** shows your own finishes. Each swatch beside it previews a theme; point at one to see its name. Playground plans, blank plans included, offer Jungle, Ocean, Pastel and Sunset party; other plans offer Warm, Bright and Evening. While a theme is on, the bar names it, for example “Preview: Ocean”. - **Time of day**: the sun button, **Time presets**, jumps to **Morning**, **Midday**, **Golden hour** or **Night**, and the slider runs from 06:00 to 22:00. With the slider focused, the arrow keys move it 5 minutes and `Page Up` and `Page Down` jump between the presets. - **Golden light**: warm evening light for the view. It is a setting of this browser, not of the plan: it stays on for every plan you open here, in the walkthrough and on shared links, and in the pictures you save. Other people see their own setting. The panel at the top left reads the mood of the view, for example “Feels Playful”, with a bar split between three words. It is worked out from the colours of the walls and floors and the light at the chosen time, so it moves as you try finishes, themes and times. The words depend on the kind of plan: | Plan | Mood words | | --- | --- | | Indoor playgrounds | Calm, Playful, Energetic | | Dental clinics | Calm, Clean, Warm | | Classrooms | Calm, Bright, Lively | | Home gyms | Calm, Energetic, Intense | | Restaurants, cafés and every other plan | Cozy, Bright, Moody | ## Name the finishes in view Turn on **Finish labels** in the bar (under **More** in narrower windows) to show a fan of cards in the lower right corner, one for each finish on this floor. Each names the finish and what it covers, such as “Walls · 12 faces” or “Floor · 3 rooms”, or says “Not in view”. - Point at a card to outline every surface with that finish. - Click a card to keep it raised, then press **Open in Materials** to change that finish. - When there are more finishes than fit, a last card, “+N more”, opens Materials. Finish labels starts on in large windows and off in small ones, and your choice is remembered in this browser. On a phone the cards fold into a chip, such as “Finishes · 4”. In Present and in saved pictures, the names stand in the margins instead. ## Move and change items in 3D - Point at an item to see its name. Drag it with the mouse to move it along the floor; it snaps as it does in 2D, and `Esc` during the drag puts it back. - Click an item to select it. Its card opens, and a small toolbar floats over it with buttons such as **Rotate 90°**, **Duplicate**, **Swap**, **Finish** and **Remove**. **Remove** asks you to confirm first. The same actions are on the plan in 2D: see [Add and arrange items](https://floorplancraft.com/docs/add-and-arrange-items.md) and [Swap an item](https://floorplancraft.com/docs/swap-an-item.md). - To turn the view while pointing at an item, drag with the right mouse button, or hold `Alt` while you drag. - Click empty space, or press `Esc`, to deselect. On a touch screen a tap selects an item but does not drag it. The toolbar is hidden on phones and while Materials is open; the item's card has the same actions. ## Present the plan **Present**, the play button at the end of the bar, shows the model on its own and asks the browser for full screen, for a meeting or a screen share. `F` does the same while the 3D view has focus. - Drag, scroll and the arrow keys still turn and zoom the model. - The caption “FloorPlanCraft · Concept planning · Professional review required.” stays on screen. - Press `Esc`, or **Exit · Esc**, to leave. ![Present: the restaurant model on its own, with finish names in the margins.](https://floorplancraft.com/docs/screenshots/present.webp) ## Save a picture **Save image**, in the bar (under **More** on a phone), downloads a 1920 × 1080 PNG of the view named after your plan, such as `harbour-cafe-showcase.png`, with a small floorplancraft.com mark. It keeps your angle, walls, theme, time of day and light, and leaves out the buttons. You don't need an account. With **Finish labels** on, the picture names the finishes in its margins. ## See every floor at once On a plan with more than one floor, open the floor menu at the bottom left and choose **Whole building** for a plain model of every floor. It has **Reset view** and **See-through walls**: click an item to select it, drag to turn and double-click to reset. Its bar has **Materials** only; pick a single floor again for themes, Present and the other tools. [Floors and stairs](https://floorplancraft.com/docs/floors-and-stairs.md) explains how to add floors. > **Note:** A template link opens in 3D with one button, **Make it yours**. Press it to start editing; see [Start a plan](https://floorplancraft.com/docs/start-a-plan.md). Until then the view is a look only, without Materials, Finish labels, Golden light or View options, and nothing is saved. While detailed models load, the view says “Loading detailed 3D models…”. If some can't load, exact-size placeholders stand in for them. If your device can't run 3D, the view says “3D can't start on this device.” and offers the 2D plan instead. ## Related - [Paint walls and change floors](https://floorplancraft.com/docs/materials-and-paint.md) - [Walk through your plan](https://floorplancraft.com/docs/walk-through-your-plan.md) - [Keyboard shortcuts](https://floorplancraft.com/docs/keyboard-shortcuts.md) - [Share and export a plan](https://floorplancraft.com/docs/share-and-export.md) --- Source: https://floorplancraft.com/docs/the-3d-view · Updated 2026-11-07 --- # Walk through your plan > Walk through your plan at eye level: start and pause, move with the keys and mouse, pick a start room, paint walls and preview light. The walkthrough puts you inside your plan at eye level, so you can check sightlines, doorways and how the space feels. It walks the current floor; walk onto a connected staircase to reach another floor (see [Floors and stairs](https://floorplancraft.com/docs/floors-and-stairs.md)). ## Start walking 1. Press **Walkthrough** in the top bar (**Walk** on a phone). 2. On a computer, the walk takes over the mouse: move it to look around. If the bar shows **Start walking**, press it first. 3. Move with `W` `A` `S` `D` or the arrow keys. 4. Press `Esc` to pause and get the mouse pointer back. ![Walking through the restaurant at eye level, with the overview map at the top right and the bar reading Move with W A S D · look with the mouse.](https://floorplancraft.com/docs/screenshots/walkthrough.webp) ## Controls | To | On a computer | | --- | --- | | Walk | `W` `A` `S` `D` or the arrow keys | | Look around | Move the mouse | | Pause | `Esc`, or **Esc Pause** on the bar | | Keep walking | **Resume**, or `Enter` right after a pause | The walk never takes the mouse back by itself; only **Resume** does. If something stands in your way, you step around it where there is room. **Controls**, on the paused bar, lists these keys and has a switch, **Show on-screen controls**, for buttons that walk and look without the keyboard: **Turn left**, **Step forward**, **Turn right**, **Look up**, **Step back**, **Look down**, and **Reset view**, which takes you back to the start. ## What the bar tells you | The bar says | What it means | | --- | --- | | “Move with W A S D · look with the mouse” | You are walking. | | “Paused · press Resume to keep walking” | The walk is paused and the pointer is free. Press **Resume**. | | “One moment, then press Resume again.” | The browser needs a moment after a pause before it hands the mouse back. | | “The mouse can't be captured here. …” | The browser kept the mouse. You can still walk with the keys and look by moving the mouse; hold it at an edge to turn. **Capture mouse** tries again. | | “Click Start walking, then move with W A S D and look with the mouse.” | The walk is ready. Press **Start walking**. | | “The walkthrough can't start: this plan has no room to stand in.” | Add a room in 2D first. | ## Choose where the walk starts In 2D, select a room and press **Use as walkthrough start** on its card. The planner confirms it, for example “Walkthrough will start in Kitchen.”, and the choice is saved with the plan; **Clear walkthrough start** removes it. Without a start room, the planner picks a clear spot in one of the rooms. If you walked away from the start last time, the bar asks “Where do you want to start?”: **Resume where you left off** or **Start at the entrance**, the plan's usual start. `Esc` keeps your last spot and waits for **Start walking**. The spot is remembered only while the plan stays open in this tab; it is not saved with the plan. ## Paint and preview while you walk - **Paint walls** pauses the walk and opens Materials on **Walls**. Click a finish, then a wall, or drag it on, as in [the 3D view](https://floorplancraft.com/docs/materials-and-paint.md#paint-in-3d-with-materials). **Done** or `Esc` takes you back to the paused walk. - **Theme & time** pauses the walk and opens a panel with the themes, **Times of day**, the time slider and **Golden light**. These are previews only: your saved plan keeps its own finishes. Press **Done** to close the panel. ![The walkthrough paused with the Materials palette open on Walls: paints, wallpapers and prints.](https://floorplancraft.com/docs/screenshots/walkthrough-paint.webp) **Paint walls** appears on a computer with a mouse or trackpad, in a window wider than 720 pixels, on a plan you can edit. While a theme, a time other than Midday or Golden light is on, a line at the top left of the walk names it, starting “Preview:”. ## On a touch screen - Drag the **Move** joystick at the bottom left to walk. - Drag across the view itself to look around. - **Reset view** takes you back to the start, and **Theme & time** opens the theme and light panel. - **Exit** leaves the walk for the 3D view. Painting in the walkthrough needs a mouse or trackpad. ## Leave the walkthrough On a computer, choose **2D** or **3D** in the top bar; there is no Exit button. On a touch screen, press **Exit**. If you are signed in, leaving saves the plan when it has unsaved changes; see [Save your plan](https://floorplancraft.com/docs/saving-your-plan.md#when-it-saves-by-itself). > **Note:** On a shared link the walkthrough is view-only: no painting, no Theme & time and no resume. **Golden light** sits on its bar. ## Related - [Look at your plan in 3D](https://floorplancraft.com/docs/the-3d-view.md) - [Paint walls and change floors](https://floorplancraft.com/docs/materials-and-paint.md) - [Floors and stairs](https://floorplancraft.com/docs/floors-and-stairs.md) - [Keyboard shortcuts](https://floorplancraft.com/docs/keyboard-shortcuts.md) --- Source: https://floorplancraft.com/docs/walk-through-your-plan · Updated 2026-11-07 --- # Accounts and signing in > What works without an account, how to create one, sign in and out, bring a guest draft with you, and get help with your account. You don't need an account to plan. As a guest you get the whole editor: drawing, furnishing, finishes, 3D, the walkthrough, Present, Save image and every export. An account adds saving your plans, a view-only link to share them, and Live 3D. ## Create an account 1. Go to your [plan library](https://floorplancraft.com/library). While you are signed out, it shows the sign-in form. 2. Press **Create an account instead**. 3. Fill in **Display name**, **Email** and **Password**. The password needs at least 12 characters. 4. Press **Create account**. You are signed in at once; there is no email to confirm. Creating an account means you agree to the [Terms](https://floorplancraft.com/terms) and acknowledge the [Privacy notice](https://floorplancraft.com/privacy). ## Sign in 1. Go to your [plan library](https://floorplancraft.com/library). 2. Enter your **Email** and **Password**, then press **Sign in**. 3. Your plan library opens. Use **New plan** to start a plan (see [Start a plan](https://floorplancraft.com/docs/start-a-plan.md)), or **Open** on a saved one. A browser is signed in to one account at a time. To use another account, sign out first. ## The account bar While you are signed in, a bar across the top of the planner and the plan library reads “Signed in as” and your email. ![A saved plan with the account bar above it: Signed in as, New plan, Playground example, Plan library and Sign out.](https://floorplancraft.com/docs/screenshots/account-bar.webp) | Link | What it does | | --- | --- | | **New plan** | Opens a blank plan that asks “How big is your space?”. | | **Playground example** | Opens the indoor playground template in 3D. | | **Plan library** | Lists your saved plans. | | **Sign out** | Signs you out and goes to the home page. If it fails, the bar says “Sign out failed. Your session is still active. Try again.” | ## Bring a guest draft with you Started as a guest? Sign in from inside the planner, and your plan comes with you: 1. Press the plan's name at the top left and choose **Sign in to save**, or press the “Local draft · not saved” status beside the name. **Sign in** under **More** (⋯) and **Sign in to get a link** in the **Share** dialog do the same. 2. Sign in, or create an account, on the page that opens: “Sign in to save your plan”. 3. Your plan reopens in 2D. It is not saved yet: press the plan's name and then **Save plan**. > **Note:** The handover stays in this browser tab for up to 24 hours, so sign in in the same tab. If the browser can't keep a copy, the planner says “This browser could not preserve the draft for sign-in. Download an export before leaving this page.” An export keeps a picture or a record of the plan, but it can't be opened in the planner again. ## Passwords and account changes The app has no password reset, account settings or account deletion yet. To reset your password, change your email or delete your account, write to us from the [Contact page](https://floorplancraft.com/contact), using the email address on your account. We check that the account is yours before we change anything. ## Related - [Save your plan](https://floorplancraft.com/docs/saving-your-plan.md) - [Manage your plans](https://floorplancraft.com/docs/your-plans.md) - [Start a plan](https://floorplancraft.com/docs/start-a-plan.md) --- Source: https://floorplancraft.com/docs/accounts-and-signing-in · Updated 2026-11-07 --- # Save your plan > Save a plan to your account, read the save status, see when the planner saves by itself, and what happens to a guest's draft. Signed in, you save your plan to your account and can reopen it from any browser. As a guest, nothing is saved: your plan lives only in the open browser tab until you sign in. ## Save a plan 1. Press the plan's name at the top left to open **Plan file**. 2. Type a **Plan name**. 3. Press **Save plan**, or **Save changes** once the plan has been saved before. ![The Plan file menu of a saved, shared plan: Plan name, Save changes, Save & share, Open public view in a new tab and Unshare.](https://floorplancraft.com/docs/screenshots/plan-file-popover.webp) The status line says “Saving plan…”, then “Plan saved as a new immutable version.” After the first save, the address changes to the plan's own page and the plan appears in your [plan library](https://floorplancraft.com/docs/your-plans.md). Pressing the save status beside the plan name saves too. ## The save status Beside the plan name, the save status shows where your plan stands: | Status | What it means | Pressing it | | --- | --- | --- | | “Local draft · not saved” | You are a guest. Nothing is saved. | Starts sign-in, and your draft comes with you. | | “New plan · not saved” | You are signed in, but the plan has never been saved. | Saves the plan. | | “Unsaved changes” | The plan changed since the last save. | Saves the changes. | | “Saved” | Everything is saved. | Nothing. | | “Read-only · …” | The plan uses a catalog version this planner can't edit. You can look at it and export it, but not change, save or share it. | Nothing. | Narrow windows show a short form, such as “Unsaved”. Phones show a coloured dot only. ## When it saves by itself Nothing saves on a timer. When you are signed in, the planner also saves without a click when: - You leave the 3D view or the walkthrough for another view while the plan has unsaved changes or has never been saved. The status line says “Complete canonical plan saved while leaving the derived view.” A template you only looked at is not saved. - You open **Share** on a plan that already has a link. The current version is saved and the link updated. - You press **Create view-only link** in the Share dialog, or **Save & share** in Plan file. ## Versions Every save is kept as a new version; nothing earlier is overwritten. There is no screen to browse or restore older versions yet. To keep a copy you can go back to, use **Duplicate** in your [plan library](https://floorplancraft.com/docs/your-plans.md) before a big change. ## If a save doesn't work | Message | What to do | | --- | --- | | “Enter a plan name before saving.” | Type a name in **Plan name**. | | “Finish or cancel the open review before saving or sharing.” | Apply or cancel the review that is open in 2D, then save. | | “This plan is already being saved. Try again in a moment.” | Wait for the save to finish. | | “This plan changed in another session. Reopen it before saving again.” | The plan was saved from another tab or device. Reopen it from your plan library, then make your change again. | | “The plan could not be saved. Try again.” | Check your connection, then save again. | ## The unsaved-changes warning If you reload, close the tab or leave the page while the plan has unsaved changes, the browser asks you to confirm first. This happens for guests and for signed-in plans alike. ## Guest drafts As a guest, your plan lives only in the open browser tab. Reload or close the tab and it is gone, after the browser's warning. To keep it, sign in from the planner and save; see [Bring a guest draft with you](https://floorplancraft.com/docs/accounts-and-signing-in.md#bring-a-guest-draft-with-you). > **Warning:** Downloading an export does not keep a plan you can edit. The planner has no import, so a PNG, PDF, SVG or JSON file can't be opened in the planner again. ## Related - [Accounts and signing in](https://floorplancraft.com/docs/accounts-and-signing-in.md) - [Manage your plans](https://floorplancraft.com/docs/your-plans.md) - [Share and export a plan](https://floorplancraft.com/docs/share-and-export.md) - [A tour of the planner](https://floorplancraft.com/docs/planner-tour.md) --- Source: https://floorplancraft.com/docs/saving-your-plan · Updated 2026-11-07 --- # Manage your plans > Use the plan library to open, duplicate, archive, restore and delete your saved plans, and see what each does to a shared link. Your saved plans live in the [plan library](https://floorplancraft.com/library). Open it with **Plan library** in the account bar. Each card shows a picture of the plan's main floor, whether the plan is Active or Archived, its name, and when it was last updated. ![The plan library with three plans, two active and one archived, each with its thumbnail and buttons.](https://floorplancraft.com/docs/screenshots/plan-library.webp) The newest 24 plans get a picture; older cards show an empty frame. Click a picture to open its plan. Before your first save, the library says “No planning workspace yet”. Create a plan and save it once to set up your library; **Create first plan** starts one. ## What each button does | Button | What it does | | --- | --- | | **Create plan** | Opens a blank plan. | | **Open** | Opens the plan in the planner. | | **Duplicate** | Makes a new plan from the current version, named after the original with “copy” at the end. The copy has no shared link. | | **Archive** | Makes the plan read-only and marks it Archived. Its shared link keeps working. | | **Restore to edit** | On an archived plan: makes it editable again. | | **Manage sharing** | On an archived plan: opens its page, where you can open or unshare its link. | | **Delete…** | Asks you to confirm, then deletes the plan and turns off its shared link. | ## Archive or delete Archive a plan you want out of the way but kept: it stays in the library, read-only, and any shared link still opens. Delete a plan you want gone. > **Warning:** Deleting can't be undone. After you press **Confirm delete**, the plan and its public link are gone for good. ## Turn off an archived plan's link 1. On the archived plan's card, press **Manage sharing**. 2. Under “Public sharing is active”, press **Unshare archived plan…**, then **Confirm unshare**. To edit an archived plan again, press **Restore to edit**. Opening it without restoring shows “This plan is archived. Restore it from the library before editing.” ## Related - [Save your plan](https://floorplancraft.com/docs/saving-your-plan.md) - [Share and export a plan](https://floorplancraft.com/docs/share-and-export.md) - [Start a plan](https://floorplancraft.com/docs/start-a-plan.md) --- Source: https://floorplancraft.com/docs/your-plans · Updated 2026-11-07 --- # Share and export a plan > Send a view-only link, see what viewers can do, unshare it, save a picture as a guest, and download PNG, PDF, SVG or JSON files. **Share**, at the top right of the planner, sends a plan to people who don't need to edit it. Signed in, you get a view-only link. As a guest, you can save a picture. Both dialogs include **Export**, for files. ## Create a view-only link 1. Sign in, then open your plan. 2. Press **Share**. 3. Read **Before you share**, a summary of the automatic layout checks. Press **See Plan check** to look at anything flagged; see [Plan check and clearances](https://floorplancraft.com/docs/plan-check-and-clearances.md). 4. Press **Create view-only link**. The planner saves the plan and makes the link. 5. Press **Copy link** and send it. ![The Share dialog of a shared plan: Before you share, the view-only link with Copy link, Connected apps and the Export buttons.](https://floorplancraft.com/docs/screenshots/share-dialog.webp) Anyone with the link can view and walk through the plan; only you can edit it. On a plan that has never been shared, opening Share publishes nothing until you press **Create view-only link**. ## Keep the link up to date A link shows the version you shared, not your later saves. To update it, press **Share** again: the dialog saves this version and updates the same link (“Sharing… Saving this version and updating its view-only link.”). **Save & share** in Plan file does the same without the dialog. ## What viewers see The link opens a page headed “View-only conceptual plan”, with the plan's name and when it was published. Viewers don't need an account. They can switch between: - **2D plan**, with **Zoom out**, **Fit plan** and **Zoom in**. - **3D preview**, with **Reset view** and **See-through walls**. - **Walkthrough**, view-only, with **Golden light** on its bar. - **Showcase**, the lit model, with themes and times of day to try, **Golden light**, **Reset view** and **Save image**. A plan with more than one floor gets a tab for each floor. Below the viewer, **Equipment in this plan** lists the real branded products in the plan, with a link to a retailer where there is one, and **Finishes** lists every room's finishes. Viewers can't change, paint or save anything, and their theme and time choices last only for their visit. ## Unshare a plan 1. Press the plan's name to open **Plan file**. 2. Press **Unshare…**, read the warning, then press **Confirm unshare**. The planner says “Public link revoked. It no longer opens the plan.” The old address stops working for good: anyone who opens it gets a page-not-found message. Sharing again later makes a new link. Unsharing also stops any venue app connected to the plan; see [Connect your venue app](https://floorplancraft.com/docs/connect-your-app.md). Deleting a plan turns off its link too. Archiving does not. ## Share as a guest Without an account there is no link. **Share** opens a dialog with a preview of a picture of your plan: - **Save image now** downloads that picture. It always shows the walls cut away, and keeps Golden light if it is on. - **Sign in to get a link** takes you to sign in, and your plan comes with you. - **Export**, below them, downloads files. ![The guest Share dialog: a preview of the picture to save, Sign in to get a link, Save image now and the Export buttons.](https://floorplancraft.com/docs/screenshots/guest-share-dialog.webp) If your device can't run 3D, the dialog says “Saving a picture needs 3D, which can't start on this device.” Export still works. Signed in or not, **Save image** in the 3D view saves a picture too; see [Save a picture](https://floorplancraft.com/docs/the-3d-view.md#save-a-picture). ## Export files **Export**, at the bottom of both Share dialogs, downloads the plan as a file. | Button | File | What you get | | --- | --- | --- | | **Download PNG** | `floor-plan.png` | An image of the 2D plan. | | **Download PDF** | `floor-plan.pdf` | The 2D plan on an A4 page, landscape or portrait to suit the space, with a disclaimer on every page. | | **Download SVG** | `floor-plan.svg` | The 2D plan as a vector drawing. | | **Download public-safe JSON** | `floor-plan.json` | The plan's data, without internal notes. | SVG and JSON are under **More export formats**. On a plan with several floors, the PNG, PDF and SVG show the floor you are on, and the JSON holds the whole building. Labels in the PNG, PDF and SVG use the units chosen in **Measurement units** under **More** (⋯): **Metres** or **Feet**. > **Warning:** You can't open an export in the planner again: there is no import. To keep a plan you can edit, sign in and save it. > **Note:** There is no embed code to copy. A venue app connected to the plan can show it on the sites you allow; see [Connect your venue app](https://floorplancraft.com/docs/connect-your-app.md). ## Related - [Save your plan](https://floorplancraft.com/docs/saving-your-plan.md) - [Manage your plans](https://floorplancraft.com/docs/your-plans.md) - [Look at your plan in 3D](https://floorplancraft.com/docs/the-3d-view.md) - [Connect your venue app](https://floorplancraft.com/docs/connect-your-app.md) --- Source: https://floorplancraft.com/docs/share-and-export · Updated 2026-11-07 --- # What Live 3D is > Live 3D shows your venue app's tables, bookings or play zones live on your shared plan in 3D, with replays of past service days. Live 3D links a venue app, such as a restaurant's table system, to your plan in FloorPlanCraft. The app reports what is happening on the floor, and the plan shows it in 3D: which tables are seated, which rooms are in use, how many kids are in each play zone. ![A restaurant's live view: the 3D floor with seated and free tables, the floor status list on the right, and Live, Play, Labels and Speed under the model.](https://floorplancraft.com/docs/screenshots/live-view.webp) ## Apps that can connect | App | What the live view shows | | --- | --- | | Restaurant app | Tables as free, seated, seated for a long time or being reset, and kitchen stations with their queues. It can also make a first plan from your tables, and add new tables to your plan. | | Booking app, for salons, clinics, gyms and the like | Rooms, chairs and stations as free, in use, in use for a long time or being cleaned. | | Play venue app | Play zones as empty, playing with the number of kids in each, or closed. | The app connects from its own settings and sends you to FloorPlanCraft to approve. Only an app built to connect to FloorPlanCraft can do this. To build the connection into your own system, see the [Developer overview](https://floorplancraft.com/docs/developer-overview.md), or give a coding agent one of the [prompts to connect your system](https://floorplancraft.com/docs/agent-prompts.md). ## Where you see it - **The live view**, on your venue app's screens: your plan in 3D, coloured by what the app reports, with the floor's status, recent events and a legend. It refreshes every 10 seconds. See [Read the live view](https://floorplancraft.com/docs/the-live-view.md). - **Replays** of today or of a past service day the app reported, minute by minute, in the same view. - **The plan itself**, view-only, on the sites you allow, such as the app's own pages. ## What it costs Live 3D is paid per venue and billed through Whop; it is switched on for your workspace, where your saved plans live. The checkout page shows the price, and **Switch on Live 3D** in the plan's Share dialog opens it. You can cancel any time, and canceling keeps Live 3D on until the end of the month you paid for. You can connect an app before you pay. The app can show your plan straight away, and the live status starts once Live 3D is on. ## What you need - A FloorPlanCraft account and a saved plan of your venue. A restaurant app can make a first plan from your tables. - A venue app that can connect to FloorPlanCraft. - Live 3D switched on, for the live status. > **Note:** Live 3D shows what your app reports. It is not a safety, capacity or occupancy system, and your plan stays a concept plan. ## Related - [Connect your venue app](https://floorplancraft.com/docs/connect-your-app.md) - [Read the live view](https://floorplancraft.com/docs/the-live-view.md) - [Fix Live 3D problems](https://floorplancraft.com/docs/live-3d-troubleshooting.md) - [Developer overview](https://floorplancraft.com/docs/developer-overview.md) --- Source: https://floorplancraft.com/docs/what-is-live-3d · Updated 2026-11-07 --- # Connect your venue app > Approve a restaurant, booking or play venue app, choose the plan it shows, choose its sites, switch on Live 3D and disconnect it. Your venue app starts the connection, and you approve it in FloorPlanCraft. Once connected, the app can show your plan and send its live status to it. ## Approve the connection 1. Start the FloorPlanCraft connection in your venue app's settings. The app opens a FloorPlanCraft page: “Connect an app to FloorPlanCraft”. 2. Check what the app says about itself: **The app says it is** (the venue name it sent), **The app sent** (how many tables or areas), **Returns to** (the app's address) and **May show your plan on** (the sites it wants to show the plan on). 3. If you are signed out, enter your **Email** and **Password** and press **Sign in to continue**. New here? Press **Create an account instead**, then **Create account and continue**. Use the account that owns the plan; nothing is connected until you approve. 4. Choose the **Workspace**, if you have more than one, and the **Plan to show in the app**. 5. Press **Approve and connect**. Your browser goes back to the app. ![The Connect an app to FloorPlanCraft page: what the app says it is, where it returns, what it may do, the plan to show, and Approve and connect or Deny.](https://floorplancraft.com/docs/screenshots/connect-approval.webp) To refuse, press **Deny** or close the page. A request works once and lasts 10 minutes. > **Warning:** If the page warns “This will send access to” an address, check that it is your app's address and that you started the connection yourself. The list holds your saved plans in that workspace that are not archived. The plan's view-only link is shared with the app; if the plan has none yet, its last saved version gets one when you approve. Once connected, the app can show the plan on its own pages and on the sites listed, and send live status to the plan's live view. A restaurant app can also add tables the plan lacks, in a separate “New tables” room. It never moves, renames or deletes anything, and adding tables also publishes your latest saved changes to the link. The app can't open your other plans. ## Make a plan from your tables A restaurant app that sends its tables can offer **Create a plan from your N tables** as the plan to show. Approving makes a new draft plan with one zone for each table, named as your app names them, and gives it a view-only link. Open “A new plan would have …” on the page to see its rooms and any plan check notes first. The new plan is a concept layout: open it from your [plan library](https://floorplancraft.com/docs/your-plans.md) to edit it. ## Manage connections in the Share dialog 1. Open the plan and press **Share**. 2. Open **Connected apps**. It appears once the plan has a view-only link. ![Connected apps in the Share dialog: Live 3D active, a connected restaurant app with Disconnect, and the sites allowed to show its live view and the plan.](https://floorplancraft.com/docs/screenshots/connected-apps.webp) The first line says whether Live 3D is on for your workspace. Then each connection shows the venue's name, the kind of app with its version, and a status: | Status | What it means | | --- | --- | | **Live** | The app sent an update in the last 90 seconds. | | **Last seen** and a time or a date | The app's last update came then. | | **Not heard from yet** | The app is connected, but nothing has arrived. | | **Stopped: the plan was unshared** | The plan's link was turned off, so the connection stopped. | | **Disconnected** and a date | Someone disconnected the app. | ## Choose the sites that may show your plan Two lists in **Connected apps** say which websites may show your plan inside their own pages. Enter one site per line, such as `https://pos.example.com`, and press **Save origins**. - **Sites that may show its live view** belongs to one connection: the sites where that app may show the live view. - **Sites that may show this plan (view-only)** covers the plan itself. Empty means no other site may show it. It holds up to 10 sites. Sites an app added leave when the app is disconnected; sites you add stay. Use addresses that start with `https://`. An `http://` address is only for a device on the venue's own network. ## Switch on Live 3D 1. In **Connected apps**, press **Switch on Live 3D**. The button shows the price. 2. On the checkout page, check the workspace. If you have several, choose one under **Workspace** and press **Switch workspace**. Then press **Continue to payment**. 3. Pay in the Whop form. If it doesn't load, press **Open Whop checkout in a new tab** and pay with your FloorPlanCraft email. 4. Once the payment goes through, the page switches Live 3D on, usually within a minute. **Back to the planner** takes you back. Only a workspace's admin can buy Live 3D for it. While it is active, the checkout page links to your membership on Whop, where you change your card or cancel; canceling keeps Live 3D on until the end of the paid month. ## Disconnect an app 1. In **Connected apps**, press **Disconnect** beside the app. 2. Read what will happen, then press **Disconnect** again, or **Keep connected** to change your mind. The app's live view stops within a minute, and the app can't send updates until someone connects it again. Sites the app added to the plan's list are removed; sites you added stay. The plan itself doesn't change. Unsharing the plan stops every connection at once. > **Note:** Building the app side yourself? [Connect an app](https://floorplancraft.com/docs/connect-an-app.md) in the developer guide covers the same flow from the app's end. ## Related - [What Live 3D is](https://floorplancraft.com/docs/what-is-live-3d.md) - [Read the live view](https://floorplancraft.com/docs/the-live-view.md) - [Fix Live 3D problems](https://floorplancraft.com/docs/live-3d-troubleshooting.md) - [Share and export a plan](https://floorplancraft.com/docs/share-and-export.md) --- Source: https://floorplancraft.com/docs/connect-your-app · Updated 2026-11-07 --- # Read the live view > What the live view shows: live or last seen, service days, replays and speed, labels, floor status, recent events and the legend. Your venue app opens the live view on its own screens, from a short-lived link. It shows your plan in 3D with each table or zone coloured by what the app reports, and it refreshes every 10 seconds. It is read-only: nothing you do there changes the plan. ![A restaurant's live view: the 3D floor with seated and free tables, the floor status list on the right, and Live, Play, Labels and Speed under the model.](https://floorplancraft.com/docs/screenshots/live-view.webp) ## Live or last seen | The top line says | What it means | | --- | --- | | “Live” | The app sent an update in the last 90 seconds. | | “Last seen 14:05” | The app's last update came at that time, and the view shows the floor as it was then. | | “Waiting for the venue's first update” | The app is connected but hasn't sent anything yet. | | “Estimated 14:12 from exit times” (where it usually says “Refreshes every 10 s”) | The app has been silent for over 90 seconds. The view estimates each zone from when its guests were due to leave, if the app sends those times. It goes back to live when the app does. | | “Venue live now” | You are looking at a past day, and the venue is live right now. | ## Service days **Service day** chooses what to show: **Live**, or a past day the app reported. If the app re-sends a day it missed, that day appears here too. A past day opens at its end (“Stored day · end of day”), and its **End of day** button brings you back there after a replay. ## Replay the day 1. Drag the **Replay the day** slider to a time. The floor shows that minute, and the view says “Replay paused”. 2. Press **Play** to run the replay from there. **Speed** sets 1, 5 or 15 minutes of the day per second. 3. Press **Pause** to stop, or **Live** to go back to now. The shading behind the slider is taller and darker where more of the floor was in use. Point at it to read that moment, for example “4 of 7 tables seated at 13:00”. ## Labels **Labels** sets which tables or zones carry a label in 3D: **All**, **In use** or **Off**. A label in use shows minutes and people, such as “25m · 4” for a table, or “12 kids” for a play zone. Your choice is remembered in this browser. ## The side panel - **Floor status**: the date and time shown and when it last updated, then every table or zone by room, with its state, its party or seats, and how many minutes it has been in use. A restaurant also sees **Kitchen stations**, with the tickets queued and the age of the oldest. - **Recent events**: what happened up to the time shown, such as “T7 seated · 4 guests”. - **Legend**: what the colours mean, in your app's words. | Meaning | Restaurant app | Booking app | Play venue app | | --- | --- | --- | --- | | Nobody there | Free | Free | Empty | | In use | Seated | In use | Playing | | In use for a long time | Seated \>N min | In use \>N min | Not used | | Being reset, or closed | Reset | Cleaning | Closed | Your app sets N, the minutes after which a table or area counts as in use for a long time. A restaurant's legend also colours the kitchen: “Kitchen \<8 min / empty”, “Kitchen ≥8 min” and “Kitchen ≥15 min”. ## When the link expires A live view link lasts at most 12 hours. When it runs out, the page says “This live view link has expired”: open the live floor again from your app to get a new link. If the app is disconnected, Live 3D runs out or the plan is unshared, an open live view changes to “This live view is no longer available” within a minute. For how an app shows the live view on its screens, see [Embedding the live view](https://floorplancraft.com/docs/embed-the-live-view.md) in the developer guide. ## Related - [What Live 3D is](https://floorplancraft.com/docs/what-is-live-3d.md) - [Connect your venue app](https://floorplancraft.com/docs/connect-your-app.md) - [Fix Live 3D problems](https://floorplancraft.com/docs/live-3d-troubleshooting.md) --- Source: https://floorplancraft.com/docs/the-live-view · Updated 2026-11-07 --- # Fix Live 3D problems > Fix common Live 3D problems: a missing plan, the wrong account, expired requests and links, a venue that is not live, and Live 3D off. Find your symptom or message below. ## The plan isn't in the list The approve page lists your saved plans in the chosen workspace that are not archived. - Save the plan first: a plan that was never saved isn't listed. - Restore an archived plan in your [plan library](https://floorplancraft.com/docs/your-plans.md). - If you have several workspaces, choose the right one under **Workspace**. - If the page says “This workspace has no plan you can share yet”, create and save a plan, then connect again from the app. - If it says “None of your workspaces can connect a plan: you need to be an editor or admin.”, ask the workspace's admin, or use your own account. ## The wrong plan or account is connected 1. Open the plan that was connected, press **Share**, open **Connected apps** and press **Disconnect**. 2. If you were signed in to the wrong account, press **Sign out** in the account bar of the planner or the plan library. 3. Start the connection again from your app, and sign in with the right account. ## Messages on the connect page | Message | What to do | | --- | --- | | “This connect request expired” | Requests last 10 minutes, and nothing was connected. Start again from your app. | | “This connect request was already answered” | The request has been answered, so there is nothing more to do on that page. Start again from your app if you need another connection. | | “This connect link is not valid” | Start again from the app you want to connect. | | “Too many attempts” | Wait as long as the page says, then reload it. | | “You need to be an editor or admin of the workspace to connect a plan.” | Choose a workspace where you are an editor or admin. | | “That plan's list of sites that may show it is full (10). …” | Remove sites under **Connected apps** in the plan's Share dialog, then try again. | | “That plan's view-only link predates recoverable links. …” | Unshare the plan in **Plan file**, share it again, then connect again. | | “A plan from these tables would be too large to save. …” | Choose an existing plan, or send fewer tables from the app. | ## The venue never goes live “Waiting for the venue's first update” in the live view, and “Not heard from yet” in **Connected apps**, mean the app is connected but hasn't sent anything. Check that the app is running and online, with its FloorPlanCraft connection on. ## It says Last seen instead of Live The app hasn't sent an update for more than 90 seconds, so the view shows the floor as last reported. Check that the app is running and online; the status turns back to **Live** with its next update. ## The live view link expired “This live view link has expired” means the link's time ran out; links last at most 12 hours. Open the live floor again from your app to get a new link. ## Live 3D is not active In **Connected apps** the first line reads “Live 3D: not active. Connected apps can show the plan, but their live table status waits until Live 3D is on.” The app can still show your plan, but its live view won't open until Live 3D is on. Press **Switch on Live 3D**; see [Switch on Live 3D](https://floorplancraft.com/docs/connect-your-app.md#switch-on-live-3d). If you have just paid and the checkout page says “Payment started”, your bank is still confirming the payment. Live 3D switches on by itself when it clears. ## It stopped after I unshared the plan Unsharing turns off the plan's link and stops every connection to it: **Connected apps** shows “Stopped: the plan was unshared”, and open live views say “This live view is no longer available”. To start again, share the plan to get a new link, then connect the app again from its settings. Building the app yourself? The errors it can receive are in [Disconnect and errors](https://floorplancraft.com/docs/disconnect-and-errors.md). ## Related - [Connect your venue app](https://floorplancraft.com/docs/connect-your-app.md) - [Read the live view](https://floorplancraft.com/docs/the-live-view.md) - [What Live 3D is](https://floorplancraft.com/docs/what-is-live-3d.md) - [Disconnect and errors](https://floorplancraft.com/docs/disconnect-and-errors.md) --- Source: https://floorplancraft.com/docs/live-3d-troubleshooting · Updated 2026-11-07 --- # Developer overview > How a restaurant, booking or play venue app connects to FloorPlanCraft, pushes live status and shows the live 3D floor inside the app. Live 3D shows a venue's floor plan with live status from the venue's own app: which tables are seated, which rooms and chairs are in use, how many kids are in each play zone. These pages are for the developers of those apps. These pages describe integration contract v1.7. ## Which apps can connect | Your app | `app` value | What it reports | | --- | --- | --- | | A restaurant POS or table app | `"restaurant"` | Tables (free, seated or being reset) and kitchen or bar stations | | A booking app for a salon, clinic or gym | `"booking"` | Areas: rooms, chairs or basins, staff stations | | A play venue's ticketing app (POS) | `"play"` | Play zones and the number of kids in each | All three use the same endpoints, signing and embeds. Where they differ, these pages say so. The API calls every row `tables`: a booking app's areas and a play venue's zones travel in the same fields as a restaurant's tables. ## How it works 1. Your server sends a connect request with the venue's details and gets back an `authorizeUrl`. 2. The venue owner opens that address, signs in to FloorPlanCraft, chooses the plan and approves the connection. 3. Your server exchanges the code it gets back for a `connectionId` and a `connectionSecret`. 4. Your server pushes the venue's status, signed with the secret: on every change, and as a heartbeat every 60 seconds. 5. Your server asks for a short-lived embed address, and your app shows the live 3D floor in an iframe. [Connect an app](https://floorplancraft.com/docs/connect-an-app.md) covers the first three steps, [Live updates](https://floorplancraft.com/docs/live-updates.md) the pushes and [Embedding the live view](https://floorplancraft.com/docs/embed-the-live-view.md) the frame. The venue owner's side, from approving to switching on Live 3D, is in [Connect your venue app](https://floorplancraft.com/docs/connect-your-app.md). ## Endpoints Every address is on `https://floorplancraft.com`, and every request and answer body is JSON. | What | Request | Signed | | --- | --- | --- | | Connect request | `POST /api/connect/requests` | No | | Approval | The `authorizeUrl`, opened in the venue owner's browser | No | | Code exchange | `POST /api/connect/token` | No: PKCE proves the install | | Push status | `POST /api/live/ingest` | Yes | | Re-send history | `POST /api/live/backfill` | Yes | | Live embed address | `POST /api/live/embed-tokens` | Yes | | Add tables to the plan (restaurant only) | `POST /api/connections/self/tables` | Yes | | Disconnect | `DELETE /api/connections/self` | Yes | | Live embed | `/live/embed/` in an iframe | No: the token opens it | | Plan embed | `/embed/` in an iframe | No | [Signing requests](https://floorplancraft.com/docs/signing-requests.md) shows how to sign, and [Disconnect and errors](https://floorplancraft.com/docs/disconnect-and-errors.md) lists every error and limit. ## Ground rules - Your server calls FloorPlanCraft, and FloorPlanCraft never calls your app. A venue behind a router needs no open port. - There is no shared API key. Each install proves itself with PKCE when it connects, then signs every request with its own secret. - Keep the `connectionSecret` on your server. Never send it to a browser, put it in an iframe address or write it to a log. - Name tables, areas and zones exactly as the plan's zones are named. Matching ignores case and surrounding spaces. - The venue owner pays FloorPlanCraft for Live 3D. Your app does no billing. - Ignore fields you do not know in answers and messages. ## Related - [Connect an app](https://floorplancraft.com/docs/connect-an-app.md) - [Live updates](https://floorplancraft.com/docs/live-updates.md) - [Prompts to connect your system](https://floorplancraft.com/docs/agent-prompts.md) --- Source: https://floorplancraft.com/docs/developer-overview · Updated 2026-11-07 --- # Connect an app > Send a connect request, let the venue owner approve it in FloorPlanCraft, then exchange the code with PKCE for a connection id and secret. Connecting takes one request from your server, one visit by the venue owner and one more request from your server. At the end, your server holds a connection id and a secret. ## Before you start - Give each install an `installId`: a UUID v4 that you generate once and keep. - For each attempt, make a PKCE code verifier of 43 to 128 characters from `A-Z`, `a-z`, `0-9` and `- . _ ~`, and its challenge: the base64url SHA-256 of the verifier without padding, 43 characters. - Make a random `state` of 16 to 128 visible ASCII characters and keep it with the attempt. - Know where the owner's browser should come back to (`returnUrl`) and which origins will frame the embeds (`embedOrigins`). To test your PKCE code, use the example from RFC 7636: the verifier `dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk` has the challenge `E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM`. Never use it for a real connection. ## Step 1: send a connect request Your server sends `POST https://floorplancraft.com/api/connect/requests`. It needs no signature: the request only describes the venue and opens nothing by itself. ```json { "app": "restaurant", "installId": "6f1c2a9e-3b7d-4c55-9a1e-2f8b7c6d5e40", "appVersion": "2.3.0", "venueName": "Harbour Café", "timeZone": "Europe/London", "returnUrl": "http://192.168.1.20:3000/settings/floorplancraft/callback", "state": "c4V9qL2xT8mN1pR6wZ0yB3", "codeChallenge": "E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM", "codeChallengeMethod": "S256", "embedOrigins": ["http://192.168.1.20:3000", "https://pos.harbourcafe.example"], "tables": [ { "label": "T1", "capacity": 4, "room": "Main dining" }, { "label": "T2", "capacity": 2, "room": "Main dining" }, { "label": "T10", "capacity": 6, "room": "Terrace" } ], "stations": [{ "name": "Grill" }, { "name": "Bar" }] } ``` The answer is `201 Created`. Send the owner to `authorizeUrl` before `expiresAt`, which is 10 minutes away: ```json { "requestId": "cr_q1W2e3R4t5Y6u7I8o9P0aS", "authorizeUrl": "https://floorplancraft.com/connect?request=cr_q1W2e3R4t5Y6u7I8o9P0aS", "expiresAt": "2026-11-07T12:10:00.000Z" } ``` ## Request fields | Field | Rule | | --- | --- | | `app` | `"restaurant"`, `"booking"` or `"play"` | | `installId` | A UUID v4, the same for every connect from this install. Compared ignoring case. | | `appVersion` | Your app's version in semver, such as `2.3.0`. At most 32 characters. | | `venueName` | 1 to 80 characters, no control characters. The approval page quotes it as what the app says the venue is. | | `timeZone` | The venue's IANA time zone, such as `Europe/London`. Service days and the times in the live view use it. | | `returnUrl` | Where the owner's browser comes back: `http` or `https`, at most 2,000 characters, no fragment, no user name or password. Kept byte for byte: send the same string to the code exchange. | | `state` | 16 to 128 visible ASCII characters (`!` to `~`). It comes back unchanged. | | `codeChallenge` | The PKCE challenge, 43 characters | | `codeChallengeMethod` | `"S256"` | | `embedOrigins` | Optional. Up to 10 origins your app frames the embeds from, each written as scheme, host and optional port: no path, no trailing slash, no wildcard, no repeats. | | `tables` | Optional. Up to 500 rows, described below. | | `stations` | Optional, restaurant only. Up to 50 kitchen or bar stations, such as `{ "name": "Grill" }`. A station's name follows the label rule below and may not repeat a table's label. | `returnUrl` and every embed origin may use `http:` only for a host on the venue's own network, listed below. Everything else must use `https:`. ## Tables, areas and zones `tables` lists what your pushes will report, so FloorPlanCraft can match it with the plan. Fields other than these are ignored, so you can send your feed rows as they are. | Field | Rule | | --- | --- | | `label` | The name your pushes will use. At most 24 characters, starting with a letter or digit; letters, digits, spaces and `. _ # & ' / + -` only. Unique, ignoring case. | | `capacity` | A whole number from 1 to 99. A play venue sends the zone's kid capacity, from 1 to 999. | | `room` | Optional. The room's name, with the same rule as `label`. Without it, `"Dining room"`. | - **Restaurant:** one row per table, plus optional `stations`. - **Booking:** one row per area, such as a room, a chair or basin, or a staff member's station. `capacity` is 1 for an appointment, or a class's size. Leave `stations` out or send `[]`. - **Play venue:** one row per play zone, its `label` as the plan names the zone. Leave `stations` out or send `[]`. ## Addresses on the venue's network `http:` is allowed only when the host is one of these: - `localhost`, `127.0.0.0/8` or `[::1]` - A private IPv4 address in `10.0.0.0/8`, `172.16.0.0/12` or `192.168.0.0/16` - An IPv6 unique local address, `fc00::/7` - A single-label name such as `pos`, or a name ending in `.local` Write each origin as a browser does: a lower-case host, no default port and no trailing slash, such as `http://192.168.1.20:3000`. Anything else is refused rather than corrected. ## Connect request errors | Status | Body | Meaning | | --- | --- | --- | | 400 | `{ "error": "invalid_request", "issues": [{ "path": "tables.3.label", "message": "…" }] }` | A field breaks a rule. Up to 50 issues, each naming its field. A body that is not JSON or is over 256 KB is a 400 too. | | 429 | `{ "error": "rate_limited", "retryAfterMs": 60000 }` | Too many requests: wait `retryAfterMs` milliseconds. | | 503 | `{ "error": "unavailable" }` | Try again shortly. | Limits: 20 requests at once, then 60 an hour from one address (an IPv6 address counts by its /64), and 10 at once, then 30 an hour for one install from one address. ## Step 2: the venue owner approves Check that `authorizeUrl` starts with `https://floorplancraft.com/connect?request=`, then send the owner's browser to it. On that page the owner signs in or creates an account, chooses a workspace and a plan, checks the venue name, the return origin and the embed origins, and presses **Approve and connect** or **Deny**. The page warns the owner when the return origin is not on the venue's own network. [Connect your venue app](https://floorplancraft.com/docs/connect-your-app.md) shows this page from the owner's side. - **Restaurant:** the owner picks an existing plan or **Create a plan from your N tables**. That plan has one zone per table, each with a table and chairs for its capacity, and a **Kitchen** room with one zone per station. - **Booking and play venue:** the owner picks an existing plan. The owner draws the venue in the planner first and names each zone as your `label` values. When the owner approves, FloorPlanCraft publishes and shares the plan, then sends the browser back to your `returnUrl` with a GET: ```text Approve: ?code=<43 characters>&state= Deny: ?error=access_denied&state= ``` Query parameters already on `returnUrl` are kept. Check that `state` matches the attempt before you go on. > **Note:** An expired or already answered request sends the browser nowhere. If the owner has not come back within 10 minutes, treat the attempt as expired and start again. ## Step 3: exchange the code Within 5 minutes, your server sends `POST https://floorplancraft.com/api/connect/token`: ```json { "grantType": "authorization_code", "code": "", "codeVerifier": "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk", "installId": "6f1c2a9e-3b7d-4c55-9a1e-2f8b7c6d5e40", "returnUrl": "http://192.168.1.20:3000/settings/floorplancraft/callback" } ``` The answer is `200 OK`: ```json { "connectionId": "lc_8sKq2mXvT0bN4yR7wE1uZa", "connectionSecret": "<43 base64url characters, returned once>", "planId": "…", "shareToken": "…", "planEmbedUrl": "https://floorplancraft.com/embed/", "ingestUrl": "https://floorplancraft.com/api/live/ingest", "zoneLabels": ["T1", "T2", "T10", "Grill", "Bar"], "liveView": { "entitled": true, "policy": "entitled" }, "planVersionId": "…" } ``` | Field | Meaning | | --- | --- | | `connectionId` | `lc_` and 22 base64url characters. Send it as `X-FPC-Connection`. | | `connectionSecret` | Your signing key, 43 base64url characters. It is only in this answer: store it on your server, encrypted. | | `planId` | The connected plan | | `shareToken` | The plan's public share | | `planEmbedUrl` | The view-only plan, for an iframe | | `ingestUrl` | Where to push status | | `zoneLabels` | The plan's zone names, in plan order. Compare them with your labels and show the owner any that differ. | | `liveView` | `entitled` is `false` while the workspace does not have Live 3D: pushes answer 402 until it does. `policy` is `"free"` or `"entitled"`. | | `planVersionId` | The plan's published version. Every push answer carries the current one. | The exchange also adds your `embedOrigins` to the origins that may frame `planEmbedUrl`. If this install already had an active connection in the same workspace, the new one replaces it and the old secret stops working. One install may be connected in several workspaces at once. ## Code exchange errors | Status | Body | What to do | | --- | --- | --- | | 400 | `{ "error": "invalid_grant" }` | The code is used, expired or wrong, or the verifier, `installId` or `returnUrl` does not match. An exchange that reaches the code uses it up, even when it fails: start again. | | 400 | `{ "error": "invalid_request" }` | A wrong `grantType`, a missing field, or a body that is not JSON or is over 4 KB. The code is not used. | | 429 | `{ "error": "rate_limited", "retryAfterMs": 1000 }` | Too many failed requests from your address: wait `retryAfterMs` milliseconds. | | 503 | `{ "error": "unavailable" }` | The code is still unused: retry the same exchange within the 5 minutes. | ## Add tables later A restaurant app can add tables the plan lacks with a signed `POST https://floorplancraft.com/api/connections/self/tables`. The body follows the connect request's rules for `tables`, which is required, and `stations`, which is optional: ```json { "tables": [ { "label": "T1", "capacity": 4, "room": "Main dining" }, { "label": "T11", "capacity": 4, "room": "Terrace" } ], "stations": [{ "name": "Pastry" }] } ``` Each table the plan lacks, compared ignoring case, becomes a zone with a table and chairs in a new room, **New tables**, set against the building with its own entrance. Missing stations go into the plan's kitchen when they fit, or else into a new kitchen room. Nothing in the plan moves, is renamed or is deleted; the owner moves the new tables into place in the planner. ```json { "added": ["T11"], "existing": ["T1"], "addedStations": ["Pastry"], "existingStations": [], "stationsRoom": "Kitchen", "stationsRoomCreated": false, "planVersionId": "…" } ``` - `stationsRoom` and `stationsRoomCreated` are there only when stations were added. `conflicts`, when present, lists stations whose name is already a table's zone: rename those in your app. - The change is published at once, together with any changes the owner has saved but not yet published. - A call that adds nothing makes no new version and returns the current `planVersionId`. - A plan made or grown this way holds at most 1,000 zones, 6,000 items (tables and chairs included) and 4 MB. A sync past a limit adds nothing and answers `422` with `"error": "plan_too_large"` and the `limit`, `max` and `needed` values. - Limits: a 256 KB body; 6 at once, then 6 a minute per connection. It does not need Live 3D. - Booking and play venue apps get `422` with `"error": "unsupported_app"`: the owner adds or renames zones in the planner instead. ## Related - [Signing requests](https://floorplancraft.com/docs/signing-requests.md) - [Live updates](https://floorplancraft.com/docs/live-updates.md) - [Disconnect and errors](https://floorplancraft.com/docs/disconnect-and-errors.md) --- Source: https://floorplancraft.com/docs/connect-an-app · Updated 2026-11-07 --- # Signing requests > Sign pushes, embed address requests, table sync and disconnect with HMAC-SHA256 over the method, path, timestamp and exact body bytes. Four endpoints take signed requests: `POST /api/live/ingest`, `POST /api/live/embed-tokens`, `POST /api/connections/self/tables` and `DELETE /api/connections/self`. Each request carries three headers, made from the `connectionId` and `connectionSecret` your server got when it connected. ## Headers | Header | Value | | --- | --- | | `X-FPC-Connection` | The `connectionId`: `lc_` and 22 base64url characters | | `X-FPC-Timestamp` | The time now in whole Unix seconds, such as `1794054600`. It must be within 300 seconds of FloorPlanCraft's clock. | | `X-FPC-Signature` | `v1=` and the lowercase hex HMAC-SHA256 of the signed text | ## The signed text Join these five parts with a line feed (`\n`), with nothing after the body: 1. `v1` 2. The method in upper case: `POST` or `DELETE` 3. The path only, with no scheme, host, port or query, such as `/api/live/ingest` 4. The `X-FPC-Timestamp` value 5. The raw body bytes, exactly as sent. An empty body is zero bytes. The HMAC key is the `connectionSecret` text as UTF-8 bytes. Do not base64-decode it first. Serialise the body once and send exactly the bytes you signed. Because the method and the path are signed, a request signed for one endpoint is refused by every other. > **Tip:** Keep your server's clock synchronised, for example with NTP. A timestamp more than 300 seconds off is refused. ## Example in TypeScript ```ts import { createHmac } from "node:crypto"; const ORIGIN = "https://floorplancraft.com"; /** A signed request. body is the exact JSON text to send, or null to send none. */ export async function signedRequest(method: "POST" | "DELETE", path: string, body: string | null, connectionId: string, connectionSecret: string): Promise { const timestamp = String(Math.floor(Date.now() / 1000)); const signed = ["v1", method, path, timestamp, body ?? ""].join("\n"); const signature = createHmac("sha256", Buffer.from(connectionSecret, "utf8")).update(signed, "utf8").digest("hex"); const headers: Record = { "X-FPC-Connection": connectionId, "X-FPC-Timestamp": timestamp, "X-FPC-Signature": "v1=" + signature, }; if (body !== null) headers["Content-Type"] = "application/json"; return fetch(ORIGIN + path, { method, headers, body: body ?? undefined }); } // connectionId and connectionSecret come from your server's own store. const heartbeat = JSON.stringify({ at: new Date().toISOString(), heartbeat: true, sequence: 1288 }); await signedRequest("POST", "/api/live/ingest", heartbeat, connectionId, connectionSecret); await signedRequest("DELETE", "/api/connections/self", null, connectionId, connectionSecret); ``` ## Test vectors With the synthetic secret `0bsCgj_qUCHf4yNLsu7uPYpWYy07SC8jpQzqXHK_9jI`, `X-FPC-Timestamp: 1760875200` and bodies with no trailing line feed: | Request | Body | `X-FPC-Signature` | | --- | --- | --- | | `POST /api/live/ingest` | `{"at":"2026-10-19T12:00:00.000Z","heartbeat":true,"sequence":1}` | `v1=27a6976f8787a142f4c1a4a7443a4e81e320499127e9f1db21a960f3d5ab66a8` | | `POST /api/live/embed-tokens` | `{"ttlSeconds":3600}` | `v1=a08c6c46097e3cdbae8d9f27ecb1281e616c402a8007904d8de7a74e6bcacc2e` | | `DELETE /api/connections/self` | None (zero bytes) | `v1=d357517fc7c3fb2f79bee5edfd0f877de88d97c7df691cd0eda1a6d316a8b26a` | ## Signing errors | Status | Body | Cause | | --- | --- | --- | | 401 | `{ "error": "unknown_connection" }` | `X-FPC-Connection` is malformed or names no connection. | | 401 | `{ "error": "stale_timestamp" }` | `X-FPC-Timestamp` is missing, not whole seconds, or more than 300 seconds off. | | 401 | `{ "error": "invalid_signature" }` | The signature does not match. Check the method, the path, the key, and that you sent the bytes you signed. | Each of these failures, and an oversized body, counts against your server's address: 60 at once, then 60 a minute. Past that, every signed request from the address gets `429` before any other check. ## Related - [Connect an app](https://floorplancraft.com/docs/connect-an-app.md) - [Live updates](https://floorplancraft.com/docs/live-updates.md) - [Disconnect and errors](https://floorplancraft.com/docs/disconnect-and-errors.md) --- Source: https://floorplancraft.com/docs/signing-requests · Updated 2026-11-07 --- # Live updates > Push the venue's floor to FloorPlanCraft: feed pushes, heartbeats, service days, sequence numbers, events and what each answer tells your app. Your server sends the venue's state to `POST https://floorplancraft.com/api/live/ingest`, signed as in [Signing requests](https://floorplancraft.com/docs/signing-requests.md). A push is either a feed push, with the whole floor, or a small heartbeat. ## When to push - A feed push when something changes, debounced to 5 seconds. - A heartbeat every 60 seconds. - A feed push with the day's events on the first push of each service day, and whenever an answer says `"needFullState": true`. - After a failed push or a restart, a feed push with the day's events first. A heartbeat that ends a silence of 90 seconds or more also answers `"needFullState": true`. - Entries an error left out of a past range are re-sent with a backfill: see [Backfill and exit times](https://floorplancraft.com/docs/backfill-and-exit-times.md). The live view shows **Live** while the last push is under 90 seconds old, and **Last seen hh:mm** after that. Each connection may push 12 times a minute, with bursts of up to 24. ## A feed push A feed push always describes the whole floor: every table and station, not only the ones that changed. ```json { "restaurant": "Harbour Café", "at": "2026-11-07T12:30:00.000Z", "serviceDay": { "start": "2026-11-07T06:00:00.000Z", "end": "2026-11-08T02:00:00.000Z" }, "sequence": 1287, "tables": [ { "label": "T1", "room": "Main dining", "capacity": 4, "state": "seated", "covers": 3, "openMinutes": 25, "server": null }, { "label": "T2", "room": "Main dining", "capacity": 2, "state": "free", "covers": null, "openMinutes": null, "server": null } ], "stations": [ { "name": "Grill", "queue": 2, "oldestMinutes": 6 } ], "events": [ { "id": "seated:T1:1", "at": "2026-11-07T12:05:00.000Z", "type": "seated", "label": "T1", "detail": "3 guests" }, { "id": "ticket:1042:fired", "at": "2026-11-07T12:24:00.000Z", "type": "ticket_fired", "label": "T1", "detail": "Grill" } ], "longSeatedMinutes": 60 } ``` ## Feed fields | Field | Rule | | --- | --- | | `restaurant` | The venue's name, 1 to 80 characters. Booking and play venue apps use this field name too. | | `at` | When this state was true: an ISO 8601 time with an offset (`Z` or `+01:00`), within 10 minutes of FloorPlanCraft's clock and inside the service day. | | `serviceDay` | The trading day as `start` and `end` times with offsets: longer than zero and at most 36 hours. | | `tables` | Every table, area or zone, up to 500 rows. Required; may be empty. | | `stations` | Kitchen or bar stations, up to 100. Required: send `[]` when there are none. | | `events` | Up to 2,000 events, each with its own `id`. Required; may be empty. | | `sequence` | Optional. A whole number that grows with each push. | | `longSeatedMinutes` | Optional. A whole number from 1 to 600: a seated table open longer than this counts as long-seated. Without it, 45. | - Send `longSeatedMinutes` on every feed push it should apply to: a feed push without it goes back to 45. A heartbeat does not change it. - Never add a `heartbeat` field to a feed push: it is refused. ## Rows in tables | Field | Rule | | --- | --- | | `label` | The zone's name in the plan, matched ignoring case. At most 24 characters, starting with a letter or digit; letters, digits, spaces and `. _ # & ' / + -` only. | | `room` | The room's name, with the same rule. Required. | | `capacity` | Seats or places, a whole number of 1 or more | | `state` | `"free"`, `"seated"` or `"reset"` (being cleared) | | `covers` | How many people are there now, or `null` | | `openMinutes` | Minutes since the table was seated, or `null` | | `server` | Optional. FloorPlanCraft removes staff names before it stores a push: send `null`. | `covers` and `openMinutes` must always be present, as a number or `null`. A row whose `label` or `room` breaks the label rule is not shown and comes back in `unmatchedLabels`. ## Stations A restaurant app can report kitchen or bar stations. Each row has a `name` that follows the label rule, a `queue` of tickets waiting (a whole number) and `oldestMinutes`, the age of the oldest ticket in minutes or `null`. Booking and play venue apps send `"stations": []`. ## Events | Field | Rule | | --- | --- | | `id` | 1 to 64 printable characters, unique within the push and stable for the service day, such as `seated:T7:2` | | `at` | When it happened, inside the service day | | `type` | `seated`, `paid`, `voided`, `ticket_fired`, `ticket_ready`, `reservation_seated` or `no_show`. Any other type is shown as other activity. | | `label` | Optional. The table or station it concerns, as named in this push | | `detail` | Optional. Only a party size (`"4 guests"` or `"4 covers"`) or, for ticket events, a station's name is kept. | | `exitAt` | Optional, on `seated` and `reservation_seated` only: when the party leaves, an ISO 8601 time with an offset, after `at` and at most 24 hours later. See [Backfill and exit times](https://floorplancraft.com/docs/backfill-and-exit-times.md#exit-times). | - Events are stored by `id`, so you may send only new and changed events, or the whole day each time. - A stored event is replaced only by a push whose `at` is not earlier than the push that stored it. - A service day keeps at most 5,000 different ids. New ids past that are counted in `droppedEvents`; known ids still update. - The live view lists the last 2,000 events of a day. - An event outside the service day makes the whole push fail. ## A heartbeat ```json { "at": "2026-11-07T12:31:00.000Z", "heartbeat": true, "sequence": 1288 } ``` A heartbeat has only these fields, and `sequence` is optional. It tells FloorPlanCraft the venue is still there; nothing else is stored. ## The answer An accepted push answers `202 Accepted`: ```json { "accepted": true, "stored": "state", "planVersionId": "…", "unmatchedLabels": ["T99"], "needFullState": false, "capped": false, "droppedEvents": 0 } ``` | Field | Meaning | | --- | --- | | `stored` | `state`: the floor changed and was stored. `keyframe`: nothing changed, but 5 minutes had passed, so it was stored. `heartbeat`: only the time the venue was last heard from moved. `none`: the push was dropped. | | `ignored` | Only on a dropped push: `sequence` (lower than the highest seen) or `service_day` (a day before the current one) | | `planVersionId` | The plan's published version | | `unmatchedLabels` | Labels and station names in this push that no zone of the plan carries, or that cannot be shown; at most 100. Rename the zone in the plan or the label in your app. | | `needFullState` | `true`: send a feed push with the day's events next. | | `capped` | `true`: the service day reached its storage limit, 2,000 stored floors or 50 MB, and now keeps one floor every 5 minutes. | | `droppedEvents` | New events not stored because the day already holds 5,000 | ## Push errors | Status | Body | Meaning | | --- | --- | --- | | 402 | `{ "error": "entitlement_required", "entitlement": "live_view", "upgradeUrl": "https://floorplancraft.com/checkout/live-3d?connection=lc_…" }` | The workspace does not have Live 3D. Open `upgradeUrl` for the venue owner in a browser tab. | | 422 | `{ "error": "invalid_feed", "issues": [{ "path": "tables.3.state", "message": "…" }] }` | The body breaks a rule; up to 20 issues. Nothing was stored. | | 422 | `{ "error": "invalid_sequence" }` | `sequence` jumped too far. Nothing was stored. | Signing failures, `403 connection_revoked`, `413` for a body over 512 KB and `429` are in [Disconnect and errors](https://floorplancraft.com/docs/disconnect-and-errors.md). ## Service days - A push belongs to the date, in the venue's `timeZone`, on which its `serviceDay.start` falls. - Service days only move forward. A push for a day before the current one is dropped with `"ignored": "service_day"`. - Once the stored day has ended, a heartbeat answers `"needFullState": true`: send a feed push for the new day. ## Sequence numbers - `sequence` is optional. If you send it, make it grow with every push, feed or heartbeat. - A push with a lower `sequence` than the highest seen is dropped with `"ignored": "sequence"`. The same value again, a retry, is applied. - A jump of more than 100 times the last value and more than 10,000,000 above it is refused with `422` and `"error": "invalid_sequence"`, and nothing is stored. One wrong value, such as milliseconds sent instead of seconds, cannot lock out every later push. ## When the plan changes Every answer carries `planVersionId`. It changes when a new version of the plan is published. If your app keeps a copy of the plan, such as its zone names, read `GET https://floorplancraft.com/api/shares/` again only then: its `publishedVersionId` is the same identifier, and `content.zones` lists the zones with their `name`. ## Stored history FloorPlanCraft keeps 30 days of pushed history for the live view's replay. A floor is stored when it changes, plus a keyframe every 5 minutes; the growing ages in `openMinutes` and `oldestMinutes` alone are not a change. Replay reads this history and never calls your app. ## Booking apps A booking app for a salon, clinic or gym sends the same body. Its areas travel as rows in `tables`: | Field | Booking meaning | | --- | --- | | `restaurant` | The venue's name | | `tables` | One row per area: a room, a chair or basin, a staff member's station | | `state` | `seated`: in use. `free`: free. `reset`: cleaning time after a booking. | | `covers` | 1 for an appointment, or the booked places for a class | | `openMinutes` | Minutes since the booking started | | `server` | `null` | | `stations` | `[]` | | `events[].type` | `seated` (a booking starts or the client arrives), `paid`, `no_show` | | `longSeatedMinutes` | One value for the whole venue, such as `90`. There is no value per row. | The live view uses booking words: **In use**, **Cleaning**, clients and places. ## Play venue apps A play venue's ticketing app sends the same body. Each play zone is a row in `tables`, and `covers` counts the kids in it: ```json { "restaurant": "Example Play Centre", "at": "2026-11-07T14:00:00.000Z", "serviceDay": { "start": "2026-11-07T09:00:00.000Z", "end": "2026-11-07T19:00:00.000Z" }, "sequence": 512, "tables": [ { "label": "Soft play", "room": "Play hall", "capacity": 40, "state": "seated", "covers": 12, "openMinutes": 95, "server": null }, { "label": "Bounce zone", "room": "Play hall", "capacity": 28, "state": "reset", "covers": 0, "openMinutes": null, "server": null } ], "stations": [], "events": [ { "id": "checkin:4411", "at": "2026-11-07T13:52:00.000Z", "type": "seated", "label": "Soft play", "detail": "3 guests" } ] } ``` | Field | Play venue meaning | | --- | --- | | `restaurant` | The venue's name | | `tables` | One row per play zone, `label` exactly the plan's zone name. Zones nobody plays in, such as parents' seating or the counter, may be left out. | | `state` | `seated`: one or more kids are in the zone. `free`: none. `reset`: the zone is closed, for cleaning or a break. | | `covers` | The number of kids in the zone now; `0` when it is free or closed | | `capacity` | The zone's kid capacity | | `openMinutes` | Minutes since the zone got busy, or `null` | | `server` | `null` | | `stations` | `[]` | | `events[].type` | `seated`: kids checked in to a zone. `reservation_seated`: a booked party checked in. `no_show`: a booked party did not come. | | `events[].detail` | How many kids checked in, as `"3 guests"` or `"3 covers"` | | `longSeatedMinutes` | Still checked, 1 to 600, but it changes nothing: a busy zone is never long-seated. | - Count each kid in one zone only. Kids with a ticket for several zones can have a zone of their own in the plan, such as a walkway zone named **Combo**. - The live view says **Playing**, **Empty** and **Closed**, and counts kids. - The 3D view draws one kid per kid counted, up to 40 in a zone and fewer in a small one. The panel and labels always show the true count. ## Related - [Signing requests](https://floorplancraft.com/docs/signing-requests.md) - [Embedding the live view](https://floorplancraft.com/docs/embed-the-live-view.md) - [Disconnect and errors](https://floorplancraft.com/docs/disconnect-and-errors.md) --- Source: https://floorplancraft.com/docs/live-updates · Updated 2026-11-07 --- # Backfill and exit times > Re-send a past range of a service day after an error, and send when each party leaves so the live view can estimate the floor while your app is offline. Two additions in contract v1.7, for every app type. A **backfill** re-sends the history of a time range, so entries an error left out still reach the stored day and its replay. An **exit time** on a check-in says when that party leaves, so the live view can estimate the floor while your app is silent. ## Backfill `POST https://floorplancraft.com/api/live/backfill`, signed exactly as a push (see [Signing requests](https://floorplancraft.com/docs/signing-requests.md)) but with this path, so a push's signature never passes here. It shares the push's refusals: signature failures, `402`, `403`, `404`, `413`, `429` and `503`. ```json { "restaurant": "Example Play Centre", "serviceDay": { "start": "2026-11-06T00:00:00+05:00", "end": "2026-11-07T00:00:00+05:00" }, "from": "2026-11-06T09:00:00+05:00", "to": "2026-11-06T15:30:00+05:00", "states": [ { "at": "2026-11-06T09:00:00+05:00", "tables": [ { "label": "Soft play", "room": "Play hall", "capacity": 40, "state": "seated", "covers": 12, "openMinutes": null, "server": null } ], "stations": [] }, { "at": "2026-11-06T09:07:12+05:00", "tables": [ { "label": "Soft play", "room": "Play hall", "capacity": 40, "state": "seated", "covers": 15, "openMinutes": null, "server": null } ], "stations": [] } ], "events": [ { "id": "checkin:T-58213", "at": "2026-11-06T09:03:41+05:00", "type": "seated", "label": "Soft play", "detail": "3 covers", "exitAt": "2026-11-06T10:03:41+05:00" } ] } ``` | Field | Rule | | --- | --- | | `serviceDay` | As in a push: start before end, at most 36 hours. Its date in the venue's time zone is the day being replaced. | | `from`, `to` | The range to replace, inside the service day: `start <= from < to <= end`. A whole day is `from` = start, `to` = end. `to` must be at least 10 minutes in the past, and `from` within the last 30 days. | | `states` | 1 to 2,000 floors in increasing `at`, each inside the range, the first at `from` exactly. Each floor is checked as a push's floor is: `tables`, `stations` and the optional `longSeatedMinutes`. | | `events` | 0 to 2,000, each `id` once, each inside the range. `exitAt` as on a push. A label that names no table or station of the request's floors is blanked, not refused. | - The body may be up to 2 MB. Each connection may send 6 backfills a minute, with bursts of up to 10; backfills and pushes have separate allowances. - Send only the floors at changes: a floor is the whole state from its `at` until the next one. - Everything stored for the range, live pushes included, is replaced by the request. Sending the same request twice gives the same result. - A backfill is not a sign of life: it does not change the app's **Last seen** or its sequence. - A day your app never pushed, within the last 30 days, is created and appears in the live view's **Service day** menu. ```json { "accepted": true, "serviceDay": "2026-11-06", "states": { "stored": 41, "replaced": 37 }, "events": { "stored": 12, "replaced": 0 }, "unmatchedLabels": [] } ``` | Answer | Meaning | | --- | --- | | `202` as above | Stored. A replay of that day can take up to a minute to show it. | | `422` `{ "error": "invalid_backfill", "issues": [...] }` | A rule was broken; up to 20 issues. Nothing was stored. | | `422` `{ "error": "backfill_too_large", "limit": "states", "max": 2000, "needed": 2104 }` | The day would pass one of its limits on stored floors, bytes or events (5,000 a day). Send fewer floors, or a day of more than 2,000 events as several ranges. Nothing was stored. | ## When to send one - Every night, the previous service day: it corrects anything an error lost without anyone noticing. - After a known outage or a correction in your system, the range it affected. ## Exit times A check-in (`seated` or `reservation_seated`) may carry `exitAt`, in pushes and in backfills: when the party leaves, such as the end of the ticket's paid time. If they leave early, send the same event again, with the same `id`, and the real time. - While your app is heard from (a push or heartbeat in the last 90 seconds), the live view shows the floors you send. - Once it has been silent for 90 seconds, and the day has at least one check-in with `exitAt`, the live view estimates each zone: your last count, less the people of earlier check-ins whose `exitAt` has passed since. It never goes below 0; a zone being reset and a zone without a count are left as they were. - The people in a check-in are its `detail`'s number (`"3 covers"` or `"3 guests"`), else 1. - The viewer then reads “Estimated hh:mm from exit times” where it usually says “Refreshes every 10 s”. Replays of past days are never estimated. - When your app is back, the heartbeat that ends the silence answers `"needFullState": true`: send a feed push with the day's events. ## Related - [Live updates](https://floorplancraft.com/docs/live-updates.md) - [Signing requests](https://floorplancraft.com/docs/signing-requests.md) - [Disconnect and errors](https://floorplancraft.com/docs/disconnect-and-errors.md) --- Source: https://floorplancraft.com/docs/backfill-and-exit-times · Updated 2026-11-07 --- # Embedding the live view > Show the venue's live 3D floor inside your app: mint a short-lived embed address, frame it, renew it when it expires, or frame the plan alone. There are two embeds. The live embed shows the floor with live status and a replay of stored days. The plan embed shows the plan alone. Both are view-only, and only your origins may frame them. ## Get a live embed address Your server asks for an address with a signed request, as in [Signing requests](https://floorplancraft.com/docs/signing-requests.md): ```http POST /api/live/embed-tokens HTTP/1.1 Host: floorplancraft.com Content-Type: application/json X-FPC-Connection: lc_8sKq2mXvT0bN4yR7wE1uZa X-FPC-Timestamp: 1794054600 X-FPC-Signature: v1=<64 lowercase hex characters> {"ttlSeconds":43200} ``` The body is empty, `{}`, or `{ "ttlSeconds": n }` with n a whole number from 60 to 43200. The default and the longest is 43200 seconds, 12 hours. The answer is `200 OK`: ```json { "url": "https://floorplancraft.com/live/embed/", "expiresAt": "2026-11-08T00:30:00.000Z" } ``` - Mint on your server and hand only `url` to the browser. The token in it opens this one connection's live view until `expiresAt`. - Limits: a 4 KB body; 10 addresses at once, then 30 an hour per connection. - Any other field, or a `ttlSeconds` out of range, answers `422` with `"error": "invalid_request"`. - Like a push, it answers `402` while the workspace does not have Live 3D. ## Frame it ```text ``` - Give the frame a definite height, such as `72vh`. The view fills it: its heading and replay controls stay on screen, and the 3D floor takes the rest, at least 240 px. A frame without a height gets the browser's 150 px default. - Only your connection's `embedOrigins` may frame the live embed. Every other FloorPlanCraft page refuses to be framed. - The view uses your app's words: a booking app's view says **In use** and **Cleaning**, a play venue's says **Playing**, **Empty** and **Closed**. ## Address options | Add | Effect | | --- | --- | | `?chrome=compact` | Leaves out the view's own eyebrow and large venue name, for a page that already has a header. **Live** or **Last seen** and the **Service day** picker stay. | | `?labels=busy` | Starts with floor labels only on zones that are not free, and on stations | | `?labels=off` | Starts with no floor labels | Combine them as `?chrome=compact&labels=busy`. Only these exact values count; anything else gives the default, the full heading and labels on every zone. A viewer can change labels with the view's **Labels** menu; their browser remembers that choice and uses it instead of `?labels=`. ## When it expires At `expiresAt` the view shows a notice and posts this message to the page that frames it: ```json { "type": "fpc:embed-expired" } ``` Mint a new address on your server and set the frame's `src`: ```ts const frame = document.querySelector("#live-floor")!; window.addEventListener("message", async (event: MessageEvent) => { if (event.origin !== "https://floorplancraft.com" || event.source !== frame.contentWindow) return; if (event.data?.type !== "fpc:embed-expired") return; // Your own server route, which calls POST /api/live/embed-tokens and returns { url }. const response = await fetch("/api/floorplancraft/live-embed", { method: "POST" }); const { url } = (await response.json()) as { url: string }; frame.src = url + "?chrome=compact"; }); ``` ## When it closes Disconnecting, a lapsed Live 3D subscription, or unsharing or deleting the plan closes open live embeds within a minute: the view says it is no longer available. Addresses minted for a connection also stop working when a new connection replaces it. ## The plan embed `planEmbedUrl` from the code exchange is the plan alone, view-only: `https://floorplancraft.com/embed/`. Add `?view=3d` for the 3D view; the default is `?view=2d`. - You do not mint it, and it does not expire. Unsharing or deleting the plan closes it. - It may be framed from the plan's allowed origins. The code exchange adds your `embedOrigins`, and the venue owner can edit the list in the plan's **Share** dialog. Disconnecting removes the origins your connection added, unless the owner or another connection added them too. - Use it as a preview while pushes answer `402`. > **Note:** Neither embed shows FloorPlanCraft's notice that the plan is a concept layout. Inside your frame, your app's own terms apply. ## Related - [Table clicks and highlights](https://floorplancraft.com/docs/table-clicks-and-highlights.md) - [Live updates](https://floorplancraft.com/docs/live-updates.md) - [Disconnect and errors](https://floorplancraft.com/docs/disconnect-and-errors.md) --- Source: https://floorplancraft.com/docs/embed-the-live-view · Updated 2026-11-07 --- # Table clicks and highlights > Messages between the 3D embeds and your page: learn which table a guest clicked, and colour the tables your app offers, selects or blocks. The 3D view of both embeds talks to the page that frames it with `window.postMessage`. Your app draws every card, form and decision. FloorPlanCraft only reports which table was clicked and colours the tables you name. For a booking app the tables are its areas, and for a play venue its zones. Every message is a plain object with a `type` and `"v": 1`. Unknown types and fields are ignored on both sides. ## Messages from the embed | `type` | When | Message | | --- | --- | --- | | `fpc:ready` | Once per load, when the scene is drawn and its tables can be clicked; again when the scene reloads | `{ "type": "fpc:ready", "v": 1, "tables": ["T1", "T2"] }` | | `fpc:table-click` | A click or tap on a table | `{ "type": "fpc:table-click", "v": 1, "label": "T7" }` | | `fpc:embed-expired` | The live embed's address expired | `{ "type": "fpc:embed-expired" }` | - `tables` in `fpc:ready` and `label` in `fpc:table-click` are zone names exactly as the plan draws them, in plan order. - The tables are the zones of the shown level whose names your pushes report as tables, compared ignoring case. Stations and other zones never are. - In the live embed, the scene reloads when the viewer moves the replay to another stored minute, presses **Live** or picks another service day. `fpc:ready` waits for the first floor, and does not come while a replay plays. ## What counts as a click One press and release of the primary mouse button, or of one finger, that never moves 6 CSS pixels or more. Orbiting, panning, wheel or pinch zoom and a second finger are never clicks. The table, its chairs and the zone's floor inside its outline all count as that table; a wall in the way does not, unless the view's see-through walls are on. A click only posts the message: the view opens nothing itself. ## Messages to the embed | `type` | Message | Effect | | --- | --- | --- | | `fpc:highlight` | `{ "type": "fpc:highlight", "v": 1, "tables": [{ "label": "T2", "state": "available" }, { "label": "T7", "state": "selected" }], "dimOthers": true }` | Replaces the whole highlight | | `fpc:focus` | `{ "type": "fpc:focus", "v": 1, "label": "T7" }` | Eases the camera to frame that table in 450 ms, at once with reduced motion, keeping its direction. A press on the view stops it. An unknown label does nothing. | | `state` | Look | | --- | --- | | `available` | A raised white band with dark edges along the zone's edge, and a pointer cursor over it | | `selected` | A wide violet outline and a low, see-through violet fence around the zone | | `unavailable` | A pale, see-through veil over the zone and what stands in it | - `"dimOthers": true` veils every table not in the list. - `"tables": []` clears everything, whatever `dimOthers` says. - Labels are matched ignoring case. A label with no table is ignored, and a later entry for the same table wins. - In the live embed, the highlight sits on each zone's edge or is see-through, so the live colour stays readable. - A highlight stays in that frame only: it is never stored or seen by another viewer. It lasts through live updates and replay moves until you replace or clear it; a reload starts with none. - Limits: at most 500 entries; each `label` 1 to 64 characters and not blank; `state` one of the three above; `dimOthers` a boolean when present; `v` exactly `1`. A message that breaks any of them is ignored whole, without an error. ## Example ```ts const ORIGIN = "https://floorplancraft.com"; const frame = document.querySelector("#live-floor")!; function send(message: object): void { frame.contentWindow?.postMessage(message, ORIGIN); } window.addEventListener("message", (event: MessageEvent) => { if (event.origin !== ORIGIN || event.source !== frame.contentWindow) return; const message = event.data as { type?: string; tables?: string[]; label?: string }; if (message.type === "fpc:ready") { // Offer the tables that are free in your app, and fade the rest. send({ type: "fpc:highlight", v: 1, tables: [{ label: "T2", state: "available" }], dimOthers: true }); } if (message.type === "fpc:table-click" && typeof message.label === "string") { send({ type: "fpc:highlight", v: 1, tables: [{ label: message.label, state: "selected" }], dimOthers: true }); send({ type: "fpc:focus", v: 1, label: message.label }); // Then open your own card for that table. } }); ``` ## Where messages work - The live embed always has them. - The plan embed has them only in its 3D view (`?view=3d`), while a connection that holds the plan's share has Live 3D, and only when the plan's allowed origins name at least one origin. This is decided when the page loads: reload the plan embed when a new session starts. - Without them, the plan embed sends nothing and ignores highlights. Treat no `fpc:ready` within 10 seconds as no 3D picking. ## Security - The embed posts only to `window.parent`, once per allowed origin with that origin as the target, never `"*"`. The allowed origins are your connection's `embedOrigins` for the live embed, and the plan's allowed origins for the plan embed. - It reads a message only from `window.parent`, from one of those origins, and only when the message's shape is exactly right. Anything else is dropped without an error. - Before you trust a message, check that `event.origin` is `https://floorplancraft.com` and that `event.source` is the frame's window. - Only table labels and states cross, in either direction. ## Related - [Embedding the live view](https://floorplancraft.com/docs/embed-the-live-view.md) - [Live updates](https://floorplancraft.com/docs/live-updates.md) --- Source: https://floorplancraft.com/docs/table-clicks-and-highlights · Updated 2026-11-07 --- # Disconnect and errors > Disconnect your app, react when the venue owner disconnects it, and handle every error code, check, rate limit and body limit of the API. Your app can end its connection at any time. This page also lists every error, check and limit of the Live 3D API. ## Disconnect Send a signed `DELETE https://floorplancraft.com/api/connections/self` with no body, signed over zero bytes: ```http DELETE /api/connections/self HTTP/1.1 Host: floorplancraft.com X-FPC-Connection: lc_8sKq2mXvT0bN4yR7wE1uZa X-FPC-Timestamp: 1794054600 X-FPC-Signature: v1=<64 lowercase hex characters> ``` - It answers `204 No Content` and ends the connection. Pushes and embed addresses then answer `403 connection_revoked`, and open live embeds close within a minute. - The origins your connection added to the plan embed's allowed origins are removed, unless the owner or another connection added them too. - A repeat answers `204` again. Disconnect works without Live 3D and after the plan is unshared. Limit: 5 at once, then 5 a minute. - Then delete the `connectionSecret` you stored. ## When the owner disconnects The venue owner can disconnect your app in the plan's **Share** dialog, under **Connected apps**. Unsharing or deleting the plan ends the connection too. Your next signed request gets `403 connection_revoked`: stop pushing, show that the app is disconnected and offer to connect again. ## Error codes | Status | `error` | From | What to do | | --- | --- | --- | --- | | 400 | `invalid_request` | Connect request, code exchange | Fix the body. A connect request names each problem in `issues`; a code exchange leaves the code unused. | | 400 | `invalid_grant` | Code exchange | Start the connect flow again. | | 401 | `unknown_connection` | Signed requests | Check `X-FPC-Connection`. | | 401 | `stale_timestamp` | Signed requests | Send whole Unix seconds and keep your clock in sync. | | 401 | `invalid_signature` | Signed requests | Check the signed text, the key and the bytes you send. | | 402 | `entitlement_required` | Pushes, live embed addresses | The workspace does not have Live 3D: [see below](#live-3d-access). | | 403 | `connection_revoked` | Signed requests | The connection ended or the plan is no longer shared: stop, and offer to connect again. | | 403 | `owner_access_required` | Table sync | The person who connected is no longer an editor or admin of the workspace. | | 404 | `not_found` | Every request | Live 3D connections are turned off on the server. | | 409 | `conflict` | Table sync | The plan kept changing: try again. | | 413 | `body_too_large` | Signed requests | Send at most `maxBytes`. | | 422 | `invalid_feed` | Pushes | Fix the fields in `issues`. Nothing was stored. | | 422 | `invalid_sequence` | Pushes | `sequence` jumped too far. Nothing was stored. | | 422 | `invalid_backfill` | Backfill | Fix the fields in `issues`. Nothing was stored. | | 422 | `backfill_too_large` | Backfill | The day would pass a limit (`limit`, `max`, `needed`). Send fewer floors or events. Nothing was stored. | | 422 | `invalid_request` | Live embed addresses, table sync | Fix the body. | | 422 | `plan_too_large` | Table sync | The plan would pass a limit. Nothing was added. | | 422 | `unsupported_plan` | Table sync | The plan cannot take these tables: add them in the planner. | | 422 | `unsupported_app` | Table sync | Booking and play venue apps cannot add tables. | | 429 | `rate_limited` | Every request | Wait `retryAfterMs` milliseconds. | | 503 | `unavailable` | Every request | Try again shortly. A code exchange keeps its code. | ## Issues A `400` or `422` with `issues` names each problem: ```json { "error": "invalid_feed", "issues": [{ "path": "tables.3.state", "message": "…" }] } ``` `path` names the field, counting from 0: `tables.3.state` is the fourth table's `state`. An empty `path` means the whole body. A connect request lists up to 50 issues and a push up to 20. ## Live 3D access ```json { "error": "entitlement_required", "entitlement": "live_view", "upgradeUrl": "https://floorplancraft.com/checkout/live-3d?connection=lc_8sKq2mXvT0bN4yR7wE1uZa" } ``` A `402` means the venue's workspace does not have Live 3D. Open `upgradeUrl` in a browser tab for the venue owner, who signs in and subscribes there. Do not parse or build the address yourself. Until then pushes are not stored: show the plan embed instead of the live view. ## Check order Signed requests are checked in this order, and the first failure answers: 1. The connection feature is on (`404 not_found`) and can run (`503 unavailable`). 2. Your server's address has not used up its allowance of failed requests (`429`). 3. `X-FPC-Connection` is `lc_` and 22 base64url characters (`401 unknown_connection`). 4. The body is within the endpoint's size limit (`413 body_too_large`). 5. `X-FPC-Timestamp` is within 300 seconds of the server's clock (`401 stale_timestamp`). 6. The connection exists (`401 unknown_connection`) and the signature matches (`401 invalid_signature`). 7. The connection is active (`403 connection_revoked`). 8. The connection is within its own rate limit (`429`). 9. The workspace has Live 3D (`402 entitlement_required`). 10. The plan is still shared (`403 connection_revoked`). 11. The body is valid (`422`). Failures in steps 3 to 6 count against your server's address. Disconnect skips steps 7, 9 and 10. Table sync skips step 9 and checks its body before step 10. ## Rate limits | Request | Limit | | --- | --- | | Connect request | 20 at once, then 60 an hour from one address (an IPv6 address counts by its /64); 10 at once, then 30 an hour for one install from one address; 120 at once, then 60 a minute from everyone together; at most 1,000 requests waiting for an owner | | Push | 24 at once, then 12 a minute per connection | | Live embed address | 10 at once, then 30 an hour per connection | | Table sync | 6 at once, then 6 a minute per connection | | Disconnect | 5 at once, then 5 a minute per connection | | Failed signed requests and code exchanges | 60 at once, then 60 a minute from one address | Every `429` has `retryAfterMs` in its body and a `Retry-After` header in seconds. ## Body limits | Request | Largest body | | --- | --- | | Connect request | 256 KB; larger is `400 invalid_request` | | Code exchange | 4 KB; larger is `400 invalid_request` | | Push | 512 KB; larger is `413` with `"maxBytes": 524288` | | Live embed address | 4 KB; larger is `413` | | Table sync | 256 KB; larger is `413` | | Disconnect | Send no body | ## Related - [Signing requests](https://floorplancraft.com/docs/signing-requests.md) - [Live updates](https://floorplancraft.com/docs/live-updates.md) - [Connect an app](https://floorplancraft.com/docs/connect-an-app.md) --- Source: https://floorplancraft.com/docs/disconnect-and-errors · Updated 2026-11-07 --- # Using these docs with an AI agent > How a coding agent or chatbot reads FloorPlanCraft's docs as Markdown: llms.txt, llms-full.txt, .md addresses and Accept: text/markdown. Every page of these docs is also plain Markdown, made from the same source as the web page. An AI agent can read it without a browser, and you can give its address to any agent that fetches web pages. ## Where the Markdown is | Address | What it holds | | --- | --- | | `https://floorplancraft.com/llms.txt` | The index: every docs page by section, with a one-line description and its Markdown address | | `https://floorplancraft.com/llms-full.txt` | Every docs page in one file | | `https://floorplancraft.com/docs.md` | The same index as `llms.txt` | | `https://floorplancraft.com/docs/.md` | One page. Add `.md` to any docs address, such as `https://floorplancraft.com/docs/developer-overview.md`. | Open [llms.txt](https://floorplancraft.com/llms.txt) or [llms-full.txt](https://floorplancraft.com/llms-full.txt) to see what an agent gets. An agent can also ask for a docs address with the header `Accept: text/markdown` and get the Markdown instead of the web page: ```bash curl -H "Accept: text/markdown" https://floorplancraft.com/docs/connect-an-app curl https://floorplancraft.com/docs/connect-an-app.md ``` Links inside the Markdown go to other pages' Markdown addresses, so an agent can follow them. Each page ends with the address of its web page and the date it was last checked. ## What to ask an agent - **Answer a question.** "Read https://floorplancraft.com/llms.txt, open the pages you need and answer from them, naming each page you used." - **Connect your own system to Live 3D.** Paste one of the [prompts for coding agents](https://floorplancraft.com/docs/agent-prompts.md): for a play venue POS, a restaurant POS or a booking app. - **Check an integration.** "Compare our FloorPlanCraft integration with https://floorplancraft.com/docs/live-updates.md and list every field or rule we handle differently." - **Find the cause of an error.** "Our pushes get `401 invalid_signature`. Read https://floorplancraft.com/docs/signing-requests.md and check our signing code against its test vectors." ## Good practice - Give the agent the Markdown address rather than the web page: it is shorter and has no menus. - For one task, give it the pages it needs. `llms-full.txt` holds everything, so use it when the agent needs the whole picture. - Ask the agent to name the page behind each answer, so you can check it. - Keep secrets out of the chat. An agent that writes integration code never needs your real `connectionSecret`: it belongs in your server's settings. - These docs give an agent no access to your account. Connecting an app always needs the venue owner to sign in and press **Approve and connect** in a browser. ## Related - [Prompts to connect your system](https://floorplancraft.com/docs/agent-prompts.md) - [Developer overview](https://floorplancraft.com/docs/developer-overview.md) --- Source: https://floorplancraft.com/docs/docs-for-ai-agents · Updated 2026-11-07 --- # Prompts to connect your system > Copyable prompts that tell a coding agent how to connect a play venue POS, a restaurant POS or a booking app to FloorPlanCraft Live 3D. If your venue runs its own software and you use a coding agent on it, paste one of these prompts into the agent. Each one tells the agent which developer pages to read and what to build. ## Before you paste - Draw your venue in FloorPlanCraft and name each table, area or zone the way your system names it. A restaurant can also let FloorPlanCraft make the plan from its tables while connecting. - Run the agent in your system's own code, so it can find where tables, bookings or check-ins are kept. - You can connect before your workspace has Live 3D. The live view starts showing pushes once it does. > **Warning:** The connection secret works like a password for your venue's live data. Each prompt tells the agent to keep it on your server. Check that it never ends up in browser code, logs or your repository, and review the agent's work before you put it live. ## Play venue POS For a ticketing and check-in system that knows how many kids are in each play zone. ```text Connect this play venue's ticketing and check-in system (POS) to FloorPlanCraft Live 3D, so the venue's floor plan shows how many kids are in each play zone, live, and staff can open that 3D view inside this system. Read these FloorPlanCraft developer pages first. They are the contract: follow them exactly, and do not guess fields, limits or error codes. The index of every docs page is https://floorplancraft.com/llms.txt. https://floorplancraft.com/docs/developer-overview.md https://floorplancraft.com/docs/connect-an-app.md https://floorplancraft.com/docs/signing-requests.md https://floorplancraft.com/docs/live-updates.md https://floorplancraft.com/docs/backfill-and-exit-times.md https://floorplancraft.com/docs/embed-the-live-view.md https://floorplancraft.com/docs/table-clicks-and-highlights.md https://floorplancraft.com/docs/disconnect-and-errors.md Build: 1. A "Connect to FloorPlanCraft" action in settings that runs the connect flow with "app": "play": the connect request from our server, the venue owner's approval in the browser, and the code exchange with PKCE (S256). Send our play zones as "tables": "label" is the zone's name and "capacity" its kid capacity, from 1 to 999. Send no stations. 2. After the exchange, compare "zoneLabels" with our zone names and show the owner every zone that does not match. 3. A server job that pushes the floor: a feed push on every change, debounced to 5 seconds, and a heartbeat every 60 seconds. One row per play zone: "state" is "seated" when kids are in it, "free" when it is empty and "reset" when it is closed; "covers" is the number of kids in it now, 0 when it is free or closed. Send "server": null and "stations": []. Count each kid in one zone only. Send check-ins as events ("seated", "reservation_seated", "no_show") with stable ids and a "detail" such as "3 guests". 4. Handle every answer as the docs describe: needFullState, unmatchedLabels, 402 (show the owner the upgradeUrl), 403 connection_revoked (show "Disconnected" and offer to connect again) and 429 (wait retryAfterMs). 5. A "Live floor" screen that frames the live embed. Our server mints the embed address; the page asks our server for a new one when it receives fpc:embed-expired. 6. A "Disconnect" action that calls the signed disconnect endpoint, then deletes the stored secret. Also: - A nightly job that re-sends the previous service day with a backfill (POST /api/live/backfill: the floor at each change and the day's events), and the same for the range of any known outage. - On every check-in event ("seated" or "reservation_seated"), send "exitAt" when we know when the party leaves, and send the event again, same id, with the real time if they leave early. - After any failed push or a restart, send a feed push with the day's events before anything else. Rules: - The connectionSecret stays on our server. Store it encrypted; never send it to a browser, put it in a URL, log it or commit it. Every signed request is made by our server. - Use our existing stack and conventions. - Add tests for the request signing (use the test vectors on the signing page) and for the push body. When you are done, tell me what you built, how to try it, and anything in our system that did not fit the docs. ``` ## Restaurant POS For a POS or table app that knows which tables are seated and what the kitchen is waiting on. ```text Connect this restaurant POS to FloorPlanCraft Live 3D, so the restaurant's floor plan shows live table status and kitchen queues, and staff can open that 3D view inside the POS. Read these FloorPlanCraft developer pages first. They are the contract: follow them exactly, and do not guess fields, limits or error codes. The index of every docs page is https://floorplancraft.com/llms.txt. https://floorplancraft.com/docs/developer-overview.md https://floorplancraft.com/docs/connect-an-app.md https://floorplancraft.com/docs/signing-requests.md https://floorplancraft.com/docs/live-updates.md https://floorplancraft.com/docs/backfill-and-exit-times.md https://floorplancraft.com/docs/embed-the-live-view.md https://floorplancraft.com/docs/table-clicks-and-highlights.md https://floorplancraft.com/docs/disconnect-and-errors.md Build: 1. A "Connect to FloorPlanCraft" action in settings that runs the connect flow with "app": "restaurant": the connect request from our server, the venue owner's approval in the browser, and the code exchange with PKCE (S256). Send our tables as "tables" (label, capacity from 1 to 99, room) and our kitchen or bar stations as "stations", so the owner can also let FloorPlanCraft create the plan from them. 2. After the exchange, compare "zoneLabels" with our table labels and station names and show the owner every one that does not match. 3. A server job that pushes the floor: a feed push on every change, debounced to 5 seconds, and a heartbeat every 60 seconds. Every table with "state" ("free", "seated" or "reset"), "covers" and "openMinutes"; every station with "queue" and "oldestMinutes"; events such as "seated", "paid", "ticket_fired" and "ticket_ready" with stable ids. Send "server": null. 4. When staff add tables in the POS, offer "Add to floor plan", which calls the signed table sync endpoint and shows what was added. 5. Handle every answer as the docs describe: needFullState, unmatchedLabels, 402 (show the owner the upgradeUrl), 403 connection_revoked (show "Disconnected" and offer to connect again) and 429 (wait retryAfterMs). 6. A "Live floor" screen that frames the live embed. Our server mints the embed address; the page asks our server for a new one when it receives fpc:embed-expired. When someone clicks a table in the 3D view (fpc:table-click), open our own card for that table. 7. A "Disconnect" action that calls the signed disconnect endpoint, then deletes the stored secret. Also: - A nightly job that re-sends the previous service day with a backfill (POST /api/live/backfill: the floor at each change and the day's events), and the same for the range of any known outage. - On every check-in event ("seated" or "reservation_seated"), send "exitAt" when we know when the party leaves, and send the event again, same id, with the real time if they leave early. - After any failed push or a restart, send a feed push with the day's events before anything else. Rules: - The connectionSecret stays on our server. Store it encrypted; never send it to a browser, put it in a URL, log it or commit it. Every signed request is made by our server. - Use our existing stack and conventions. - Add tests for the request signing (use the test vectors on the signing page) and for the push body. When you are done, tell me what you built, how to try it, and anything in our system that did not fit the docs. ``` ## Booking app For a salon, clinic or gym booking app that knows which rooms, chairs and staff stations are in use. ```text Connect this booking app to FloorPlanCraft Live 3D, so the venue's floor plan shows which rooms, chairs and staff stations are in use, live, and staff can open that 3D view inside the app. Read these FloorPlanCraft developer pages first. They are the contract: follow them exactly, and do not guess fields, limits or error codes. The index of every docs page is https://floorplancraft.com/llms.txt. https://floorplancraft.com/docs/developer-overview.md https://floorplancraft.com/docs/connect-an-app.md https://floorplancraft.com/docs/signing-requests.md https://floorplancraft.com/docs/live-updates.md https://floorplancraft.com/docs/backfill-and-exit-times.md https://floorplancraft.com/docs/embed-the-live-view.md https://floorplancraft.com/docs/table-clicks-and-highlights.md https://floorplancraft.com/docs/disconnect-and-errors.md Build: 1. A "Connect to FloorPlanCraft" action in settings that runs the connect flow with "app": "booking": the connect request from our server, the venue owner's approval in the browser, and the code exchange with PKCE (S256). Send our bookable areas (rooms, chairs or basins, staff stations) as "tables": "label" is the area's name and "capacity" is 1 for appointments or the class size, from 1 to 99. Send no stations. 2. After the exchange, compare "zoneLabels" with our area names and show the owner every area that does not match. 3. A server job that pushes the floor: a feed push on every change, debounced to 5 seconds, and a heartbeat every 60 seconds. One row per area: "state" is "seated" while a booking is in progress, "free" when the area is free and "reset" during the cleaning time after a booking; "covers" is 1 for an appointment or the booked places for a class; "openMinutes" is the minutes since the booking started. Send "server": null, "stations": [] and one "longSeatedMinutes" for the venue, such as 90. Send events "seated" (a booking starts or the client arrives), "paid" and "no_show" with stable ids. 4. Handle every answer as the docs describe: needFullState, unmatchedLabels, 402 (show the owner the upgradeUrl), 403 connection_revoked (show "Disconnected" and offer to connect again) and 429 (wait retryAfterMs). 5. A "Live floor" screen that frames the live embed. Our server mints the embed address; the page asks our server for a new one when it receives fpc:embed-expired. When someone clicks an area in the 3D view (fpc:table-click), open our own view of that area's bookings. 6. A "Disconnect" action that calls the signed disconnect endpoint, then deletes the stored secret. Also: - A nightly job that re-sends the previous service day with a backfill (POST /api/live/backfill: the floor at each change and the day's events), and the same for the range of any known outage. - On every check-in event ("seated" or "reservation_seated"), send "exitAt" when we know when the party leaves, and send the event again, same id, with the real time if they leave early. - After any failed push or a restart, send a feed push with the day's events before anything else. Rules: - The connectionSecret stays on our server. Store it encrypted; never send it to a browser, put it in a URL, log it or commit it. Every signed request is made by our server. - Use our existing stack and conventions. - Add tests for the request signing (use the test vectors on the signing page) and for the push body. When you are done, tell me what you built, how to try it, and anything in our system that did not fit the docs. ``` ## After the agent is done 1. Start the connection from your system's settings. 2. On the FloorPlanCraft page that opens, sign in, choose your plan and press **Approve and connect**. 3. Open your system's live floor screen and check that every table, area or zone shows its status. 4. If a push reports `unmatchedLabels`, rename the zone in the planner or the label in your system until they match. ## Related - [Using these docs with an AI agent](https://floorplancraft.com/docs/docs-for-ai-agents.md) - [Developer overview](https://floorplancraft.com/docs/developer-overview.md) - [Connect an app](https://floorplancraft.com/docs/connect-an-app.md) --- Source: https://floorplancraft.com/docs/agent-prompts · Updated 2026-11-07 --- # Questions > Short answers about accounts, saving, versions, sharing, exports, blank plans, finishes, the walkthrough, phones and Live 3D. ## Do I need an account? No. As a guest you can use the whole planner, including 3D, the walkthrough and every export. An account lets you save your plans and share a view-only link. See [Accounts and signing in](https://floorplancraft.com/docs/accounts-and-signing-in.md). ## Is my work saved automatically? Not on a timer. Signed in, press **Save plan** in the plan file menu, or the save status beside the plan name; the planner also saves when you leave the 3D view or the walkthrough with unsaved changes, and when you share. As a guest nothing is saved: your plan lives only in the open browser tab until you sign in. See [Save your plan](https://floorplancraft.com/docs/saving-your-plan.md#when-it-saves-by-itself). ## Can I go back to an earlier version of a plan? Not yet. Every save is kept as a new version, but there is no screen to browse or restore older ones. Before a big change, use **Duplicate** in your plan library to keep a copy. See [Save your plan](https://floorplancraft.com/docs/saving-your-plan.md#versions). ## Can I open an exported file in the planner? No. The planner has no import, so a PNG, PDF, SVG or JSON file can't be opened for editing. To keep a plan you can work on, sign in and save it. See [Share and export a plan](https://floorplancraft.com/docs/share-and-export.md#export-files). ## How do I share a plan without letting people edit it? Sign in, press **Share**, then **Create view-only link**, and send the link. Anyone with it can view and walk through the plan without an account; only you can edit it. See [Share and export a plan](https://floorplancraft.com/docs/share-and-export.md#create-a-view-only-link). ## Why doesn't my shared link show my latest changes? A link shows the version you shared, not your later saves. Press **Share** again, or **Save & share** in the plan file menu, to update the same link. See [Keep the link up to date](https://floorplancraft.com/docs/share-and-export.md#keep-the-link-up-to-date). ## How do I stop sharing a plan? Press the plan's name, then **Unshare…** and **Confirm unshare**. The link stops working for good; sharing again makes a new one. Deleting a plan turns its link off too. See [Unshare a plan](https://floorplancraft.com/docs/share-and-export.md#unshare-a-plan). ## Why does a blank plan show playground equipment? A blank plan always uses the indoor playground catalog, so **Add items** shows playground equipment. For any other business, start from that business's template and change its rooms to fit your space. See [Start a plan](https://floorplancraft.com/docs/start-a-plan.md). ## How do I paint walls or change a floor? In the 3D view, press **Materials**, pick a finish and click a wall or floor, or drag it on. In 2D, select a wall, a room or a zone and use the **Finish** section of its card. See [Paint walls and change floors](https://floorplancraft.com/docs/materials-and-paint.md). ## How do I get my mouse back in the walkthrough? Press `Esc`. The walk pauses and gives the pointer back, and it doesn't take the mouse again until you press **Resume**. See [Walk through your plan](https://floorplancraft.com/docs/walk-through-your-plan.md#controls). ## Can I use FloorPlanCraft on a phone? You can open, view and share plans and look at them in 3D on a phone. The drawing tools need a larger screen, and painting in the walkthrough needs a mouse or trackpad. See [A tour of the planner](https://floorplancraft.com/docs/planner-tour.md). ## Is my plan certified? No. A plan is a concept layout for trying ideas and showing them to others. It is not certified architectural, engineering, safety, accessibility or building-code documentation, and its checks are planning guidance. Have a qualified professional review anything you build. See [What FloorPlanCraft is](https://floorplancraft.com/docs/what-is-floorplancraft.md). ## How do I reset my password or delete my account? The app has no password reset or account deletion yet. Write to us from the [Contact page](https://floorplancraft.com/contact), using the email address on your account. See [Accounts and signing in](https://floorplancraft.com/docs/accounts-and-signing-in.md#passwords-and-account-changes). ## What is Live 3D, and what does it cost? Live 3D shows a venue app's tables, bookings or play zones live on your shared plan, with replays of past days. It is paid per venue and billed through Whop; the checkout page shows the price. See [What Live 3D is](https://floorplancraft.com/docs/what-is-live-3d.md). ## Related - [What FloorPlanCraft is](https://floorplancraft.com/docs/what-is-floorplancraft.md) - [Start a plan](https://floorplancraft.com/docs/start-a-plan.md) - [Accounts and signing in](https://floorplancraft.com/docs/accounts-and-signing-in.md) - [Share and export a plan](https://floorplancraft.com/docs/share-and-export.md) --- Source: https://floorplancraft.com/docs/faq · Updated 2026-11-07