Nodes/RectumFire/šŸ”„Fire Load Image
ComfyUI Node

šŸ”„Fire Load Image

The Load Image you can actually reach inside a collapsed subgraph

By vladgohnĀ·Created 9 months agoĀ·Updated 6 days agoĀ· 3
šŸ”„Fire Load Image
    • IMAGE
    • MASK
    ā—„image▾►

    Subgraphs solved spaghetti by folding a whole sampler-plus-vae-plus-upscale region into one tidy node. Then everyone hit the same wall: tuck a Load Image inside that folded node and you can no longer feed it. The picture is in there, and the only way to change it is to double-click in and click the widget by hand - every single run.

    šŸ”„Fire Load Image fixes exactly that, and nothing else. It's the core Load Image with one addition: the collapsed subgraph node above it draws the current image as a preview, and you can drag a new file straight onto it to swap the input.

    Why the plain Load Image breaks inside a subgraph

    Promoted widgets were the built-in answer, and on the classic LiteGraph canvas they don't draw on the subgraph node at all - that's upstream ComfyUI_frontend#9859, cited in the pack's README. So a folded node shows you its sockets, zero indication of which image is loaded, and no drop target from outside. Same sharp edge the subgraph crowd grumbles about constantly: as one commenter on r/StableDiffusion (thread 1sjs2bq) put it, subgraphs "don't and won't play nicely with any standard quality of life custom nodes."

    How it actually works

    The Python side is almost insultingly small, and that's the point:

    class RectumFireLoadImage(nodes.LoadImage):
        # Same as the core Load Image; js/fire_banner.js draws the preview on the subgraph node.
        CATEGORY = "RectumFire/Utils"
    

    It subclasses ComfyUI's own LoadImage, so execution is byte-for-byte the core node - same file resolution, same alpha handling, same caching. No reimplementation to drift out of sync.

    The feature lives in js/fire_banner.js, loaded via the pack's WEB_DIRECTORY. That script monkey-patches the LiteGraph node prototype, hooking onDrawForeground, onDragOver, onDragDrop, onMouseDown and getLayoutWidgets on every subgraph host node. When a subgraph contains one or more RectumFireLoadImage nodes, the hook renders an input section at the top of the collapsed host - one rect per loader, side by side - pulling each loader's current value from ComfyUI's /view endpoint with type=input. An empty loader gets a dashed drop image / click placeholder instead.

    Drop a file on it, or click the slot, and the JS POSTs to /upload/image with type=input, then writes the returned name back into that loader's image widget and pushes it into the dropdown's option list. Drop position picks the loader: the rect under your cursor wins, otherwise the first one in the subgraph.

    Inputs and outputs that matter

    One input, image, and it's the same enum as core Load Image - files already sitting in your input folder. No absolute paths, and you don't need them; the upload lives in the preview slot.

    Outputs are IMAGE and MASK, both inherited wholesale from the core node: alpha as a mask (inverted, so transparent reads as 1), or a flat zero mask when the file has no alpha. That's the whole surface - no resize, no batch count.

    Install

    ComfyUI Manager, search RectumFire, or:

    cd ComfyUI/custom_nodes
    git clone https://github.com/vladgohn/ComfyUI-RectumFire.git
    

    Restart ComfyUI, then hard-refresh your browser tab (F5) - this is a frontend extension, and a stale tab will happily keep running the old JS. No pip install, no requirements.txt, no model downloads: pyproject.toml declares zero dependencies and the Python file imports nothing but nodes. Apache-2.0.

    Traps and things that look broken

    It only does anything inside a subgraph. Loose on the canvas it's just another Load Image. The preview is drawn on the host subgraph node, so the loader has to be nested inside one, and the host can't be collapsed either - the draw function bails out on folded nodes.

    Don't click the preview expecting to select the node. A single left-click on the slot opens the file picker, deliberately - double-click opens the subgraph. Drag the host by its title bar instead.

    Uploads fail silently in the UI. If /upload/image returns anything but 200, the script only logs [RectumFire] upload failed to the console. Slot won't update? Open devtools.

    The slot is upload-only. To pick an already-uploaded file by name, promote the image widget with Edit subgraph widgets - the loader's hidden dropdown comes back as a real widget.

    Nodes 2.0 is a real caveat. This is classic-canvas LiteGraph patching, and the README says it was tested on ComfyUI 0.39.2 / frontend 1.53.10, classic canvas. The Nodes 2.0 Vue frontend is where third-party rendering extensions have been breaking across the ecosystem, so if you've switched and see nothing, that's why.

    Should you install it

    If you don't use subgraphs, skip it. If you do - and in 2026 plenty of people do - this is a small, single-purpose fix for a daily irritation, and it pairs well with the pack's Fire Banner preview, which rides the same drawing code.

    Mind what you're adopting: RectumFire is a solo project by vladgohn (Vlad Gohn, UA), at 1.0.54 with a handful of stars, and there's essentially no community discussion of it yet. But the code is readable, the install is trivial, and deleting the folder undoes it entirely - the right way to treat packs at this maturity.

    CategoryRectumFire/Utils

    Inputs (1)

    NameTypeDefaultDescription
    imageCOMBO1 options: example.png

    Outputs (2)

    NameTypeDescription
    IMAGEIMAGE—
    MASKMASK—