WorkflowUI Link
One node that turns your ComfyUI workflow into an app form
- text_0
- text_1
- text_2
- text_3
- text_4
- text_5
- text_6
- text_7
- number_0
- number_1
- number_2
- number_3
- number_4
- number_5
- number_6
- number_7
- image_0
- image_1
- image_2
- image_3
- image_4
- image_5
- image_6
- image_7
- video_0
- video_1
- video_2
- video_3
- video_4
- video_5
- video_6
- video_7
- audio_0
- audio_1
- audio_2
- audio_3
- audio_4
- audio_5
- audio_6
- audio_7
- boolean_0
- boolean_1
- boolean_2
- boolean_3
- boolean_4
- boolean_5
- boolean_6
- boolean_7
WorkflowUI Link is the one graph node in a pack that mostly isn't a graph node. WorkflowUIPlugin is a backend plugin for the WorkflowUI app: it bolts HTTP endpoints onto your ComfyUI server so that app can delete media, browse your output folders, and serve image previews. WorkflowUILink is the piece that lives inside your graph - a form-definition node that tells WorkflowUI which knobs your workflow exposes and where the values plug back in.
If you're not using the WorkflowUI app, save yourself the install - honestly. Standing alone, this node is a pass-through with forty outputs and no opinion. Its whole job is to make a workflow importable into WorkflowUI as an "app": you import the workflow, the app reads this node and renders a form (positive prompt, a seed box, an image upload, a checkbox), and every run of that app feeds those values back into the graph right here. The author launched WorkflowUI on r/StableDiffusion in early 2026, and the use case that stuck was people who run ComfyUI on one machine and want a clean, shareable UI on another device instead of the janky mobile web frontend. This node is how your workflow tells that UI what to ask for.
How it works
The node gives you eight slots. Each slot has two required settings that matter:
type_#- an enum:text,number,seed,image,video,audio,boolean, orselect. This decides what kind of field the app renders and what data it sends.name_#- the label shown in the app. The placeholder has the one magic value: name a slotseedand WorkflowUI treats it as the master seed.
Then there's form_label, the section header the app displays above the fields ("Generation parameters" by default).
Each slot also carries six optional inputs: input_text_#, input_number_#, input_image_#, input_video_#, input_audio_#, and input_boolean_#. That's a lot of widgets for a beginner to eyeball, but the rule is simple: the type you picked decides which input holds the value, and in the graph they all just pass through to the matching output. The one genuinely clever bit in the source: image filenames get loaded from your ComfyUI input directory into real IMAGE tensors (PIL + torch), while video and audio stay as filename strings and booleans get coerced. The run() method itself is a straight relay - no computation, no models.
The outputs are 40 in six blocks: text_0–text_7 (STRING), number_0–number_7 (INT), image_0–image_7 (IMAGE), video_0–video_7 (STRING), audio_0–audio_7 (STRING), boolean_0–boolean_7 (BOOLEAN). Wire them wherever the value belongs - text into CLIPTextEncode, seed into KSampler, the image into a load-image-style input.
Installing it
Two routes, both painless. In ComfyUI Manager, search "WorkflowUIPlugin" and install. Or the manual way:
cd ComfyUI/custom_nodes
git clone https://github.com/jimpi-dev/WorkflowUIPlugin
Then restart ComfyUI - the plugin registers its routes at import time and prints a startup banner confirming it loaded. No requirements.txt, no model downloads, no heavy deps: it leans on torch, PIL, numpy, and aiohttp, all of which ComfyUI already ships. It's also published on the ComfyUI registry under the jimpi publisher, which is what makes the Manager install work.
Where people trip up
- It's useless without the app. Install the plugin, but also run WorkflowUI (there's a Docker image) or you're just carrying a dead node.
- Everything lives on ComfyUI's server. The plugin's endpoints mount on the same port as the ComfyUI frontend, and the app uploads to and reads from ComfyUI's input/output folders - so the two need to actually reach each other, and files you expect in the dropdowns need to be in the right input folder.
- Security is real here. This pack adds a file-delete endpoint to an API that ComfyUI keeps unauthenticated by default. The community has been burned by exposed ComfyUI instances before, so if you set this up for remote access, put auth in front of the port.
You're not likely to need this node unless you've already fallen in love with the WorkflowUI way of running generations. But if that's you, it's the seam that makes your workflows behave like actual applications.
Inputs (65)
| Name | Type | Default | Description |
|---|---|---|---|
| form_label | STRING | Generation parameters | — |
| type_0 | COMBO | 9 options: , text, number, seed, image, video, +3 | |
| name_0 | STRING | — | |
| type_1 | COMBO | 9 options: , text, number, seed, image, video, +3 | |
| name_1 | STRING | — | |
| type_2 | COMBO | 9 options: , text, number, seed, image, video, +3 | |
| name_2 | STRING | — | |
| type_3 | COMBO | 9 options: , text, number, seed, image, video, +3 | |
| name_3 | STRING | — | |
| type_4 | COMBO | 9 options: , text, number, seed, image, video, +3 | |
| name_4 | STRING | — | |
| type_5 | COMBO | 9 options: , text, number, seed, image, video, +3 | |
| name_5 | STRING | — | |
| type_6 | COMBO | 9 options: , text, number, seed, image, video, +3 | |
| name_6 | STRING | — | |
| type_7 | COMBO | 9 options: , text, number, seed, image, video, +3 | |
| name_7 | STRING | — | |
| input_text_0opt | STRING | — | |
| input_number_0opt | INT | 00–2147483647 | — |
| input_image_0opt | COMBO | 2 options: , example.png | |
| input_video_0opt | COMBO | 1 options: | |
| input_audio_0opt | COMBO | 1 options: | |
| input_boolean_0opt | BOOLEAN | false | — |
| input_text_1opt | STRING | — | |
| input_number_1opt | INT | 00–2147483647 | — |
| input_image_1opt | COMBO | 2 options: , example.png | |
| input_video_1opt | COMBO | 1 options: | |
| input_audio_1opt | COMBO | 1 options: | |
| input_boolean_1opt | BOOLEAN | false | — |
| input_text_2opt | STRING | — | |
| input_number_2opt | INT | 00–2147483647 | — |
| input_image_2opt | COMBO | 2 options: , example.png | |
| input_video_2opt | COMBO | 1 options: | |
| input_audio_2opt | COMBO | 1 options: | |
| input_boolean_2opt | BOOLEAN | false | — |
| input_text_3opt | STRING | — | |
| input_number_3opt | INT | 00–2147483647 | — |
| input_image_3opt | COMBO | 2 options: , example.png | |
| input_video_3opt | COMBO | 1 options: | |
| input_audio_3opt | COMBO | 1 options: | |
| input_boolean_3opt | BOOLEAN | false | — |
| input_text_4opt | STRING | — | |
| input_number_4opt | INT | 00–2147483647 | — |
| input_image_4opt | COMBO | 2 options: , example.png | |
| input_video_4opt | COMBO | 1 options: | |
| input_audio_4opt | COMBO | 1 options: | |
| input_boolean_4opt | BOOLEAN | false | — |
| input_text_5opt | STRING | — | |
| input_number_5opt | INT | 00–2147483647 | — |
| input_image_5opt | COMBO | 2 options: , example.png | |
| input_video_5opt | COMBO | 1 options: | |
| input_audio_5opt | COMBO | 1 options: | |
| input_boolean_5opt | BOOLEAN | false | — |
| input_text_6opt | STRING | — | |
| input_number_6opt | INT | 00–2147483647 | — |
| input_image_6opt | COMBO | 2 options: , example.png | |
| input_video_6opt | COMBO | 1 options: | |
| input_audio_6opt | COMBO | 1 options: | |
| input_boolean_6opt | BOOLEAN | false | — |
| input_text_7opt | STRING | — | |
| input_number_7opt | INT | 00–2147483647 | — |
| input_image_7opt | COMBO | 2 options: , example.png | |
| input_video_7opt | COMBO | 1 options: | |
| input_audio_7opt | COMBO | 1 options: | |
| input_boolean_7opt | BOOLEAN | false | — |
Outputs (48)
| Name | Type | Description |
|---|---|---|
| text_0 | STRING | — |
| text_1 | STRING | — |
| text_2 | STRING | — |
| text_3 | STRING | — |
| text_4 | STRING | — |
| text_5 | STRING | — |
| text_6 | STRING | — |
| text_7 | STRING | — |
| number_0 | INT | — |
| number_1 | INT | — |
| number_2 | INT | — |
| number_3 | INT | — |
| number_4 | INT | — |
| number_5 | INT | — |
| number_6 | INT | — |
| number_7 | INT | — |
| image_0 | IMAGE | — |
| image_1 | IMAGE | — |
| image_2 | IMAGE | — |
| image_3 | IMAGE | — |
| image_4 | IMAGE | — |
| image_5 | IMAGE | — |
| image_6 | IMAGE | — |
| image_7 | IMAGE | — |
| video_0 | STRING | — |
| video_1 | STRING | — |
| video_2 | STRING | — |
| video_3 | STRING | — |
| video_4 | STRING | — |
| video_5 | STRING | — |
| video_6 | STRING | — |
| video_7 | STRING | — |
| audio_0 | STRING | — |
| audio_1 | STRING | — |
| audio_2 | STRING | — |
| audio_3 | STRING | — |
| audio_4 | STRING | — |
| audio_5 | STRING | — |
| audio_6 | STRING | — |
| audio_7 | STRING | — |
| boolean_0 | BOOLEAN | — |
| boolean_1 | BOOLEAN | — |
| boolean_2 | BOOLEAN | — |
| boolean_3 | BOOLEAN | — |
| boolean_4 | BOOLEAN | — |
| boolean_5 | BOOLEAN | — |
| boolean_6 | BOOLEAN | — |
| boolean_7 | BOOLEAN | — |