Skip to main content
Every option in a ComfyTV stage’s workflow dropdown is a regular ComfyUI workflow (GUI format). There are three ways to add your own — no Python edits in any of them. Link Workflow dialog Under every stage’s workflow dropdown there is a 🔗 Link workflow button. It opens ComfyUI’s own workflow library (the workflows you save in ComfyUI’s Workflows panel) as a searchable folder tree. Click Link next to a workflow and it immediately appears in the dropdown, selected. Why this is the recommended path:
  • Live editing. The stage references the workflow file itself, not a copy. Open the workflow in ComfyUI, edit it, hit save — ComfyTV picks up the change automatically on the next Run. No re-export, no re-import, no restart.
  • One source of truth. You keep organizing your workflows in ComfyUI’s library like you always did; ComfyTV just points at them.
  • Linked entries show a Linked badge in the dialog, where you can also Unlink them again (this removes the entry and its bindings, not the file).
The file must be a GUI-format workflow (a normal Workflow → Save; not “Save (API Format)”).

⬆ Upload workflow

Next to the link button, ⬆ Upload workflow imports a .json file from disk. The workflow is copied into ComfyTV’s library and appears in the dropdown right away — no restart. Use this for a file someone sent you; if it’s a workflow you’ll keep iterating on, prefer linking it instead.

Drop files into the library folder

ComfyTV’s workflow library lives in ComfyUI’s user directory:
The folder decides the kind. Copy a JSON in and restart ComfyUI (or trigger a rescan from the sidebar) and it shows up in the matching stage’s dropdown. The shipped workflows are seeded into this directory on startup; entries that came with ComfyTV carry a builtin badge, and files you’ve edited are never overwritten by updates. The full list of kinds: text, image, shot-images, video, audio, speech, storyboard, panorama, timeline, upscale, outpaint, inpaint, erase, image-edit, multiangle, cutout, multiview, sequence, audio-vocal, audio-bg, model, split-part, material-estimate, speech-to-text. Each shipped kind has a README.md next to its JSONs documenting the run-time inputs and the nodes a workflow typically needs. Read the relevant per-kind README first:

Wiring stage inputs

Once the workflow is in (linked, uploaded, or dropped), you usually need to tell ComfyTV which node receives the stage’s prompt, which LoadImage takes the upstream image, where the seed comes from, etc. Use the sidebar: click a stage on the canvas, fill in each widget in the ComfyTV sidebar on the left. Changes apply immediately, no restart. See sidebar-config-editor.md for the editor UI. To share with someone else: the sidebar has an ⇩ Export preset.json button at the bottom. It packages the current bindings as <name>_preset.json. Ship that alongside the workflow JSON; on the recipient’s first load the bindings apply automatically.
You usually don’t write _preset.json by hand — configure in the sidebar, export to share. If you want the raw JSON shape, look at the shipped examples: workflows/inpaint/flux-fill-inpaint_preset.json, workflows/video/local-ltx-2.3-t2v_preset.json.

Updating a workflow

Linked workflow: just edit and save it in ComfyUI. ComfyTV notices the file changed and re-reads it on the next Run — nothing else to do. Uploaded / dropped workflow: overwrite the JSON under user/comfytv/workflows/<kind>/. ComfyTV detects the file modification time has changed and re-reads it the next time a stage uses it. Either way, bindings keep working as long as the node IDs they reference still exist. If you renamed or removed a node, the runner errors:
inputs references missing workflow node "X" — did the API workflow get re-exported with different node ids?
Open the sidebar and update the binding to point at the new ID.