πͺ Primitive string multiline
Primitive String Multiline (Crystools)
- string
A big multi-line text box that outputs a STRING. It's the sibling of Primitive string, which gets a cramped single line - this one is for anything with actual line breaks: paragraphs, long prompts, a chunk of JSON you're pasting in by hand, notes you want visible in the graph itself.
Why you'd reach for it
Crystools' primitives are deliberately dumb on purpose: instead of one clever node that infers or switches its type, the pack gives you a separate node per type, and you pick the shape you need up front. This is the one to grab whenever the single-line Primitive string field is too small for what you're storing - a system prompt for an LLM node elsewhere in your graph, a long negative prompt you want to define once and fan out to several samplers, or scratch space for pasting a JSON blob you'll later feed into something that parses it.
It's also a reasonable place to keep a shared negative-prompt library if you run the same handful of quality/anatomy negatives across most of your workflows - write it once here, wire it to every sampler that needs it, and update it in one spot instead of five when you find a better negative phrase.
How it works
There's no logic here - it's a widget and an output. Type or paste text into the box, including line breaks, and the exact same text comes out the string socket.
Inputs and outputs
One required field: string, multiline, empty by default. One output: string. That's the entire node.
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, no extra dependencies for this node specifically.
Common issues
It's a passthrough with zero formatting help - no syntax highlighting, no JSON validation - so pasting malformed JSON here won't be caught until whatever's downstream tries to parse it and fails. If you're using this as a JSON staging area, check the text is valid before wiring it further.
The other thing to keep in mind: line breaks survive the trip through this node exactly as typed, which is the whole point, but some downstream nodes that expect a single-line value (a filename, a short label) will choke or behave oddly if you accidentally feed them multi-line text from here. If a downstream node is erroring on a string you built in this node, check for stray newlines first - it's a far more common cause than anything actually wrong with the receiving node.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| string | STRING | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| string | STRING | β |