Layout Boxes Pixaroma
Stop hoping the model puts things where you asked
- background
- elements
- preview
Ask for "a red chair on the left, a tall window behind it, a cat on the sill" and you'll get most of it, sometimes, in roughly that order. Composition by adjective is the oldest complaint in this hobby - you used to fix it with ControlNet depth passes or regional prompting. Layout Boxes Pixaroma is the lazier route: draw rectangles on a canvas, type what each holds, hand the model a real layout table.
What it actually does
You get a small canvas shaped like the picture you're about to make. Drag to draw a box, drag it to move, grab a corner to resize. Each box gets a number and a description line. Flip a box to Text when it should hold exact words - a sign, a title, a label on a jar - and those go out as literal text instead of a description. Then you write the prompt like this:
a red chair on the left, a tall window behind it, <obj_1> a cat sitting on the sill
<obj_1> is box 1. Box 2 is <obj_2>, and so on.
How it works under the hood
The boxes aren't Python-side state. They live on the node in the browser (node.properties.layoutBoxes), and the frontend's graphToPrompt hook stuffs them into a hidden LayoutState string the Python class reads at run time. The helper clamps the list to 64 boxes and converts each to a normalised bbox - [ymin, xmin, ymax, xmax] on a 0–1000 grid - byte-for-byte what ComfyUI's own Create Bounding Boxes node emits. That's deliberate: elements is a drop-in replacement.
Why the node exists at all is a renderer thing: core's canvas only draws in the Nodes 2.0 look, and this one works in Classic and Nodes 2.0. If you're on the old renderer, that's the whole pitch. One more detail - the pack's source notes FLUX.3 ignores colour for these elements, so the per-box tints are preview decoration, not conditioning.
The inputs and outputs that matter
Three inputs, and honestly only two are decisions:
- width and height (INT, 64 to 16384, step 8). These set the canvas shape and, with a background wired, decide what "left" means in the preview. Wire them from Sizes Pixaroma or Resolution Pixaroma, or whatever sets your latent. This matters more than it looks: boxes are stored as fractions of the canvas, so draw on a 1:1 canvas, run a 16:9 latent, and every box stretches with the aspect change.
- background (IMAGE, optional). Drop a Load Image in and you draw over the actual photo, which beats drawing over grey. From a Load Image it shows straight away; from anything further downstream, only after a run. The canvas then takes the picture's shape.
Outputs:
- elements (ARRAY) - your boxes as prompt elements, position plus whatever you typed. Wire it into FLUX.3 Layout Prompt, on its
elementinput, alongside your prompt; the tooltip also notes Build JSON Prompt (Ideogram) reads it. It won't connect to a text input anyway. - preview (IMAGE) - the boxes over your background, background dimmed, each numbered and labelled. Long edge is capped at 1024, so it's a reference to save beside the result, not a deliverable.
Installing it
ComfyUI Manager finds the pack when you search Pixaroma, but here's the catch: it only offers the old 1.4.144 build - the Registry flagged later versions with no stated reason, and the author says the nodes are fine. Layout Boxes didn't land until v1.4.216 (October 16, 2026), so the Manager copy simply doesn't contain this node. Use git or the Windows Easy-Install:
cd ComfyUI/custom_nodes
git clone https://gitlab.com/pixaroma/comfyui-pixaroma.git
There's a GitHub mirror too, but the README points at GitLab. Restart ComfyUI, then press Ctrl+Shift+R (Cmd+Shift+R on Mac) once in the browser.
Dependencies are a non-event: requirements.txt is one line, imageio-ffmpeg, and that's for the video nodes. Nothing to download for Layout Boxes - the Inter font it draws with ships inside the pack. Find it under 👑 Pixaroma in 💬 Prompt & Text, or double-click the canvas and type layout, boxes, bounding box, regions or flux 3.
Where people get burned
You deleted a box and your prompt went wrong. The preview numbers boxes by their order in the list, and so does <obj_N>. Delete box 2 of five and the old box 3 becomes box 2 - your <obj_3> token now points at something else. Redraw rather than prune from the middle of a set.
Nothing reaches the prompt. Box state arrives through the frontend hook, so a hand-built API-format prompt with this node in it sends no boxes and produces a perfectly valid empty element list. Run it from the canvas, not from hand-rolled JSON.
Empty nodes or missing buttons after an update. The pack's known one: restart, then Ctrl+Shift+R. The README calls it the 5 second fix because it is.
You can't tell which version you're on. Alt+H opens the pack's help window with the version bottom-right, or drop a Version Check Pixaroma node on the canvas. If it says 1.4.144, that's why this node isn't in your search results.
And plainly: if your model doesn't take layout elements, this node won't make it obey. Boxes are a hint the model was trained to read, not a mask - so check your FLUX.3 workflow actually has the layout prompt node in it before you blame your drawing.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| width | INT | 102464–16384 | The width of the picture you will make. With height it gives the canvas its shape. Wire the width of Sizes Pixaroma (or the node that sets your latent size) so they always match. Boxes stay in place when it changes. |
| height | INT | 102464–16384 | The height of the picture you will make. Wire the height of Sizes Pixaroma so the canvas has the same shape as your latent. |
| backgroundopt | IMAGE | Optional. A picture to draw your boxes over, for example the photo an edit model will change. The canvas then takes the picture's shape. From a Load Image it shows right away; from other nodes it shows after a run. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| elements | ARRAY | Your boxes as prompt elements: where each box is and what you wrote in it. Wire it into FLUX.3 Layout Prompt (element), which adds them to your prompt as its layout table. Build JSON Prompt (Ideogram) reads it too. |
| preview | IMAGE | A picture of your boxes with their numbers, over the background when one is wired. Handy to save beside the result or to show what you asked for. |