KoO.IdeogramBoxy
Ideogram 4's Prompting Without the Typing
- layout_json
- final_json_prompt
- preview_image_with_boxes
- width
- height
Ideogram 4 doesn't take prompts the way you're used to. It was trained on structured JSON captions, so plain prose - the thing that works on every other model you own - measurably underperforms on it. What it wants is a caption object with a high-level description, a style block, and a list of composition elements that each carry a type, a bounding box in pixels, and a description. Boxes can overlap and nest, and text elements can each carry their own colours and font. That's real regional control, and it's a horrific thing to type by hand more than twice.
KoO.IdeogramBoxy is one of the community's answers to that: a canvas node where you draw boxes, label them, pick a composition preset, and get back valid JSON. First-party or not, it's doing the same job as Kijai's well-known prompt builder - turning the schema into something drawable.
What comes out of it
One input, layout_json (type IDEOGRAM_LAYOUT) - serialized layout state, edited through the canvas widget rather than typed. The tooltip says so plainly: "Edit it with the canvas widget."
Four outputs:
final_json_prompt(STRING) - the caption JSON, pretty-printed. This goes into your text encode.preview_image_with_boxes(IMAGE) - the rendered canvas with guides and visible boxes, as a preview. It's a diagram, not a render.widthandheight(INT) - the resolved pixel dimensions of the layout.
The JSON it builds has three top-level keys, matching the model's schema: high_level_description, style_description (aesthetics, lighting, medium, composition) and compositional_deconstruction (a background string plus an elements array). Each element is {"type": ..., "bbox": [x1, y1, x2, y2], "desc": ...} with the box converted from normalized canvas coordinates into real pixels using the layout's width/height. Description text is assembled from the box's label, its prompt, the exact text for text boxes, an Importance: 0.85 weight line, and any "Avoid:" line from the box's negative prompt.
The couple of things you actually choose
Ten presets ship with it - Golden Ratio, Rule of Thirds, Archviz Hero, Cinematic Close-Up, Luxury Product, Fashion Editorial, Character Sheet, Movie Poster, YouTube Thumbnail, Product Ad - and each seeds the canvas with pre-placed boxes and "prompt DNA" text (a high-level hint, plus aesthetics/lighting/medium defaults). Pick a preset first; editing an empty layout by hand is the slow way in.
Box types matter more than they look. background boxes don't become elements at all - their descriptions get concatenated into the single background string. Everything else is funneled through a type map: text stays text, and object/logo/product/foreground/atmosphere all become obj. If you want a specific element treated specially, use one of those exact type names.
And wire the width/height outputs into whatever makes your empty latent. The boxes are converted to pixels using the layout's own dimensions, so a 1536×864 layout rendered at 1024×1024 has boxes describing a grid you didn't generate. This is the single most common way to get a layout that "doesn't work."
Fitting it into a workflow
Downstream, the JSON goes to a CLIP/text encode for Ideogram 4, preview_image_with_boxes goes to a Preview Image while you build the layout, and width/height go to your resolution node. Upstream: nothing. It's a source node, not a modifier.
Worth knowing before you invest a weekend in it: Ideogram 4 shipped in June 2026 under a non-commercial licence, JSON-only prompting, and a safety filter trained into the weights - it emits a specific refusal image rather than your prompt. Our panel on it has the full story, and the short version is that the JSON path is both the documented conditioning route and the route people use to route around the filter. LoRA production on it stalled within weeks while Krea 2 took the ecosystem. So this node is best understood as the good interface to a model you should decide about on licensing grounds before you build a pipeline around it.
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/kevintronchin-blip/koo-nodes-pack
Restart ComfyUI and hard-refresh the browser - the canvas is a frontend component and a stale cache shows you an empty node. Dependencies are the four ComfyUI already provides (torch, numpy, Pillow, aiohttp); no models, no downloads. It sits in KoO.AI/Ideogram.
The pack's custom canvases need the Legacy / LiteGraph renderer. Under Nodes 2.0 the node registers but its drawing and mouse hooks don't run, per the README's own frontend qualification notes. Also: the pack ships KoO.IdeogramBoxy (Legacy), which is a plain alias of this same class kept so old saved workflows load - if your graph has one, it's the identical node, not an older build.
Troubleshooting
"Layout JSON is invalid." You edited the widget as text. The node validates on input and returns the parse error rather than crashing mid-run; reopen the canvas and fix it there.
Boxes landed somewhere else than you drew. Aspect-ratio mismatch between the layout and the generated image - set the dimension outputs into your latent.
Duplicate node IDs on startup. You have another KoO install registering the same IDs; several of these nodes used to ship as separate repos. Disable the extra copy.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| layout_json | IDEOGRAM_LAYOUT | Serialized visual layout. Edit it with the canvas widget. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| final_json_prompt | STRING | Ideogram-style structured JSON prompt. |
| preview_image_with_boxes | IMAGE | Rendered canvas preview with guides and visible boxes. |
| width | INT | Resolved output width. |
| height | INT | Resolved output height. |