Nodes/Create Bounding Box for Notes 1.0/Create Bounding Box for Notes 1.0
ComfyUI Node

Create Bounding Box for Notes 1.0

The Bounding Box Editor for People Who Never Left the Classic Canvas

By 1113800942·Created 6 days ago·Updated 6 days ago· 1
Create Bounding Box for Notes 1.0
  • background
  • bboxes
◄width720►
◄height1280►
◄boxes_json[]►

ComfyUI's core Create Bounding Boxes node has a problem you don't discover until you load it: the box-drawing canvas only exists in the Nodes 2.0 (Vue) frontend. If you quietly stayed on the legacy canvas - because your workflow is several hundred nodes deep and you turned 2.0 off the day it appeared - the node renders with no way to actually draw in it.

This pack fixes exactly that. ClassicCreateBoundingBox, display name Create Bounding Box for Notes 1.0, lets you drag boxes on the classic LiteGraph canvas and hands them to the core node through its optional bboxes input. It doesn't generate anything, doesn't replace the core node, and doesn't touch the core node's files.

That's the design, and it's what confuses everyone at first: this node is not standalone. Its only output feeds the core node, so leave it dangling and it looks completely inert.

How the handoff actually works

The editor stores boxes as fractions of the frame, not pixels - that's what lives in the hidden boxes_json widget, saved with your workflow. On run, Python multiplies those fractions by width and height, clamps to the frame, throws away boxes that collapsed to zero area, and emits [{x, y, width, height, metadata}] in pixels, with metadata holding the type (obj or text), text, description and palette.

Then the core node converts those pixels back into fractions using its own width/height widgets. That round trip is why the author repeats "match the numbers" in the README, in both tooltips and in a comment in nodes.py. Mismatch them and nothing errors - your boxes just land in the wrong place, scaled by the ratio between the two.

Two smaller things, both visible in the source. The editor can pull your background straight off an upstream Load Image before you've run the graph; after a run it falls back to a frame the node saves itself. And the color picker is decorative - palettes ride along in the metadata, but the layout text downstream (the README's example feeds a FLUX 3 Image Layout Prompt node) reads only each box's text and description. A red box means nothing unless you type "girl in a red dress" into that description.

The inputs that matter

You touch three things; only one is a widget.

  • width / height (720 × 1280 by default) - the pixel grid. Set these to the same numbers as the Create Bounding Boxes node you feed. If you're building for 1024 × 1024, change both.
  • background (optional IMAGE) - whatever image the boxes are drawn over. Wire it from your Load Image so the editor shows the real frame instead of a gray rectangle.
  • boxes_json - leave it alone. The extension hides it; the canvas is the editor.

The single output is bboxes (BOUNDING_BOX), which goes into the core node's bboxes input. From there you keep using that node's own preview, bboxes and elements outputs as normal.

Installing it

No dependencies, no model downloads - rare enough to mention. Manager finds it by pack title, or:

cd ComfyUI/custom_nodes
git clone https://github.com/1113800942/comfy-classic-bounding-box
# restart ComfyUI

There's no requirements.txt and nothing pip-installs; the frontend script registers via pyproject.toml ([tool.comfy] web = "web"), so it serves from /extensions/classic-bounding-box/. No Edit boxes button? Hard-refresh before assuming the clone failed.

Where people trip

Nothing changed after you drew boxes. You probably hit 取消 (Esc) instead of 完成, and cancel discards the whole edit without asking. The other silent path is an empty box list: the node logs a warning and passes [], and the core node falls back to whatever box it has stored in its own editor.

Boxes are offset or too small. Width/height mismatch. Check the core node's widgets, not the image you're viewing.

The editor shows a gray empty frame. No background connected and nothing run yet. Your boxes still save fine - they're fractions - you just can't see what you're framing.

You expected masking. Boxes are layout hints, not inpaint masks, and nothing guarantees that content outside a box stays put. If you want pixel-exact control you want a mask from a detector or segmenter plus an inpaint pass. What boxes buy you is the thing regional prompting has chased since 2023: telling a model where a described subject goes instead of hoping attention sorting works out.

One caveat on provenance: this is a one-person, one-node, GPL-3.0 pack published in late 2026 by an author with no other footprint, and this ecosystem has no code review between a git clone and arbitrary Python running on your machine. The upside: a couple hundred lines of Python and one JS file, an easy read before you install. And if you're on Nodes 2.0 already, skip it: use the core node's own editor.

Categoryutilities

Inputs (4)

NameTypeDefaultDescription
widthINT72064–16384Pixel grid width. Must match the width of the Create Bounding Boxes node it feeds.
heightINT128064–16384Pixel grid height. Must match the height of the Create Bounding Boxes node it feeds.
boxes_jsonSTRING[]Boxes drawn in the editor (saved with the workflow). Edited by the canvas.
backgroundoptIMAGEOptional image shown behind the boxes in the editor. Any image works.

Outputs (1)

NameTypeDescription
bboxesBOUNDING_BOXBoxes as [{x, y, width, height, metadata}] for the bboxes input of Create Bounding Boxes.