arkennemasis fal · Flux Pro v1 VTO · $0.0375 + $0.005/MP
Virtual try-on that doesn't need a model, a studio, or twelve garments
- human_image
- garment_image
- images
- image_paths
- seed
- has_nsfw_concepts
- prompt
- timings
- info
Virtual try-on, done by a model rather than by a photographer. Two images in - a person, a garment - one image out, with the garment on the person. That's fal-ai/flux-pro/v1/vto, and it's the kind of node that exists because a marketplace needs ten thousand product-on-body shots by Thursday.
It's the one node in this pack's Flux family where the interesting decisions are about your inputs rather than your settings, and where the failure modes are mostly "my source photos were wrong". So let's deal with those first.
Feed it good pictures or don't bother
human_image - the person. The tooltip is specific and worth following to the letter: maximum 2 megapixels, and it recommends staying under 1 MP. The output keeps this image's aspect ratio, so if you feed it a portrait crop you get a portrait result, and there's no aspect ratio box to argue with. A clean, well-lit, mostly front-facing shot works; anything where the body is partly out of frame or hidden behind a bag is asking for trouble.
garment_image - the clothing reference. Maximum 1 MP, recommended around 0.5 MP - small. Here's the trap nobody reads before running it: multiple garments must be merged into a single composite image before submission. There's no "add second garment" socket, no garment list. If you want the jacket and the trousers, you're making that collage yourself in Photoshop or with a ComfyUI ImageComposite node, and then handing over the tile. Plan for that rather than discovering it.
prompt - natural-language styling instructions. This is where you say the things a fit model would do wordlessly: tucked in, layered, sleeves rolled up. Don't re-describe the garment; the reference already did that. Describe the wearing.
seed and output_format round out the required list.
The shape of the job (and what it costs)
This node runs in the pack's universal fal order: inputs checked, cost estimated, images uploaded to fal's CDN (free), one billed call, poll, download into output/fal/fal-ai_flux-pro_v1_vto/. Nothing about the model runs on your machine, so no VRAM is involved and no extra Python packages get installed - the fal wrapper is standard-library only.
Pricing is fiddlier than the other Flux nodes, and it's worth understanding because your input sizes are the cost. $0.0375 for the first input megapixel, then $0.005 per extra input megapixel, plus $0.005 per output megapixel - each input image rounded up independently before the sum. fal's own worked example: two 1024×1024 inputs plus a 1024×1024 output lands at $0.0475. That's the number to keep in your head. Under five cents a try-on is the reason this node exists at all.
max_cost_usd (default $20) is a pre-flight cap - the estimate is checked before anything is uploaded, so an over-budget run is refused rather than billed and regretted. reuse_identical_run (default on) returns the cached result for an identical rerun while the files exist, including across a restart; turn it off when you want a genuinely fresh take from an unchanged graph. max_concurrent (default 1) throttles paid fal calls run-wide - for a batch of 50 try-ons, that sequential default is what keeps you under rate limits, and 2–4 parallel is the sort of thing you raise only after watching it behave.
Outputs
images (IMAGE - into SaveImage, or into another VTO node to stack a second layer), image_paths (the file on disk as a string), seed as an INT, prompt, timings, has_nsfw_concepts, and info - JSON with the request id, the cost estimate that was used, the saved files and fal's full answer.
Install
ComfyUI Manager → comfyui-arkennemasis, or:
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
Restart, then put your key in the .env file next to run_nvidia_gpu.bat:
FAL_KEY=your-key-from-fal.ai/dashboard/keys
There is deliberately no key field on the node - a pasted key gets saved verbatim into any workflow you export.
When the result is bad
Nine times out of ten it's the source photo, not the node. Person shots where the body is occluded, garment shots that are flat-lay on a dark bed, or a composite where the two garments are wildly different scales - all produce nonsense. Crop to around 0.5–1 MP, use plain backgrounds, and check that a human could tell where the sleeves end. If the fit looks right but the fabric looks wrong, that's the five-cent trade: iterate on the prompt with styling words before you touch anything else.
Finally, if ComfyUI restarts mid-job, the paid request isn't gone: it's in output/fal/_requests.jsonl, and the pack's free Recover Result node collects it by id.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Natural-language styling instructions describing how the garment should be worn on the person (e.g. tucked in, layered, sleeves rolled up). | |
| human_image | IMAGE | The URL of the person image that the garment will be applied onto. The output keeps this image's aspect ratio. Maximum 2 megapixels; recommended under 1 MP. | |
| garment_image | IMAGE | The URL of the garment reference image. Maximum 1 megapixel; recommended around 0.5 MP. Multiple garments must be merged into a single composite image before submission. | |
| seed | INT | -1-1–2147483647 | The same seed and the same input will output the same image every time. If not provided, a random seed is used. -1 leaves it to the model. |
| output_format | COMBO | jpeg | The format of the generated image. |
| max_cost_usdopt | FLOAT | 20.00–100000 | Safety cap. If the estimated cost of this run is above this many US dollars the node stops BEFORE sending anything to fal. 0 = no cap. |
| reuse_identical_runopt | BOOLEAN | true | If these exact inputs (the settings AND the same pictures/clips/audio) were already paid for and the files are still in output/fal, return them instead of paying again - also after a ComfyUI restart. Turn off for a fresh take with the same settings. |
| extra_jsonopt | STRING | Advanced: a JSON object merged into the request last, for any fal field this node has no box for. Example: {"seed": 7}. Leave empty normally. | |
| max_concurrentopt | INT | 11–32 | How many paid fal calls may run at the same time in one run, across every fal node. 1 (default) = one after another. This node starts its paid part only while fewer than this many fal calls are running. Once any fal node fails, the ones still waiting are not started, so nothing more is billed. |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| image_paths | STRING | — |
| seed | INT | — |
| has_nsfw_concepts | STRING | — |
| prompt | STRING | — |
| timings | STRING | — |
| info | STRING | JSON: request id, cost estimate, saved files and fal's full answer. |