Freezable String Combiner
Ten prompt slots, freeze them one by one
- STRING
Freezable String Combiner is the pack's workhorse: up to ten text slots that each get their own freeze toggle, joined into one string on the way out. It's the node you build a whole prompt out of - subject in one slot, style in another, lighting in a third - and then freeze the parts you're happy with while the rest keep changing. If the pack's "Randomize → Preview → Freeze → Iterate" loop is the idea, this is where that loop physically happens.
How it works
Each slot has three moving parts. text_N is the widget - the value you see and the value that gets frozen. input_N is an optional wire input: connect a Random Selector or any other string output to it and it becomes the slot's live value. And freeze_N decides which one wins. Frozen means the widget value is used and the wire is ignored, even if it's connected. Unfrozen means the wire value is used - and if nothing is connected, the slot contributes nothing at all, which the docs call the "flush" behavior.
That last detail matters more than it sounds. It means an unfrozen, unwired slot silently vanishes from the output rather than leaving an empty gap, so you can leave slots "open" for experiments and the combined string stays clean. There's also a global freeze_all toggle at the bottom that locks every slot at once, and a separator (default ", ") between the joined parts. The separator understands escape sequences, so type \n if you want a newline between slots.
After each run, the pack's JS extension pushes the current values back into the text_N widgets - that's how you see what each live slot produced. The frozen values persist in the workflow JSON, so a locked prompt survives saving and reloading.
The inputs that matter
text_N/freeze_N- the widget value and its lock, for slots 1 through 10.input_N- the wire input for each slot; connect selectors here.separator-", "by default, accepts\nand\t.freeze_all- lock everything in one click.
Output is a single STRING - the fully combined prompt, ready for CLIP Text Encode.
Gotchas
When a slot is frozen, its widget is your source of truth, so the classic mistake is freezing a slot and then wondering why editing the connected selector does nothing. That's the feature - uncheck freeze_N to let the wire through again. And remember the flush behavior: a slot with no wire and no freeze contributes nothing, which is by design, but it can look like the node is "eating" text if you forget to connect something.
How to install
The pack is dependency-free - pure Python stdlib plus ComfyUI's own pieces, no models to download:
cd ComfyUI/custom_nodes
git clone https://github.com/Ckrest/comfyui-easy-randomize.git
Restart ComfyUI, or grab "comfyui-easy-randomize" from ComfyUI Manager. It registers under Local Custom/Utilities (not "Easy Randomize" as the README claims). Note the JS extension adds spacer rows between slots for readability - if widgets ever look crowded or the layout feels off, that's this pack's doing.
Where it fits
The power move is wiring each slot's input_N to a different Random Selector and freezing selectively: subject frozen, style frozen, lighting still rolling. You get the "change one variable at a time" discipline the community constantly preaches - but the variable you're changing is a whole prompt slot, and you never retype anything. For a single-slot version, the pack's Freezable Input node does the same trick with less ceremony.
Inputs (32)
| Name | Type | Default | Description |
|---|---|---|---|
| text_1 | STRING | — | |
| freeze_1 | BOOLEAN | false | — |
| text_2 | STRING | — | |
| freeze_2 | BOOLEAN | false | — |
| text_3 | STRING | — | |
| freeze_3 | BOOLEAN | false | — |
| text_4 | STRING | — | |
| freeze_4 | BOOLEAN | false | — |
| text_5 | STRING | — | |
| freeze_5 | BOOLEAN | false | — |
| text_6 | STRING | — | |
| freeze_6 | BOOLEAN | false | — |
| text_7 | STRING | — | |
| freeze_7 | BOOLEAN | false | — |
| text_8 | STRING | — | |
| freeze_8 | BOOLEAN | false | — |
| text_9 | STRING | — | |
| freeze_9 | BOOLEAN | false | — |
| text_10 | STRING | — | |
| freeze_10 | BOOLEAN | false | — |
| separator | STRING | , | — |
| freeze_all | BOOLEAN | false | — |
| input_1opt | STRING | — | |
| input_2opt | STRING | — | |
| input_3opt | STRING | — | |
| input_4opt | STRING | — | |
| input_5opt | STRING | — | |
| input_6opt | STRING | — | |
| input_7opt | STRING | — | |
| input_8opt | STRING | — | |
| input_9opt | STRING | — | |
| input_10opt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| STRING | STRING | — |