Dropdown (obvpm)
A list you write yourself, and one source for your whole branch logic
- value
- index
- options
ComfyUI's combo widgets are fixed by whoever wrote the node. Model lists, sampler names, scheduler names - all curated by somebody else, all in a dropdown you can't add a line to. Sometimes you just want a five-item list of your own: which of my three characters, which finishing pass, which output folder, which of the two LoRA stacks.
Dropdown (obvpm) is that, with one twist that makes it more than a toy: it outputs the whole list as well as the selection. That means one node can be the single source of truth for both what the choices are and which one is chosen - and the pack's Lazy Case Switch can be driven entirely off it.
Inputs and outputs
Two widgets, three outputs, nothing hidden:
options- a multiline string, one choice per line. Blank lines are ignored, surrounding spaces trimmed. Default is the eminently testablefirst / second / third.selected- the chosen line, shown as a dropdown built fromoptions. Empty means the first option.value- the selected line, verbatim (STRING).index- its position, counting from 0 (INT).options- the whole list, unchanged (STRING).
The last one is the interesting output. Wire it into a Lazy Case Switch's cases and value into that switch's selected, and the case lines, the branch sockets, their labels and the routing all derive from this one list. Rename a line here and the switch relabels; add one and a new branch socket appears. That's a genuinely better editing experience than typing the same names twice and hoping.
Behaviour worth knowing before you rely on it
Editing the options refills the dropdown immediately. Your existing selection survives if its line is still there.
If the selected line disappears from options, the node refuses rather than falling back. It raises with a clear message naming the missing choice and the remaining ones. That's a design decision, and a good one: silently re-picking the first option would mean a saved workflow generates something different from what it says. Same principle behind its handling of an empty options list - that's an error, not a None.
The index output is there for the "I'd rather branch on a number" crowd. Since core's switches want a boolean or an index, index saves you a string-comparison detour when your choices are ordered anyway.
The mechanism detail that saves you a support thread
The options list lives on the node instance, not in the node's INPUT_TYPES - the frontend hands the combo widget a function that returns the list. Server-side, selected stays a plain string. The practical consequence: if the pack's JavaScript fails to load (frontend update, aggressive adblocker, a WebExtension squashing it), the node degrades into a text field instead of vanishing from your workflow. Saved workflows keep working.
Note that ComfyUI core now ships an experimental Custom Combo node that also offers user-defined options. The difference is representational: Custom Combo keeps its list as widget data, while this one keeps it as a plain multiline string - visible, diffable in the workflow JSON, and wire-able straight into another node's input. That wire-ability is the whole reason to prefer it.
Install
ComfyUI Manager → search comfyui-obvpm, or:
cd ComfyUI/custom_nodes
git clone https://github.com/chanon/comfyui-obvpm
Restart ComfyUI. Category obvpm/values, node id Dropdown (obvpm). No Python dependencies, nothing to download. The (obvpm) suffix on every id landed in 0.2.0 to end a class-id clash, and pre-0.2.0 workflows are migrated automatically on open.
Verdict
For a one-off string you can't be bothered to type, a PrimitiveString is enough. Reach for this when the list is the artifact - when the choices drive a case switch, when you want the index, or when you want the same set of names reused in three places and only typed once. Small node, but it's the one that stops a conditional workflow drifting out of sync with itself.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| options | STRING | first second third | The choices, one per line. Blank lines are ignored and surrounding spaces trimmed. Editing this refills the dropdown. |
| selected | STRING | The chosen line. Shown as a dropdown of the options above; empty means the first option. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| value | STRING | The selected line, verbatim. |
| index | INT | Its position in the list, counting from 0. |
| options | STRING | The whole list, unchanged — wire it into a Lazy Case Switch's 'cases' so both nodes share one source. |