Nodes/Cozy Combo/Combo Node (cozy)
ComfyUI Node

Combo Node (cozy)

This 'node' generates nothing — it's a teaching toy, and that's the point

By cozy-comfyui·Created about a year ago·Updated about a year ago· 1
Combo Node (cozy)
      comboNONE
      textBLARF

      Let's be straight with you up front: Combo Node (cozy) doesn't do anything. It has no outputs, runs no math, touches no pixels. If you dragged it into a workflow expecting it to help you generate, you'll be staring at a widget with nowhere to go. It's a teaching toy from the author of Jovimetrix (the big Joviex / Amorano utility suite), and it exists to answer one of the most-asked custom-node questions in the community: how do I make a combobox change the other widgets on the same node?

      You'll find it under the _EXAMPLES category in the node menu - the underscore deliberately sorts it to the bottom, out of your way. It's in that folder because that's its job: an example.

      What it actually does

      The pack is two tiny files. The Python side (__init__.py) is a stub that declares two optional inputs:

      • combo - a dropdown with three choices: NONE, SOME, OTHER (default NONE).
      • text - a multiline text box (default "BLARF").

      That's the whole Python surface. The real mechanism lives in web/node/combonode.js, a frontend extension that hooks the node via app.registerExtension and beforeRegisterNodeDef. When the node is created, it grabs the combo and text widgets and assigns a combo.callback. Change the dropdown to SOME and the text box rewrites itself to "Where it is nobler for some to suffer slings and arrows"; OTHER gets a line about writing example code; anything else snaps back to "Snarf says: BLARF, BLARF, BLARF."

      The output is () - literally nothing. The point isn't the data, it's the widget behavior.

      Why you'd install it

      Two reasons, and they're both honest ones.

      First, if you're learning to write custom nodes, this is the cleanest reference for the dynamic-widget trick. The README says exactly that: most repos that do this bury the mechanism in compound setups, so you spend an hour unwinding unrelated code. Here it's two files and ~25 lines of JS. Copy the pattern into your own node: find the widget with this.widgets.find(w => w.name == 'combo'), assign a callback, mutate value on the others.

      Second, if you find the node in a downloaded workflow, now you know it's harmless dead weight - bypass or delete it freely. It has no outputs, so nothing depends on it.

      Installing it

      ComfyUI Manager knows this one (it's registered on the Comfy registry), so search "cozy_combo" in Manager and install. Or clone it by hand:

      cd ComfyUI/custom_nodes
      git clone https://github.com/cozy-comfyui/cozy_combo
      

      Then restart ComfyUI. There are no dependencies, no model downloads, nothing - requirements.txt is empty and pyproject.toml lists zero dependencies. This is about as frictionless as a custom node gets, which is refreshing in an ecosystem that's usually dependency hell.

      Gotchas

      The only real one: because the node's output is empty, you can't connect it to anything, and it will never run during generation - you only see its effect while you're editing. If you cloned the pack to learn, don't be fooled into thinking the combo/text inputs matter for wiring; they're just there so the widget-callback demo has something to mutate. And if a tutorial promises this node "changes other nodes," it means other widgets on the same node - the callback can't reach outside its own node instance without a lot more code. That's the scope of the example, and the scope is the lesson.

      Category_EXAMPLES

      Inputs (2)

      NameTypeDefaultDescription
      combooptCOMBONONE3 options: NONE, SOME, OTHER
      textoptSTRINGBLARF

      Outputs (0)

      No outputs