Nodes/CoachBate/CoachBate Shot Render Graph
ComfyUI Node

CoachBate Shot Render Graph

A whole render graph stored in a JSON field, expanded at queue time

By CoachBate·Created 3 months ago·Updated 21 days ago· 2
CoachBate Shot Render Graph
    • video
    ◄shot_payload—►

    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: false and 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 fixed mode you'll expand the same graph every run. That's the loader's setting, not this node's.
    CategoryCoachBate

    Inputs (1)

    NameTypeDefaultDescription
    shot_payloadSTRING—

    Outputs (1)

    NameTypeDescription
    videoVIDEO—