CoachBate Shot Render Graph
A whole render graph stored in a JSON field, expanded at queue time
- video
The newest node in the pack, and the least documented
CoachBate Shot Render Graph takes a shot_payload and returns video (VIDEO, to Save Video).
That's the whole interface, and it hides the fact that this node builds a graph. The selected
shot's JSON can carry a render_graph object, and this node expands it into real ComfyUI nodes at
execution time - "no per-shot JSON files are needed", as its own description puts it. One workflow,
one graph, and the per-shot variation lives in the shotlist instead of in a folder of near-identical
workflows.
Fair warning up front: the pack's README doesn't cover this one yet, so the source is the documentation. What follows is read from it.
How the expansion works
The recipe has a shape you can write by hand:
{
"shot_id": "007",
"render_graph": {
"loader_id": "10",
"nodes": {
"10": { "class_type": "SomeLoader", "inputs": { "...": "..." } },
"12": { "class_type": "AnotherNode", "inputs": { "image": ["10", 0] } }
},
"video_output": ["12", 0]
}
}
The node walks nodes, instantiates each class_type through ComfyUI's GraphBuilder, and resolves
every input. Links that point at loader_id are special: instead of wiring a node, they're
substituted from payload["loader_outputs"] - the values the shot loader already produced for
this shot. Everything else resolves inside the recipe. Then it returns the node and slot named by
video_output, and hands the whole assembled graph to the execution engine as an expansion.
That's the interesting part: it's dynamic graph expansion, not a subgraph and not a custom executor. Which is why it can return a normal VIDEO that saves like any other, and why the recipe can reference anything installed in your ComfyUI - the class types are resolved by name at run time, so the same shotlist can drive H3 for one shot and something else for the next.
It's the pipeline-level version of what the pack already does at the node level: the shotlist is the program, the workflow is the interpreter.
Inputs and outputs
One required input, shot_payload (STRING, forced), which is the loader's JSON string. One
output, video (VIDEO), which the description says explicitly to connect to Save Video.
Watch for one error, because it's the one you'll actually hit: if the selected shot has no
render_graph, you get "Shot X has no render_graph; disable it until its H3 setup is ready." That
phrasing is a hint about intended use - during the writing phase, shots come in with text and
reference images but no render recipe yet, and this node deliberately fails loudly rather than
rendering something half-specified. In a shotlist
where only some shots are set up, that failure is the feature.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/CoachBate/ComfyUI-CoachBate.git
Or ComfyUI Manager → "CoachBate" → restart ComfyUI. Category is plain CoachBate. This node itself has no extra dependencies - it only builds graphs - but whatever class types your recipes name obviously have to be installed, and the shot pipeline around it wants VideoHelperSuite and PyAV. The pack's own release notes date it to the same September 2026 batch as the H3 Subject Refine set, so expect the documentation to arrive after the behaviour.
Where people get burned
- "Shot X has no render_graph." - the shot you queued isn't set up yet. Add the recipe or mark
the shot
batch_enabled: falseand move on. - A class type error for something you know is installed. Node definitions are looked up by the name registered in ComfyUI - check the recipe against your actual node list, and remember renamed or repackaged nodes will break an old recipe silently until you queue it.
- Everything renders as one shot. The recipe is read from the shot the loader has selected, so
if the loader is in
fixedmode you'll expand the same graph every run. That's the loader's setting, not this node's.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| shot_payload | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |