arkennemasis fal · Flux 3 Keyframes to Video · $0.17-0.29/s
FLUX 3 with frame-level control
- video
- video_path
- seed
- info
First/last frame gives you two anchors. Keyframes gives you up to ten, each pinned to a specific frame index - which is the closest thing a hosted video model gets to a storyboard you can actually direct. Character turns here, picks up the object there, lands in this pose at the end. You're not prompting motion any more, you're placing it.
ArkFal_blackforestlabs_flux_3_keyframes_to_video is FLUX 3 Video's keyframe endpoint on fal: $0.17/s at 720p, $0.29/s at 1080p, synchronized audio included. FLUX 3 shipped as early access with private weights, so fal is where it runs.
What you set
keyframes- required, and it's a JSON box. A list of objects, each an{image_url, frame_index}pair. Up to 10 keyframes with uniqueframe_indexvalues. The box comes pre-filled with fal's own two-keyframe example so you can see the shape; replace the example URLs with your own image URLs. Frame indices are positions in the output timeline, so0is the first frame and the spacing between them is what sets the pace.duration- defaults to 5, and an explicit duration is required exactly because the model has to validate those frame positions against the clip length. A keyframe at index 120 in a 5-second clip is a contradiction; the node wants to know how long the timeline is before it starts placing things.prompt- the connective tissue: what happens between the anchors.resolution-720p(default) or1080p.generate_audio- on by default, no extra cost.aspect_ratio-auto, or forced.safety_tolerance- 0 to 4, default 2.
The shared optional set: max_cost_usd (default $20, checked before upload; 0 disables), reuse_identical_run (on by default), extra_json, max_concurrent.
Outputs: video, video_path, seed, info.
The honest catch with the JSON box
Where do the image URLs come from? You're pasting links, not connecting IMAGE sockets. In practice you generate your keyframes, save them, host them somewhere fal can read - or use your own fal uploads - and paste the URLs into the JSON. That's friction, and it's not this pack's fault; it's fal's schema for the endpoint.
The pragmatic workflow most people land on: build the whole shot as stills first (this pack has image nodes that can do the editing passes), host them, then fill in the JSON. Since reuse_identical_run defaults to on, once you've paid for a good render, re-running the same graph gives it back to you from disk instead of billing again - which makes the URL gymnastics a one-time cost per shot.
The draft option
ArkFal_blackforestlabs_flux_3_keyframes_to_video_draft does the same thing at $0.06/s and returns a draft cache for draft_enhance to finish. With keyframe shots this matters more than usual: you're likely to re-place anchors two or three times before the pacing feels right, and pacing is exactly the thing you can judge from a 720p draft.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
Restart, or install through ComfyUI Manager by searching arkennemasis. Then:
FAL_KEY=your-key-from-fal.ai/dashboard/keys
in the .env next to run_nvidia_gpu.bat (portable) or in your ComfyUI folder. No key widget on the node - by design, so a key never gets baked into a workflow you share.
Practical notes
The cost estimate reads the duration box and the resolution box, so with both set explicitly the badge in the title is a number you can budget against. Ten seconds at 1080p is $2.90 - set max_cost_usd to something like $6 and let the node stop you rather than letting a typo in the duration box get expensive.
Files land in output/fal/blackforestlabs_flux-3_keyframes-to-video/, every request is logged to output/fal/_requests.jsonl, and a run interrupted by a ComfyUI restart is recoverable free through fal Recover Result with its request id.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | The text prompt describing the video you want to generate. | |
| aspect_ratio | COMBO | auto | Aspect ratio of the generated video. `auto` lets the model choose. |
| resolution | COMBO | 720p | Resolution of the generated video. |
| duration | COMBO | 5 | Duration of the generated video in seconds. An explicit duration is required to validate keyframe positions. |
| generate_audio | BOOLEAN | true | Whether to generate audio for the video. |
| safety_tolerance | INT | 20–4 | The safety tolerance level for the generated video. 0 is the strictest and 4 is the most permissive. |
| keyframes | STRING | [{"frame_index": 0, "image_url": "https://storage.googleapis.com/falserverless/example_inputs/veo31-flf2v-input-1.jpeg"}, {"frame_index": 120, "image_url": "https://storage.googleapis.com/falserverless/example_inputs/veo31-flf2v-input-2.jpeg"}] | Keyframe images pinned to frame positions in the generated video. Up to 10 keyframes with unique `frame_index` values. JSON. Required. |
| 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 (4)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| video_path | STRING | — |
| seed | INT | — |
| info | STRING | JSON: request id, cost estimate, saved files and fal's full answer. |