BFS Shot Seed
One seed widget, a different roll for every shot
- shot
- seed
- label
What it's for
A shot loop runs everything downstream of BFS Shot Planner once per shot. That's the trick, and it's also the trap: if one seed widget feeds your sampler, every shot starts from the same noise. Sometimes you want exactly that - same seed, different shot, and the differences you see are the shot's own composition. Sometimes you don't: three shots in and you'd like each one to get its own roll without hand-editing the seed box between runs.
BFS Shot Seed takes the shot list you already have and hands back one seed per shot, plus a label telling you which seed that was. That's the whole node. It's the least glamorous thing in the pack and you'll wire it into almost every loop workflow anyway.
How it works
The planner's shots output is a ComfyUI list, and ComfyUI runs any node receiving a list once per item, pairing several lists by index. So this node runs once per shot, reads the shot's position in the plan, and derives a seed from your base seed:
- same for every shot - literally the base seed. Shot 1 is always the base seed, and so is shot 9. This is what you get today if you wire a seed straight into the sampler, made explicit.
- increment per shot - seed, seed+1, seed+2. Predictable and easy to reason about when you're comparing adjacent shots.
- random per shot - a different seed per shot, hashed from the base seed and the shot index. It reads as random but it's deterministic, so re-running the same plan gives you the same video back. That matters a lot more than it sounds like it should - "random" seeds you can reproduce are how you debug a shot loop.
Then overrides is the escape hatch: 3:12345, 5:777 pins shot 3 and shot 5 to those seeds and leaves everything else on the mode you picked. Shots count from 1. This is the button you press when shot 4 came out perfect and you want to re-roll the rest of the plan without losing it.
Inputs and outputs
Required: shot (the BFS_SHOT list from BFS Shot Planner or Unpack - the node can't do anything without it), seed (the base seed; shot 1 always uses it verbatim), and mode, the three options above. Optional: overrides, a plain string of shot:seed pairs.
Two outputs. seed is this shot's integer seed - right-click the seed widget on your sampler, convert it to an input, and wire this in. And label is a string like shot 3: 12345. Don't ignore it: it goes into the Shot Join's comparison bar or a note node, and it's how you find out which seed produced the take you liked. Every ComfyUI user has lost a good seed to the control_after_generate dropdown at least once; the point of an explicit label is that you stop relying on the widget.
Install
ComfyUI Manager: search ComfyUI-BFSNodes. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/alisson-anjos/ComfyUI-BFSNodes.git
pip install -r requirements.txt
Restart. Nothing to download.
Gotchas
It needs the shot. With no BFS_SHOT connected there's no list to iterate and no index to read, so the mode and override widgets have nothing to act on. If shots are all coming out identical, check the shot wire before you check the sampler.
Override syntax is strict: shot:seed with integers, separated by commas (semicolons and newlines also work), shot numbers starting at 1. A typo doesn't error loudly - it just falls through to the mode.
Don't double up with BFS Shot Noise. That node has its own per-shot seed widget with the same three modes. Pick one: either the seed is picked here and fed to the sampler, or you let Shot Noise handle seeds itself. Wiring both gets you a seed that's set twice, which is one more thing to be confused by at midnight.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| shot | BFS_SHOT | — | |
| seed | INT | 00–18446744073709550000 | The base seed (shot 1 always uses it). |
| mode | COMBO | same for every shot | same for every shot: every shot starts from the same noise (as when one seed widget feeds the sampler). increment per shot: seed, seed+1, seed+2 ... random per shot: an unrelated seed for each shot, derived from the base seed, so the run is still repeatable. |
| overridesopt | STRING | Seeds for single shots, 'shot:seed' pairs separated by commas (shots count from 1), e.g. '3:12345, 5:777'. To keep a shot that came out well and re-roll the others. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| seed | INT | This shot's seed: connect it to the sampler / noise node. |
| label | STRING | 'shot N: seed' for notes and the comparison bar. |