Nodes/toobusy · 너무바쁜베짱이/toobusy Layout Text Overlay
ComfyUI Node

toobusy Layout Text Overlay

When the model can't draw Hangul, draw it yourself

By nicekriss·Created about a year ago·Updated 3 days ago· 16
toobusy Layout Text Overlay
  • image
  • image
overlay_data{"items": []}
font_scale1.00
layout_json

Open models got dramatically better at rendering text over the last year, but Korean specifically is still a crapshoot. Ideogram 4 is the best text-in-image renderer out there and it will still mangle a Hangul headline half the time, because the glyphs are complex and the training data just isn't there. toobusy Layout Text Overlay is the honest fix: instead of betting the prompt gets the letters right, you render the real text on top of the generated image where it stays crisp. It's part of the same toobusy pack that drives the Ideogram4 flow, and it slots in right after generation.

The name is accurate. This is a text overlay node, not a text-to-image node. The frontend is a small editor that appears on the node: drag a text block onto the image, resize it, change the font size, pick a color. The backend renders the same thing with Pillow so what you see in the editor is what lands in the output tensor. Nothing leaves your machine, and you don't need a font model or an API key for any of it.

How it works

The editor state lives in overlay_data, a JSON string that defaults to {"items": []}. Each item is a text block positioned in normalized 0..1 coordinates, so the layout survives resolution changes. The neat bit: if you don't feel like hand-placing anything, connect layout_json and the node seeds the overlay from the type:"text" elements in an Ideogram layout JSON (the kind toobusy Ideogram Prompt Polish produces). Image in, layout in, and you already have the headlines sitting where Ideogram meant them to be.

Inputs and outputs that matter

There are only three required inputs, which is the point:

  • image - your generated image, ideally straight out of an Ideogram4 or Flux T2I node.
  • overlay_data - the editor's serialized state. The custom UI edits this; you mostly leave it alone.
  • font_scale - a single global multiplier (0.1–4, default 1) that scales every text block at once. Handy when you've placed five blocks and then decide the whole thing reads too small.

The one optional input is layout_json, described above. Output is a single image - wire it into Save Image or feed it back into an upscale pass.

Installing it

This ships inside the nicekriss/toobusy pack, so install the pack, not the node. In ComfyUI Manager search "toobusy", or:

cd ComfyUI/custom_nodes
git clone https://github.com/nicekriss/toobusy.git toobusy

Restart ComfyUI and hard-refresh the browser - the editor is frontend JS and stale caches are the classic way this node shows up broken. No extra Python deps: the pack's core requirements are just Pillow, numpy and torch, which you already have.

Where people get burned

Korean glyphs need a font that has them. On Windows the node prefers Malgun Gothic; on Linux it falls back through DejaVu. If your text renders as boxes or tofu, install a Korean font on the system rather than fiddling with the node. And remember the pack's standing caveat: images and layout data are embedded in the workflow JSON, so a board full of blocks makes big files. Fine for your own projects, worth knowing before you share a workflow.

The biggest trap is expecting this to replace prompting. It won't. Ideogram's real strength on 4.0 turned out to be character and IP recall, and you still want the model to place something legible so the overlaid text has the right spot to sit. Use the overlay for the crisp headline, use the prompt for everything that's part of the picture.

Categorytoobusy/Make

Inputs (4)

NameTypeDefaultDescription
imageIMAGE
overlay_dataSTRING{"items": []}
font_scaleFLOAT1.000.1–4Global multiplier on every text block's size.
layout_jsonoptSTRINGOptional Ideogram layout JSON (e.g. from Prompt Polish). Its text elements seed the overlay when the editor is empty.

Outputs (1)

NameTypeDescription
imageIMAGE