Recipes
Eight Workflows That Are 90% Identical? Make Them Build Output.
What it is, and why you'd reach for it
You have one pipeline - checkpoint, LoRA, control image, sampler, save - and you need it for a desk, a counter, a crate and a flipping animation, at two canvas sizes each. Eight renders off one graph, differing in three or four values apiece.
The usual answer is eight workflow files that slowly stop being the same workflow. You fix the sampler in one and not the rest. You can't remember which of them has the new VAE. Recipes says: one template, plus a project file holding a block of shared values and one recipe per asset type, and Generate writes out one workflow per recipe. The generated files stop being the thing you edit and become build output, which is a genuinely different relationship with your workflows folder.
How the slots work
A template is an ordinary workflow whose variable nodes are titled recipe:<key>. Title a Load Image node recipe:control_image and whatever image it holds becomes a settable value; same for aspect, seed, prompt. A title ending in ? - recipe:pre_flip? - is a toggle instead: true is active, false is bypassed. That's the whole vocabulary.
Values land according to their shape. A scalar sets the node's first widget. A JSON list ([2, 1]) sets every widget on it. A dict sets promoted widgets by name, which is how you address one field of a subgraph instance. An empty cell is an absent key, so the recipe falls back to shared, and shared falls back to the template's own value.
Capture works off the live canvas: set the values on the template's nodes with their own widgets, type a name into recipe, press capture recipe. A recipe keeps only what differs from shared; shared keeps everything. Names get slugged on the way in - Cashier's Desk 1x1 becomes cashiers-desk-1x1, which is also the suffix of the generated file.
Generate layers each recipe over shared and writes the files beside the template (or into the project's output folder), overwriting the last run; everything is built in memory before anything is written, so a bad row leaves the folder as it was. Generated workflows get an id derived from (project, recipe), so regenerating gives the editor the same workflow rather than a ninth one - fewer stale tabs.
There's an auto toggle, and it's the nicest idea here: it watches the canvas, captures and saves an edit a second after you make it, and on a name change it saves the recipe you're leaving before loading the one you're arriving at.
The input, and the panel
One input: recipe, a string - the recipe Capture writes into, created if new, and the suffix of its workflow's name. Type it, or wire it, and wiring is the interesting case: a wired name is read live through String, Join Strings, Join String Multi and the Asset Focus node's category output, so a name composed from the category you just picked changes as you pick. Wired to a node with no typed text, the panel refuses rather than guessing.
No outputs, and the node is virtual: it never executes, and queueing the graph does nothing for it. Its work is in the panel - new project, capture recipe, save project, generate workflows, delete project (press twice; generated workflows survive), the auto toggle, and load / capture / × per section.
Installing it
Search Symbiotica in ComfyUI Manager, or:
cd ComfyUI/custom_nodes
git clone https://github.com/symbiotica-ai/comfyui-nodes.git symbiotica
pip install -r symbiotica/requirements.txt
Restart, then find Symbiotica/Recipes. No keys, no models - it writes JSON. Projects live at user/default/recipes/<name>.json.
Before your first run: save your template workflow. The project is the one whose template is the open workflow, and New starts from an open, saved workflow. It names the project from the template's recipe:library slot (studios/imperia/bakery becomes imperia-bakery) or from the filename, and refuses to overwrite an existing project.
Where this gets messy
You edited a generated file. The most common way to lose work with this node. Edits belong in the template (the pipeline, shared by everything) or in the project (one recipe's values). Generate overwrites the output.
Stale keys are surfaced, not silent. Generate ignores a key no slot carries and the panel strikes it through, so a renamed slot doesn't block all eight workflows; a recipe name that isn't in the project still fails loudly, and a toggle slot given something that isn't true or false is refused by name. That's the right posture - the alternative is a typo that renders the template's own value at full price.
The node has been renamed twice in a fortnight. The changelog is a run of renames: game to shared, categories to recipes, Recipe to Recipes, and a name input deleted. Old files still read, but any guide older than those entries describes a different node with the same buttons.
Panel rendering, again. Like its sibling Module, this node builds its UI from DOM widgets - the exact third-party shape ComfyUI's Nodes 2.0 Vue frontend rewrite broke, and still unresolved upstream (comfyui-ecosystem.md). If sections don't draw or buttons are dead, use the legacy canvas.
This is the values-and-organization layer, not the pixel layer (comfyui-node-plumbing.md), and the pack has no community footprint to check it against. Back up user/default/workflows/ the first time you press Generate. Template is truth, project is the settings, files on disk are the artifact.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| recipe | STRING | The recipe Capture writes into (created if new); also the suffix of its workflow's name. Type it or connect a text node. |
Outputs (0)
No outputs