PS Get (Custom UI)
The passthrough node that builds your Photoshop UI for you
- get
- get
The idea that sells the whole ComfyUI-PS-Connector pack is this: you build a workflow in ComfyUI, and a Photoshop panel builds its own UI around that workflow, automatically. PS Get (Custom UI) is the node that makes it happen. It's a passthrough - it accepts literally anything and outputs it unchanged - but its real job is being a marker. Wherever you drop one, the PS frontend reads the surrounding graph and generates a matching control: a slider, a text box, a model dropdown, an image upload slot. You don't write frontend code. You just splice a node into a wire.
Mechanically it's the most honest node in the pack. ui_label is a STRING whose value becomes the label shown in PS, is_required is a BOOLEAN that (for images/masks) forces the user to supply one before Generate, and get is an any_type input that the passthrough function returns untouched. The get in equals the get out, always, no matter the type. That's it.
The clever part lives in the PS plugin's JavaScript, which reverse-engineers the graph to decide what control to draw:
- Look downstream: if
getconnects toEmptyLatentImage'swidthport, the plugin looks up ComfyUI's node definition, sees it's an INT with a min/max/step, and draws a numeric input with those exact limits. - Look upstream: if it connects to a checkpoint loader, you get a model dropdown (a
MODEL_MARKER). The same trick powers LoRA injection: double-click the model label in PS and up to three LoRA rows appear - pickers, weight sliders, and a "copy trigger word" button - and the plugin stitchesLoraLoadernodes into the workflow JSON at generate time. You never draw a LoRA node in ComfyUI. - Keywords get roles: port names containing
width,height,seed, orprompttrigger special UI. Aseedport, for example, becomes a number box plus a refresh button and a "fixed" checkbox that simulates ComfyUI's randomize. - Pairs get merged: a
WIDTHand aHEIGHTfeeding the same downstream node combine into one row with an×button to swap landscape/portrait (with an area limit so you can't blow past your VRAM budget), and an IMAGE + MASK pair tracing back to the same source merge into a single image slot with a click-to-toggle between image and mask view.
You can even control layout. Name the node's title Row.Column_GroupName - like 1.1_Basic Settings - and PS arranges components into rows and groups; unnumbered nodes sink to the bottom in JSON order.
The one thing to know before you start: this node only works in the pack's Custom mode, which is triggered by naming your workflow file with a (C) prefix (for example (C)(SDXL) Upscale.json) and saving it in API format under ComfyUI/user/default/workflows/PSflows/. Default-mode workflows use a different node (PS Workflow Config) instead. The pack's own (C)(SDXL)A.json example shows the pattern - four PSGetNodes reading from a checkpoint loader, a LoRA loader, and prompts, feeding a sampler.
Inputs you'll actually touch:
ui_label(STRING) - the text shown on the control in PS. Set it to something a human understands, like "Denoise Strength".is_required(BOOLEAN, defaulttrue) - mainly matters for image/mask slots; forces upload before generate.
Installation is the shared pack install: ComfyUI Manager, search "ComfyUI PS Connector", or
cd ComfyUI/custom_nodes
git clone https://github.com/doubley2000/ComfyUI-PS-Connector
then restart. First launch auto-clones ComfyUI-Lora-Manager and copies example workflows, so restart once more after that. No heavy dependencies beyond what ComfyUI ships.
Where people get burned: forgetting the (C) prefix (the plugin silently ignores the workflow), forgetting API-format export, or expecting the control to appear when the node's get isn't connected to anything the plugin can classify. Also keep expectations calibrated - this is a young, solo-authored pack (the author freely admits all the code is AI-generated), and the dynamic UI logic is genuinely ambitious, so edge cases exist. Start from the shipped examples and mutate them.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| ui_label | STRING | — | |
| is_required | BOOLEAN | true | — |
| getopt | * | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| get | * | — |