PS Workflow Config (PS)
The 'configuration sheet' that makes Photoshop understand your graph
- model
- lora
- image1
- mask1
- image2
- mask2
- image3
- mask3
- image4
- mask4
This is the node that turns a ComfyUI workflow into something a Photoshop user can actually drive, and the README says it plainly: only workflows containing it function properly in the PS plugin's Default mode. The analogy the author uses is a "configuration sheet," and it fits. PS Workflow Config doesn't generate anything - its do_nothing function literally returns nothing at runtime. Its job happens before generation, when the PS frontend loads your workflow JSON, finds this node, and traces every wire attached to it to learn the graph's anatomy: which node is the base model, which is image 1, which inputs control width and height.
That's the mechanism, and it's why it has no output ports. You connect other nodes' outputs into it, and the PS panel reads those connections as instructions for what UI to draw. It's a metadata hub wearing a node's clothes.
The inputs that matter, from the schema:
model(MODEL, required) - your checkpoint loader's MODEL output (or a UNETLoader, as the pack's Flux example does).lora(MODEL, required) - a LoRA loader's MODEL output. Both are required, so with no LoRA you feed the checkpoint's MODEL here too.prompt(STRING, required) - your positive prompt, wired from a primitive.width/height(INT) - whatever controls generation size (primitives, or converted size inputs).image1–image4,mask1–mask4(optional) - the Load Image / Load Image (as Mask) slots; whatever you upload in PS replaces these.neg_prompt(optional STRING) - connect it and PS adds a negative prompt box.img1_req–msk4_req(BOOLEAN, defaulttrue) - the fool-proofing switches.trueshows an orange plus and PS blocks generate if that image isn't uploaded;falseshows a grey plus and the plugin silently deletes the unused node and wiring at generate time.size_logicandlong_side_pixels- the README says don't fill these by hand; the PS panel's "As Img1" checkbox and Size setting control them.
For a beginner the practical recipe is: drop this node in a standard txt2img or img2img graph, wire model, lora, prompt, and a couple of image/mask slots, set the _req toggles to match which slots you want mandatory, and save the workflow to ComfyUI/user/default/workflows/PSflows/ in API format with a filename starting with ( (no (C) prefix - that's for Custom mode). The PS panel then shows fixed image and mask upload slots, and whatever you upload replaces the corresponding loader nodes. Right-click an image slot to extract the canvas or a selection; double-click a layer to run an LLM tagger on it.
Install 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 ComfyUI. First boot auto-clones ComfyUI-Lora-Manager and copies three example workflows, so restart once more after that. No extra Python deps - the pack's pyproject.toml declares none.
The classic failures all come from the two "format" rules: the workflow must be exported in API format (the README stresses this in its very first note), and the filename must start with (. Miss either and PS simply never sees it. The other gotcha is the _req toggles - leave something true that you never supply and generate gets blocked with a popup, which reads as "broken" when it's just the safety catch doing its job. One more thing worth knowing: this is a young pack from a solo author who's upfront that the code is AI-generated, so the ambitious bits (like the smart size logic) can evolve between versions. When in doubt, copy the wiring from the shipped (Flux.2 Klein 9B) example - it shows the full Default-mode configuration in one place.
Inputs (24)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| lora | MODEL | — | |
| prompt | STRING | — | |
| size_logic | BOOLEAN | true | — |
| width | INT | 512 | — |
| height | INT | 512 | — |
| long_side_pixels | INT | 1024256–8192 | — |
| img1_req | BOOLEAN | true | — |
| msk1_req | BOOLEAN | true | — |
| img2_req | BOOLEAN | true | — |
| msk2_req | BOOLEAN | true | — |
| img3_req | BOOLEAN | true | — |
| msk3_req | BOOLEAN | true | — |
| img4_req | BOOLEAN | true | — |
| msk4_req | BOOLEAN | true | — |
| image1opt | IMAGE | — | |
| mask1opt | MASK | — | |
| image2opt | IMAGE | — | |
| mask2opt | MASK | — | |
| image3opt | IMAGE | — | |
| mask3opt | MASK | — | |
| image4opt | IMAGE | — | |
| mask4opt | MASK | — | |
| neg_promptopt | STRING | — |
Outputs (0)
No outputs