RemRun JSON Sync
The Same Trick, Without the Async
- input_0
- input_1
- input_2
- input_3
- input_4
- input_5
- input_6
- input_7
- input_8
- input_9
- *
- *
- *
- *
- *
- *
- *
- *
- *
- *
This is RemRun JSON's sibling, and the difference is one word in the name. Same inputs, same outputs, same remote-execution machinery - but where RemRun JSON runs its websocket wait asynchronously via asyncio, RemRun JSON Sync just blocks until the remote run finishes. That's the entire distinction.
Which one should you use? Honestly, for most people it doesn't matter. Both nodes sit in ComfyUI's execution thread, both return the same deserialized outputs, and the practical difference is invisible unless you're doing something where the async version's non-blocking behavior matters - and if you're at that level, you already know which side of that trade you want.
What it's for
The Sync variant is the one the pack's main Input node picks when you set its run_sync option. Under the hood, RemRun Input Graph(s) expands into a RemRun JSON node - async by default, Sync when you asked for it. So you'll meet this node as a generated step inside a larger workflow, or when you want a plain, synchronous building block for scripting: send JSON, block, get result. No asyncio plumbing to reason about, one less way for a run to surprise you.
The inputs
Identical to RemRun JSON: remote_url, total_timeout, request_timeout, serialization, the required JSON string, then max_size_mb, gzip_compression, gzip_level, lazily_transfer, skip_lazy_transfer_under_mb, response, ws_compression, forward_progress_messages, is_changed. Ten wildcard inputs, ten wildcard outputs. Set remote_url, paste the workflow into JSON, run.
The one behavioral warning: synchronous means blocking. A remote job that hangs will hold execution for as long as total_timeout allows, and with the default 90 seconds that's a frozen-feeling UI. If you're going to send big video workflows through the Sync node, raise total_timeout deliberately - or reach for the async RemRun JSON instead and let the node scheduler do its thing.
Install is the same shared pack on both machines, websockets plus requests, no models:
cd ComfyUI/custom_nodes
git clone https://github.com/LatentRat/comfy_remote_run
Restart, and it's in the Remote Run menu under "RemRun JSON Sync". If you only ever use the Input node, you may never add this one yourself - that's fine. It's here for when you want the raw synchronous control.
Inputs (24)
| Name | Type | Default | Description |
|---|---|---|---|
| remote_url | STRING | http://127.0.0.1:8189/ | ComfyUI instance URL |
| total_timeout | FLOAT | 90.00–86400 | Timeout for everything total (sending prompt and running) in seconds. 0 to disable. |
| request_timeout | FLOAT | 45.00.1–86400 | Prompt & data post timeout in seconds |
| serialization | COMBO | fancy_safetensors | 3 options: safe_torch_pt, unsafe_torch_pt, fancy_safetensors |
| JSON | STRING | — | |
| input_0opt | * | — | |
| input_1opt | * | — | |
| input_2opt | * | — | |
| input_3opt | * | — | |
| input_4opt | * | — | |
| input_5opt | * | — | |
| input_6opt | * | — | |
| input_7opt | * | — | |
| input_8opt | * | — | |
| input_9opt | * | — | |
| max_size_mbopt | INT | 320–8192 | — |
| gzip_compressionopt | BOOLEAN | false | — |
| gzip_levelopt | INT | 91–9 | — |
| lazily_transferopt | BOOLEAN | false | — |
| skip_lazy_transfer_under_mbopt | FLOAT | 0.30–10240 | Even when lazily transferring inputs is enabled still always transfer inputs smaller than this size in MB directly. |
| responseopt | COMBO | binary | 2 options: base64_result, binary |
| ws_compressionopt | BOOLEAN | false | — |
| forward_progress_messagesopt | COMBO | on | 2 options: on, off |
| is_changedopt | BOOLEAN | false | — |
Outputs (10)
| Name | Type | Description |
|---|---|---|
| * | * | — |
| * | * | — |
| * | * | — |
| * | * | — |
| * | * | — |
| * | * | — |
| * | * | — |
| * | * | — |
| * | * | — |
| * | * | — |