String _O
The String _O Node Is a Ghost — Meet Its Replacement Instead
- STR
String _O is a text-holder node from the old StringSuit days: one multiline input, one string output, nothing else. It doesn't generate, transform, or condition anything. And here's the thing - you probably shouldn't use it. The name shows up in the O/deprecated/string menu because the node ships in the deprecated half of the Quality of Life Suit pack, kept around so old workflows still load. The modern replacement, Text _O under O/utils, does the same job the way current ComfyUI expects.
If you loaded a workflow that has it, fine - leave it be and it'll work. If you're adding it fresh, add Text _O instead.
Why it exists at all
This pack (from omar92, aka Omar, a well-known CivitAI/ComfyUI community member) was one of the earliest "quality of life" suites, and it grew by accretion. The string nodes here predate the current one and pass text around as a custom STR socket - not the standard STRING type. Under the hood the node returns a little dict, {"string": your_text}, rather than a plain Python string. That's fine inside the old node chain: String _O → concat Strings _O → Debug String _O all speak STR fluently.
The catch is ComfyUI matches wires by type name, and STR is not STRING. So you can't plug String _O into a normal CLIPTextEncode prompt input. If that connection refuses to snap into place, it isn't you doing it wrong - the node is speaking a dead dialect. Text _O outputs a proper STRING and drops into any prompt box without drama.
What you actually get
- Input:
string- a multiline text field. That's the whole config surface. - Output:
STR- the text, wrapped in the legacy dict format, for the oldO/string chain only.
So the entire node is: type text, get text. The honest use case is backward compatibility. If a workflow you saved in 2023 references it, you need this pack installed just to load that graph, and the pack's auto-updater (see below) keeps it working without you thinking about it.
Installing it
The node comes with the whole pack, so install the pack once:
cd ComfyUI/custom_nodes
git clone https://github.com/omar92/ComfyUI-QualityOfLifeSuit_Omar92.git
Then restart ComfyUI - a browser refresh isn't enough, the README is explicit about that. Or use ComfyUI Manager and search for "Quality of Life Suit" / QualityOfLifeSuit. Everything lands under the O/ menu. There's no requirements.txt to worry about for the string nodes - they only use PIL and numpy, which ComfyUI already has. The pack does create a config.json on first run and, by default, tries to self-update from GitHub on every startup (it needs pygit2, which it pip-installs itself). You can set "autoUpdate": false if you'd rather control updates.
Gotchas worth knowing
Two things trip people up. First, expect to see QualityOfLifeSuit_Omar92::NSP ready and sometimes Error. No styles.csv found. Put your styles.csv in the root directory of ComfyUI. on startup - that's the Noodle Soup Prompts feature complaining, harmless to your string nodes. Second, the pack auto-archives its old standalone files (like the original StringSuit_Omar92.py) into a zip on startup. That's cleanup, not breakage, but if you see a QualityOflife_Backup_*.zip appear in custom_nodes, that's what did it.
The shortcut: if you're building a new workflow and you find yourself reaching for this node, you've grabbed the deprecated one. Take Text _O from the same pack and save yourself the type-mismatch headache.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| string | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| STR | STR | — |