Nodes/WorkflowUIPlugin/WorkflowUI Link
ComfyUI Node

WorkflowUI Link

One node that turns your ComfyUI workflow into an app form

By jimpi-dev·Created 8 months ago·Updated 7 months ago· 1
WorkflowUI Link
    • 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
    ◄form_labelGeneration parameters►
    ◄type_0►
    ◄name_0►
    ◄type_1►
    ◄name_1►
    ◄type_2►
    ◄name_2►
    ◄type_3►
    ◄name_3►
    ◄type_4►
    ◄name_4►
    ◄type_5►
    ◄name_5►
    ◄type_6►
    ◄name_6►
    ◄type_7►
    ◄name_7►
    ◄input_text_0►
    ◄input_number_00►
    ◄input_image_0▾►
    ◄input_video_0▾►
    ◄input_audio_0▾►
    ◄input_boolean_0false►
    ◄input_text_1►
    ◄input_number_10►
    ◄input_image_1▾►
    ◄input_video_1▾►
    ◄input_audio_1▾►
    ◄input_boolean_1false►
    ◄input_text_2►
    ◄input_number_20►
    ◄input_image_2▾►
    ◄input_video_2▾►
    ◄input_audio_2▾►
    ◄input_boolean_2false►
    ◄input_text_3►
    ◄input_number_30►
    ◄input_image_3▾►
    ◄input_video_3▾►
    ◄input_audio_3▾►
    ◄input_boolean_3false►
    ◄input_text_4►
    ◄input_number_40►
    ◄input_image_4▾►
    ◄input_video_4▾►
    ◄input_audio_4▾►
    ◄input_boolean_4false►
    ◄input_text_5►
    ◄input_number_50►
    ◄input_image_5▾►
    ◄input_video_5▾►
    ◄input_audio_5▾►
    ◄input_boolean_5false►
    ◄input_text_6►
    ◄input_number_60►
    ◄input_image_6▾►
    ◄input_video_6▾►
    ◄input_audio_6▾►
    ◄input_boolean_6false►
    ◄input_text_7►
    ◄input_number_70►
    ◄input_image_7▾►
    ◄input_video_7▾►
    ◄input_audio_7▾►
    ◄input_boolean_7false►

    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, or select. 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 slot seed and 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.

    CategoryWorkflowUI

    Inputs (65)

    NameTypeDefaultDescription
    form_labelSTRINGGeneration parameters—
    type_0COMBO9 options: , text, number, seed, image, video, +3
    name_0STRING—
    type_1COMBO9 options: , text, number, seed, image, video, +3
    name_1STRING—
    type_2COMBO9 options: , text, number, seed, image, video, +3
    name_2STRING—
    type_3COMBO9 options: , text, number, seed, image, video, +3
    name_3STRING—
    type_4COMBO9 options: , text, number, seed, image, video, +3
    name_4STRING—
    type_5COMBO9 options: , text, number, seed, image, video, +3
    name_5STRING—
    type_6COMBO9 options: , text, number, seed, image, video, +3
    name_6STRING—
    type_7COMBO9 options: , text, number, seed, image, video, +3
    name_7STRING—
    input_text_0optSTRING—
    input_number_0optINT00–2147483647—
    input_image_0optCOMBO2 options: , example.png
    input_video_0optCOMBO1 options:
    input_audio_0optCOMBO1 options:
    input_boolean_0optBOOLEANfalse—
    input_text_1optSTRING—
    input_number_1optINT00–2147483647—
    input_image_1optCOMBO2 options: , example.png
    input_video_1optCOMBO1 options:
    input_audio_1optCOMBO1 options:
    input_boolean_1optBOOLEANfalse—
    input_text_2optSTRING—
    input_number_2optINT00–2147483647—
    input_image_2optCOMBO2 options: , example.png
    input_video_2optCOMBO1 options:
    input_audio_2optCOMBO1 options:
    input_boolean_2optBOOLEANfalse—
    input_text_3optSTRING—
    input_number_3optINT00–2147483647—
    input_image_3optCOMBO2 options: , example.png
    input_video_3optCOMBO1 options:
    input_audio_3optCOMBO1 options:
    input_boolean_3optBOOLEANfalse—
    input_text_4optSTRING—
    input_number_4optINT00–2147483647—
    input_image_4optCOMBO2 options: , example.png
    input_video_4optCOMBO1 options:
    input_audio_4optCOMBO1 options:
    input_boolean_4optBOOLEANfalse—
    input_text_5optSTRING—
    input_number_5optINT00–2147483647—
    input_image_5optCOMBO2 options: , example.png
    input_video_5optCOMBO1 options:
    input_audio_5optCOMBO1 options:
    input_boolean_5optBOOLEANfalse—
    input_text_6optSTRING—
    input_number_6optINT00–2147483647—
    input_image_6optCOMBO2 options: , example.png
    input_video_6optCOMBO1 options:
    input_audio_6optCOMBO1 options:
    input_boolean_6optBOOLEANfalse—
    input_text_7optSTRING—
    input_number_7optINT00–2147483647—
    input_image_7optCOMBO2 options: , example.png
    input_video_7optCOMBO1 options:
    input_audio_7optCOMBO1 options:
    input_boolean_7optBOOLEANfalse—

    Outputs (48)

    NameTypeDescription
    text_0STRING—
    text_1STRING—
    text_2STRING—
    text_3STRING—
    text_4STRING—
    text_5STRING—
    text_6STRING—
    text_7STRING—
    number_0INT—
    number_1INT—
    number_2INT—
    number_3INT—
    number_4INT—
    number_5INT—
    number_6INT—
    number_7INT—
    image_0IMAGE—
    image_1IMAGE—
    image_2IMAGE—
    image_3IMAGE—
    image_4IMAGE—
    image_5IMAGE—
    image_6IMAGE—
    image_7IMAGE—
    video_0STRING—
    video_1STRING—
    video_2STRING—
    video_3STRING—
    video_4STRING—
    video_5STRING—
    video_6STRING—
    video_7STRING—
    audio_0STRING—
    audio_1STRING—
    audio_2STRING—
    audio_3STRING—
    audio_4STRING—
    audio_5STRING—
    audio_6STRING—
    audio_7STRING—
    boolean_0BOOLEAN—
    boolean_1BOOLEAN—
    boolean_2BOOLEAN—
    boolean_3BOOLEAN—
    boolean_4BOOLEAN—
    boolean_5BOOLEAN—
    boolean_6BOOLEAN—
    boolean_7BOOLEAN—