arkennemasis fal · Flux 2 Turbo · $0.008/MP
Eight tenths of a cent per megapixel, no GPU required
- images
- image_paths
- seed
- prompt
- timings
- has_nsfw_concepts
- info
FLUX.2 [dev] is the model the local scene wanted and mostly couldn't have. BFL shipped it in November 2025 as a 32B rectified-flow transformer with a Mistral vision-language encoder stuck on the front - around 56B of weights end to end, 53GB in fp8. The community verdict was never "it's bad". It was "nobody can run it".
This node is the shortcut around that. Same FLUX.2 [dev] weights, on fal's GPUs, at turbo step counts, billed at $0.008 per megapixel. A 1024×1024 image is 1MP. That's less than a cent per image, which is roughly the cost of the electricity for a local render and none of the setup.
What you get vs. what you lose
You get FLUX.2's realism, its text rendering, and its prompt comprehension without a 53GB download. You lose the local loop: your prompts and images go to fal, which is the trade every API node in ComfyUI makes. If you're generating something you'd rather not upload, run a local model - the whole architecture of a hosted call is that your inputs leave the machine.
Where this node genuinely earns its place is volume. Drafting 40 thumbnails, filling an asset library, running a client's spreadsheet of prompts overnight: at $0.008/MP the numbers barely register, and you can leave your own card rendering something else.
The inputs that matter
prompt is the only one that's actually creative. It's a plain text description, and FLUX.2 is LLM-encoded, so write sentences, not tag soup. Weighting syntax like (word:1.4) and BREAK does nothing on this architecture - it gets fed to the encoder as literal punctuation, which is worse than deleting it. Quality-tag spam burns attention budget for no gain.
guidance_scale defaults to 2.5 and this is the setting people get wrong. It is Flux guidance, not CFG. Setting it to 7 because that's what you do on SDXL doesn't increase prompt adherence - guidance-distilled models already have the extrapolation baked into the weights, so you're applying the correction twice, at double the render time, and cooking the image. Leave it alone until you have a reason.
seed at -1 lets the model pick. Set a number when you want to iterate on a prompt against a fixed composition.
image_size is a combo - landscape_4_3 is the default, plus square, portrait, and custom. custom uses image_size_width and image_size_height below it (both default 1024, both 16-pixel steps, 512–2048 for the model itself).
num_images goes up to 4 per call. Four images at 1024² is about $0.032 - cheap, but it multiplies, and max_concurrent (default 1) means the batch goes out one call at a time unless you raise it.
enable_prompt_expansion is off by default and that's correct. Turn it on and fal rewrites your prompt for you. Great for "cat, sunset, nice" and terrible when you've spent twenty minutes tuning exact wording.
What comes back
images and image_paths are the obvious pair - the IMAGE tensor for the rest of your graph, and the files written to output/fal/fal-ai_flux-2_turbo/. The interesting ones are the diagnostics: seed (the seed actually used, so you can reproduce a good roll), prompt (the prompt after expansion, which is how you discover the expander rewrote you), timings, has_nsfw_concepts, and info - JSON with the request id, cost estimate, saved files, and fal's full answer.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
Restart ComfyUI. Or use ComfyUI-Manager → Install via Git URL. The only dependency the pack declares is httpx (for its Codex nodes); the fal nodes need nothing beyond the standard library, and no model weights are downloaded.
The key is a file, not a widget:
FAL_KEY=your-key-from-fal.ai/dashboard/keys
Put that in the .env next to run_nvidia_gpu.bat in the portable build (or the ComfyUI folder). There's no key box on the node on purpose - keys typed into nodes end up inside workflow JSON.
Gotchas worth knowing before you queue
The one that surprises people: with seed left at -1 and reuse_identical_run on (the default), re-queuing an unchanged graph gives you the cached image back instead of a new random one. Same settings, same inputs, same file, no charge. That's usually exactly what you want in a workflow you're debugging - and it's maddening if you were clicking Queue hoping for a fresh roll. Turn reuse_identical_run off for that.
max_cost_usd (default $20) stops the run before upload if the estimate exceeds it. On a node this cheap you'll never hit it, until you forget num_images is 4 and image_size is custom at 2048.
And if your session dies mid-run, nothing is lost: every request is written to output/fal/_requests.jsonl, and the pack's fal Recover Result node collects a finished job by id without paying for it again.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | The prompt to generate an image from. | |
| guidance_scale | FLOAT | 2.500–20 | Guidance Scale is a measure of how close you want the model to stick to your prompt when looking for a related image to show you. |
| seed | INT | -1-1–2147483647 | The seed to use for the generation. If not provided, a random seed will be used. -1 leaves it to the model. |
| image_size | COMBO | landscape_4_3 | The size of the image to generate. The width and height must be between 512 and 2048 pixels. 'custom' uses the width and height below. |
| image_size_width | INT | 102416–14142 | Width in pixels when image_size is 'custom'. |
| image_size_height | INT | 102416–14142 | Height in pixels when image_size is 'custom'. |
| num_images | INT | 11–4 | The number of images to generate. |
| enable_prompt_expansion | BOOLEAN | false | If set to true, the prompt will be expanded for better results. |
| enable_safety_checker | BOOLEAN | true | If set to true, the safety checker will be enabled. Disabling it requires account authorization; unauthorized requests are always checked, and images flagged as unsafe are returned as black images. |
| output_format | COMBO | png | 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 | — |
| prompt | STRING | — |
| timings | STRING | — |
| has_nsfw_concepts | STRING | — |
| info | STRING | JSON: request id, cost estimate, saved files and fal's full answer. |