ControlAltAI: Text Bridge
An editable text node that politely overrides whatever fed it
- text_output
A text box you can plug into. The pitch is small and genuinely useful: an automatic captioner or an LLM writes a prompt, you want to keep that pipeline but fix two words before it hits the sampler - and there's no clean node for "take this string, let a human edit it, pass it on." That's this node.
It's the kind of thing you don't know you need until you've queued a Florence-2 caption through a CLIP Text Encode, watched it produce a beautiful wrong prompt, and had to choose between editing the caption file or throwing the whole automation away.
How it works
Two inputs and a rule:
if passthrough_text and (not text_input or text_input == ""):
output_text = passthrough_text
else:
output_text = text_input
So the incoming wire is the base value, and the on-node text field is an all-or-nothing override. Leave the field empty and the caption flows through untouched. Type anything into it and your text is the output - the incoming string is discarded entirely, not merged, not appended.
The or text_input == "" check is exact-string emptiness, which is the part people trip on: a single space is not an empty string, so a stray keystroke in that field will silently replace your caption with a space.
Inputs and outputs
text_input- required, multilineSTRING, default empty. This is the field you type in.passthrough_text- optionalSTRINGthat is force-input-only (it has no widget on the node; it exists purely as a socket).- output
text_output- a singleSTRING.
Wire text_output into whatever wants text: a CLIP Text Encode's text socket (after converting that widget to an input), a save-text node, another string-processing node, or the pack's own Color Filter, which strips black-and-white wording out of tagger captions.
Two ways people actually use it
As a manual edit stop. Florence-2 or a WD tagger or an LLM writes the prompt; Text Bridge sits between it and the encoder; you eyeball the caption, fix a word, queue. The automation still drives; you still get veto power.
As a plain text node. With nothing connected it's just a multiline string box, which is a fine way to keep your negative prompt in one place and fan it out to three encoders.
What it is not: a concatenator. If you want to join two strings, use a concat node - this one picks a winner, it doesn't blend.
Installing it
Part of ussoewwin/ComfyUI-NunchakuFluxLoraStacker: one repo holding a Nunchaku FLUX LoRA stacker, the Florence-2 captioning suite, the ControlAltAI utility set (a Python 3.13 fork of gseth/ControlAltAI-Nodes, hence the hswq_ class prefix) and a TensorRT CCSR upscaler. ComfyUI Manager: search ComfyUI-NunchakuFluxLoraStacker. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/ussoewwin/ComfyUI-NunchakuFluxLoraStacker.git
pip install -r requirements.txt
Restart when it's done. No models, no GPU for this node - but don't shortcut the requirements file, since the pack imports its CCSR dependencies (pytorch-lightning, taming-transformers, omegaconf, einops, open-clip-torch) at load time and a missing one makes every node from the pack vanish. nunchaku is the import-guarded exception.
If something's off
Your incoming caption is being ignored. You have text in the field. Clear it completely - including whitespace - and the passthrough resumes.
It works on one queue and not the next. You left text in it from an earlier edit. There's no "revert to incoming" button; it's literally an empty-string check.
Nothing connects to passthrough_text. That's by design - it's declared with forceInput, so it only ever appears as a socket on the node, never as a field. Connect a string-producing node to it.
The node isn't in your menu. Import failure on the pack; check the console traceback, usually a pip package. Also note the class prefix: a workflow written for the upstream TextBridge class won't bind to hswq_TextBridge.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| text_input | STRING | — | |
| passthrough_textopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| text_output | STRING | — |