πͺ List of strings
List of Strings (Crystools)
- concatenated
- list_string
Up to eight string inputs in, and you get two different shapes back out: one string with everything joined together, and a proper list containing only the slots you actually filled in. Simple node, but it covers two genuinely different jobs at once.
Why you'd reach for it
Use list_string when something downstream wants to iterate over multiple values - multiple prompts, tags, or filenames processed one at a time rather than as a single blob. Use concatenated when you just want one assembled string - building a filename prefix out of parts, or a compound prompt from separate style/subject/lighting fragments you're keeping as individual Primitive string nodes upstream so each piece stays editable on its own.
The README mentions a sibling node, List of any, which does the same up-to-eight-inputs collection but for arbitrary values instead of strings specifically - worth knowing it exists if you ever need a list of numbers or mixed types rather than text, though it isn't covered on this page.
How it works
Whichever of the eight string_* slots you connect or type into get joined together with delimiter to produce concatenated. Separately, the same filled slots (skipping any left blank) get collected into list_string, which is a genuine list type - downstream nodes built to consume a list see each entry individually rather than one combined string.
Inputs and outputs
Optional: string_1 through string_8 (all empty by default - fill in as many as you need, leave the rest alone) and delimiter (default a single space). Outputs: concatenated (STRING) and list_string (a list of strings, only the populated ones).
Installing it
Through ComfyUI Manager, search crystools. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/crystian/ComfyUI-Crystools.git
cd ComfyUI-Crystools
pip install -r requirements.txt
Restart ComfyUI. No models or heavy dependencies for this node.
Common issues
Don't confuse "left disconnected" with "typed an empty string" - a slot you never touched is simply skipped from list_string, so if you're wondering why your list has fewer entries than expected, check which string_* slots actually have something in them rather than assuming a bug.
Also worth remembering: delimiter only affects concatenated. It has zero effect on list_string, which stays a proper array of separate entries no matter what delimiter you set - if you're piping list_string somewhere and it looks joined together, the problem is downstream, not this node.
And if you only ever fill in a couple of the eight slots, that's completely normal usage, not a half-finished setup - the node was built around leaving most of them empty most of the time, with eight slots simply being the ceiling for the rare case you need it.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| string_1opt | STRING | β | |
| string_2opt | STRING | β | |
| string_3opt | STRING | β | |
| string_4opt | STRING | β | |
| string_5opt | STRING | β | |
| string_6opt | STRING | β | |
| string_7opt | STRING | β | |
| string_8opt | STRING | β | |
| delimiteropt | STRING | β |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| concatenated | STRING | β |
| list_string | ListString | β |