RunningHub Image to Image
Your GPU gets the day off — RunningHub Image to Image is cloud img2img
- image
- IMAGE
You've got an image you want remixed - different lighting, another scene, the text swapped out - but the model that does it well is a 20B beast that won't fit on your card. That's the gap RunningHub Image to Image fills. It ships your image up to RunningHub's cloud, lets their backend model do the edit, and hands you the result as a perfectly normal ComfyUI IMAGE tensor. Your GPU barely wakes up. That's the whole pitch, and for anyone on a 4–6GB card or a laptop, it's genuinely useful.
It's one of five nodes in marduk191/comfyui_qwen_runninghub, a port of a webapp called freeqwenimage - the "qwen" in the pack name, because the backend runs a Qwen-based image model on RunningHub's servers (you just don't get to pick which one). Fair warning from the author's own README, which opens with: "This is untested as I have no access to runninghub. It might work, It might not." Read that literally. The code is clean and the API it calls is real, but nobody who shipped it has run it end to end. Test it with one trivial job before you build a pipeline on it.
How it works
The node grabs the first frame of your IMAGE tensor, saves it as a temp PNG in ComfyUI's temp directory, and uploads it to RunningHub's /task/openapi/upload endpoint. It then submits a job carrying the uploaded file's ID plus your prompt, polls /task/openapi/status every three seconds until the task reports SUCCESS, downloads the first result URL, and converts it back into an IMAGE tensor for the rest of your graph. It's async on their side, blocking on yours - your queue sits on the timeout while the job runs. That's normal; a cloud edit is a remote job, not a local one.
The inputs that matter
image- wire in any IMAGE source: a LoadImage node, another generation, or RunningHubLoadImage if it lives at a URL.prompt- what you want done. "Make it a watercolor," "turn night into day," "swap the background for a Tokyo street." Default is a placeholder-y "Transform this image".webapp_id/api_key- from your RunningHub dashboard. Set them as environment variables or paste them straight into the widgets (see below).timeout- seconds to wait before giving up. Default 600, range 60–1800. If RunningHub is queueing, bump it.
Two things you won't find here: no negative prompt (the sibling TextToImage node has one; this one doesn't), and no seed, no size, no model picker. RunningHub's app decides resolution and model, so if it comes back at 1024px and you wanted 2048, there's no lever to pull.
Install
The heavy lifting is all on RunningHub's side, so install is trivial - no model downloads, no GBs of weights. From your ComfyUI root:
cd ComfyUI/custom_nodes
git clone https://github.com/marduk191/comfyui_qwen_runninghub
cd comfyui_qwen_runninghub
pip install -r requirements.txt
Restart ComfyUI and the nodes appear under the "RunningHub" category. ComfyUI Manager may find it if you search the pack title, but it's not published to the official Comfy Registry (the pyproject PR was never merged), so if Manager comes up empty, clone directly. Dependencies are just requests, Pillow, numpy and torch - you almost certainly have them already.
Credentials
Grab a WEBAPP_ID and API_KEY from the RunningHub dashboard, then either set them once in your environment before starting ComfyUI:
export RUNNINGHUB_WEBAPP_ID="your_webapp_id"
export RUNNINGHUB_API_KEY="your_api_key"
…or type them into the node widgets. The env vars just become the widget defaults, read at import time, so a node already loaded won't pick up late changes.
Troubleshooting
The author's untested disclaimer is the root of most surprises, but the common failure modes are predictable. "RunningHub credentials are required" means one of the two fields is empty - check both the widget and the env vars. Timeouts on busy evenings are expected; push timeout to 900 or 1200 and retry. Task failed messages come straight from the API - check the console output, and look first at invalid credentials, an exhausted credit balance, or an upload that bounced. Since the whole thing depends on RunningHub's hardcoded node IDs for each operation, the first thing to suspect if nothing works is that their API contract moved and this conversion hasn't caught up.
Where it fits
Think of it as the middle of a quick pipeline: LoadImage → RunningHub Image to Image → SaveImage, or chain it after a generation you want cleaned up by a stronger model. It's a convenience node for when the local model isn't good enough or won't run at all - not a replacement for doing img2img on your own hardware when you can.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| prompt | STRING | Transform this image | — |
| webapp_id | STRING | — | |
| api_key | STRING | — | |
| timeoutopt | INT | 60060–1800 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |