ComfyUI Node

Load Bundle

One node instead of ten copies of your workflow

By romanyogurt·Created 2 days ago·Updated a day ago· 0
Load Bundle
    • field_01
    • field_02
    • field_03
    • field_04
    • field_05
    • field_06
    • field_07
    • field_08
    • field_09
    • field_10
    • field_11
    • field_12
    • field_13
    • field_14
    • field_15
    • field_16
    • field_17
    • field_18
    • field_19
    • field_20
    • field_21
    • field_22
    • field_23
    • field_24
    • field_25
    • field_26
    • field_27
    • field_28
    • field_29
    • field_30
    • field_31
    • field_32
    ◄bundle_id►
    ◄slot_spec►

    The problem this solves

    You have a workflow you like. Now you want it as five characters, or five products, or five camera angles - same graph, different prompt, different reference image, maybe a different denoise. So you do what everyone does: duplicate the canvas five times, or spend the evening re-typing a prompt and re-dropping a file into Load Image.

    Load Bundle bets that the inputs are the thing you actually swap and everything else is scaffolding. It keeps each set of inputs as a named bundle - prompt, images, numbers, a switch, even a LoRA name - in a library on your ComfyUI server, and gives you one node that pulls the chosen bundle into the graph.

    The trick is that the node's outputs follow the bundle: select one and you get a socket per field it holds, named and typed after that field. Select another bundle with the same field names and every wire stays put while the values underneath change. No rewiring, and the thing you're iterating on stops being buried in a text widget.

    How it actually works

    Bundles are small JSON files (plus content-hashed media files) under ComfyUI/user/bundle_library/. Each field has a name and a type, and the type maps onto a socket: text becomes STRING, image IMAGE, video VIDEO, audio AUDIO, integer INT, float FLOAT, boolean BOOLEAN. A choice field becomes COMBO - that's what lets a bundle hold "the LoRA" or "the sampler" and wire it straight into another node's dropdown input.

    Under the hood the node declares 32 outputs (field_01 … field_32) typed as the wildcard *, and the frontend throws them away and rebuilds the real set from the selected bundle. That's the any-type escape hatch every switch node leans on - the engine lets a * socket carry anything, so the frontend has to retype each slot. Here it does.

    The caching is what makes it feel built rather than glued together: the node hashes what the outputs carry - a field's value, a file's SHA-256, or why a slot can't be filled. Rename a bundle or change its note and nothing downstream re-runs. Change the prompt and everything after it does.

    The inputs and outputs that matter

    You don't type in either input. bundle_id is the UUID of the selected bundle, set by the selector on the node or the 📚 button that opens the library window; slot_spec is the JSON record of which field each output carries, kept in sync by the node's UI. Both are hidden (declared advanced so Nodes 2.0 tucks them away, hidden outright in the classic renderer). Resist hand-editing them; the panel is the interface.

    What you actually wire are the outputs, field_01 and up - one per field of the current bundle, named after the field. The panel also previews what the bundle holds: thumbnails, playable video and audio, and where each choice's options come from - so you can see what you're about to generate without opening another window.

    Install

    Requires ComfyUI 0.38.0 or newer. Through Manager, search Bundle Library. Or:

    cd ComfyUI/custom_nodes
    git clone https://github.com/romanyogurt/ComfyUI-Bundle-Library
    

    Restart ComfyUI, then reload the browser tab - the pack ships a custom frontend, so a stale tab will complain that the page and the server run different versions. No model downloads, and no dependencies at all: pyproject.toml declares an empty list and there's no requirements.txt. The Pillow and PyAV it decodes image, video and audio with already ship with ComfyUI.

    Where people get burned

    A shared workflow without its bundles is a broken workflow. The node saves the bundle's UUID, not its contents. Export the bundles to a ZIP and import them on the other side - ids survive the round trip.

    Editing a bundle doesn't rebuild the node. Add a field and the panel says Bundle fields changed, with an Update outputs button. It won't remove or retype a socket that has a wire on it - the right call, but you're the one clicking.

    Choices are checked, and they fail hard. A choice holding a LoRA or model this machine doesn't have stops the run at Load Bundle, saying which value isn't among which dropdown's options. Better than a mystery failure three nodes downstream, but expect it when moving workflows between machines.

    It's one day old. 0.1.0 landed on 2026-10-18; the version on disk is 0.2.1, marked BETA. One author, no community track record, and it needs a recent ComfyUI. Back up ComfyUI/user/bundle_library/ before updating.

    Do you need it?

    It sits between rgthree's Context nodes and core Subgraph, and it's not really either. A context object carries model plumbing down one wire; Subgraph collapses a region of graph into a reusable node. Load Bundle carries your inputs as data - the axis that used to be solved with prompt spreadsheets and wildcard files. If you run one prompt over and over, you don't need it. If you've got a folder of reference images and a prompt per character, it's the node. Start from the bundled example: Workflow → Browse Templates, search z-image-turbo, then import the seven example bundles from an empty library.

    CategoryBundle Library

    Inputs (2)

    NameTypeDefaultDescription
    bundle_idSTRINGUUID of the selected bundle. Chosen with the bundle selector.
    slot_specSTRINGWhich field each output carries, in output order. Kept by the node's UI.

    Outputs (32)

    NameTypeDescription
    field_01*—
    field_02*—
    field_03*—
    field_04*—
    field_05*—
    field_06*—
    field_07*—
    field_08*—
    field_09*—
    field_10*—
    field_11*—
    field_12*—
    field_13*—
    field_14*—
    field_15*—
    field_16*—
    field_17*—
    field_18*—
    field_19*—
    field_20*—
    field_21*—
    field_22*—
    field_23*—
    field_24*—
    field_25*—
    field_26*—
    field_27*—
    field_28*—
    field_29*—
    field_30*—
    field_31*—
    field_32*—