C2C Farm Submit — Remote Render
Run a whole workflow on another machine from one node — your graph becomes a render-farm client
- job_id
- result_paths
- info
Here's the honest pitch: C2C_Submit turns your ComfyUI graph into a client that hands a whole workflow to another ComfyUI instance - a LAN workstation, an AKS H100 pool, a RunPod pod - and waits for the result. You paste a workflow in ComfyUI API format into the node, pick a backend, and the pack's C2C Farm spooler does preflight validation, uploads your media, dispatches the job, and pulls the outputs back into a local results folder. It's the closest thing to a distributed render button the ecosystem has without standing up a commercial queue.
The catch, and you should hear it up front: this node is the front door of a subsystem that needs real configuration before it's useful. It's not an "install and go" node - it's the client half of a small render farm. If you already run multiple ComfyUI boxes, it's genuinely great. If you're a single-machine hobbyist, keep reading for the gotchas before you wire it in.
How it works
The submit path in nodes/render_farm.py is a well-structured pipeline. It looks up the backend from renderfarm/config/backends.json, validates the compute profile against what the backend accepts, checks your user's project permissions, parses the pasted prompt JSON, runs a preflight node check against the backend (so you fail fast instead of failing mid-render on the far side), uploads any referenced media through the courier, and spools a Job into the local queue manager. With wait_for_completion on, the node blocks - streaming progress events - until the job finishes, then returns the result paths. With it off, you get the job id immediately and track it in the C2C Farm dashboard or via C2C_JobHistory.
The inputs that matter
- prompt_json - the workflow in ComfyUI API format. Export with "Save (API Format)" and paste the JSON. It accepts a bare
{node_id: {...}}map or a{'prompt': {...}}wrapper. - backend - which registered backend (the list comes from
backends.json). - compute_profile -
heavy_94gb(1 replica per 94GB GPU) orlight_30gb(3 replicas per GPU). - priority (5, 1–10) - higher dispatches first.
- wait_for_completion (true) - block-and-pull, or fire-and-track.
- timeout_minutes (120) - if it exceeds this, the node raises, but the job keeps running.
Outputs: job_id, result_paths, and info (JSON with status and results).
Installing it
Part of Code2Collapse/ComfyUI-CustomNodePacks. ComfyUI Manager → search "CustomNodePacks", or:
cd ComfyUI/custom_nodes
git clone https://github.com/Code2Collapse/ComfyUI-CustomNodePacks.git
Then the farm-specific setup: pip install requests websocket-client (plus a storage SDK only if you use cloud couriers), set the C2C_USER_NAME environment variable to a user defined in renderfarm/config/users.json, and enable at least one backend in renderfarm/config/backends.json.
Gotchas
Three things bite everyone. First: no C2C_USER_NAME set means an immediate fail-loud error - that env var is mandatory, and it must match a user in users.json. Second: a fresh install has zero enabled backends, so your first submit will tell you to configure backends.json. That's the pack refusing to phone random hosts. Third: prompt_json must be genuine API-format JSON - paste a raw workflow you saved from the UI's "Save (API Format)" button, not a PNG. And a genuinely funny one the pack's own config warns about: the local-selftest backend loops back to this ComfyUI, so a blocking self-submit waits behind itself in its own queue. Keep that one on wait_for_completion=false.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt_json | STRING | The workflow to run remotely, in ComfyUI API format (Save (API Format) / the {'node_id': {class_type, inputs}} map). Accepts a bare prompt map or {'prompt': {...}}. | |
| backend | COMBO | Registered compute backend (renderfarm/config/backends.json). | |
| compute_profile | COMBO | Gateway routing profile: heavy_94gb = 1 replica per 94GB GPU, light_30gb = 3 replicas per GPU. | |
| priority | INT | 51–10 | Spool priority — higher dispatches first. |
| project_name | STRING | Audit-log project tag. | |
| wait_for_completion | BOOLEAN | true | On: block until the remote render finishes and pull outputs back into input/c2c_farm_results/<job>/. Off: return the job id immediately and track it in the C2C Farm dashboard. |
| timeout_minutes | INT | 1201–1440 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| job_id | STRING | — |
| result_paths | STRING | — |
| info | STRING | — |