Nodes/Mickmumpitz-Nodes/Make Storyboard Data
ComfyUI Node

Make Storyboard Data

One shot list your whole video graph reads from

By mickmumpitz·Created 10 months ago·Updated 25 days ago· 55
Make Storyboard Data
    • storyboard_data
    • shot_names_joined
    • frame_lengths_joined
    ◄shot_count8►
    ◄shot1_titleShot 1►
    ◄shot1_frames24►
    ◄shot1_prompt►
    ◄shot2_titleShot 2►
    ◄shot2_frames24►
    ◄shot2_prompt►
    ◄shot3_titleShot 3►
    ◄shot3_frames24►
    ◄shot3_prompt►
    ◄shot4_titleShot 4►
    ◄shot4_frames24►
    ◄shot4_prompt►
    ◄shot5_titleShot 5►
    ◄shot5_frames24►
    ◄shot5_prompt►
    ◄shot6_titleShot 6►
    ◄shot6_frames24►
    ◄shot6_prompt►
    ◄shot7_titleShot 7►
    ◄shot7_frames24►
    ◄shot7_prompt►
    ◄shot8_titleShot 8►
    ◄shot8_frames24►
    ◄shot8_prompt►
    ◄shot9_titleShot 9►
    ◄shot9_frames24►
    ◄shot9_prompt►
    ◄shot10_titleShot 10►
    ◄shot10_frames24►
    ◄shot10_prompt►
    ◄shot11_titleShot 11►
    ◄shot11_frames24►
    ◄shot11_prompt►
    ◄shot12_titleShot 12►
    ◄shot12_frames24►
    ◄shot12_prompt►
    ◄shot13_titleShot 13►
    ◄shot13_frames24►
    ◄shot13_prompt►
    ◄shot14_titleShot 14►
    ◄shot14_frames24►
    ◄shot14_prompt►
    ◄shot15_titleShot 15►
    ◄shot15_frames24►
    ◄shot15_prompt►
    ◄shot16_titleShot 16►
    ◄shot16_frames24►
    ◄shot16_prompt►
    ◄shot17_titleShot 17►
    ◄shot17_frames24►
    ◄shot17_prompt►
    ◄shot18_titleShot 18►
    ◄shot18_frames24►
    ◄shot18_prompt►
    ◄shot19_titleShot 19►
    ◄shot19_frames24►
    ◄shot19_prompt►
    ◄shot20_titleShot 20►
    ◄shot20_frames24►
    ◄shot20_prompt►

    Multi-shot video work in ComfyUI has a nasty habit of turning into the same thing copy-pasted eight times: eight prompt boxes, eight hard-coded frame lengths, and no single place where the plan for the video actually lives. Make Storyboard Data is the fix for that. It's a data-entry node that holds your whole shot list - title, frame length and prompt per shot - and hands it downstream as one object.

    If you've wondered why any of this is worth a custom node pack: this is the pattern. One authoritative list, many consumers.

    What it is

    A table, basically. You set shot_count (1–20, default 8), and the node reveals that many rows of three fields: shotN_title (a short label, default "Shot N"), shotN_frames (an INT, default 24), and shotN_prompt (multiline text, empty by default). Everything is optional except shot_count, so the node drops into a graph and works immediately.

    The front-end extension that ships with the pack hides rows above shot_count and reshows them when you raise it, so the node isn't a wall of sixty widgets. Worth knowing because hidden isn't the same as cleared - the values you typed into shot 5 are still in those widgets after you drop the count to 4, and they come back when you raise it again. Surprising, occasionally handy.

    The outputs, and this is where it clicks

    Three outputs, and the two STRING ones exist purely to feed the pack's grid node:

    • storyboard_data - the shot list itself, as a STORYBOARD_DATA handle. This is a pack-specific Python type. Only this pack's nodes can read it (Get Storyboard Shot is the reader), so don't expect to plug it into a core node or a third-party one. It is not a standard ComfyUI socket type; if you try, the link simply won't form.
    • shot_names_joined - the titles comma-joined, e.g. Shot 1,Shot 2,Shot 3.
    • frame_lengths_joined - the lengths comma-joined, e.g. 24,24,24.

    Those last two are deliberately shaped to drop straight into Make Storyboard Grid's shot_names and frame_lengths widgets (both plain comma-separated STRINGs). So a minimal setup is: Make Storyboard Data → Get Storyboard Shot nodes for generation, and the two joined strings → Make Storyboard Grid for the review sheet. One place to edit, everything downstream follows.

    Wiring it up

    The intended pattern is one Get Storyboard Shot node per generation group. You keep one graph that generates a shot, and each copy of that group pulls a different shot index out of the same list instead of you retyping the prompt and length. Change the prompt in the data node and every group picks it up. That's the same one-source-many-consumers logic behind ComfyUI's primitive/value nodes - just for a whole shot plan instead of a seed.

    Note what shotN_frames is for: it's the per-shot length your sampling node should be using. Feed it through Get Storyboard Shot's frames output into whatever length widget your video model needs (right-click the widget → Convert to input, then wire it up). Typing the length here and the length on the sampler separately is exactly the double-bookkeeping this node exists to kill.

    The one trap worth remembering

    Commas. shot_names_joined is built by ",".join(titles), and the grid node splits it back on commas. So a title like "Shot 3, wide" is not "a title with a comma in it" downstream - it's two titles, and every caption from that point on is shifted one cell. Keep shot titles comma-free. Same goes for anything you hand to the grid later.

    Also worth planning around: the hard ceiling is 20 shots, enforced in the source (MAX_SHOTS = 20) and visible in the widget range. The Get Storyboard Shot node accepts an index up to 999, which sounds like headroom but isn't - see that page for what actually happens past the end of the list.

    Install

    The pack is one install for all its nodes, storyboard included.

    cd ComfyUI/custom_nodes
    git clone https://github.com/mickmumpitz/ComfyUI-Mickmumpitz-Nodes.git
    

    Restart ComfyUI afterwards - the storyboard rows are drawn by a bundled web extension, so a plain reload of the page isn't enough the first time. Manager route: search "Mickmumpitz", Install, restart. It's MIT, published as "Mickmumpitz-Nodes" under publisher id mickmumpitz, and it's still being updated (v1.5.9, commits in late 2026).

    No models, no downloads for this node. The pack's requirements.txt lists numpy, Pillow, opencv-python and ultralytics>=8.0.0; per the README the ultralytics dependency is only genuinely needed by the Consistent Character Creator's face-area nodes, but it will be installed regardless. This node needs none of them - it's dictionaries and string joins.

    One expectation to set if you came here from a Mickmumpitz workflow JSON: those Patreon workflow files typically require several other packs on top of this one, so expect a missing-nodes list on first load and let Manager work through it.

    CategoryMickmumpitz/Storyboard

    Inputs (61)

    NameTypeDefaultDescription
    shot_countINT81–20—
    shot1_titleoptSTRINGShot 1—
    shot1_framesoptINT241–100000—
    shot1_promptoptSTRING—
    shot2_titleoptSTRINGShot 2—
    shot2_framesoptINT241–100000—
    shot2_promptoptSTRING—
    shot3_titleoptSTRINGShot 3—
    shot3_framesoptINT241–100000—
    shot3_promptoptSTRING—
    shot4_titleoptSTRINGShot 4—
    shot4_framesoptINT241–100000—
    shot4_promptoptSTRING—
    shot5_titleoptSTRINGShot 5—
    shot5_framesoptINT241–100000—
    shot5_promptoptSTRING—
    shot6_titleoptSTRINGShot 6—
    shot6_framesoptINT241–100000—
    shot6_promptoptSTRING—
    shot7_titleoptSTRINGShot 7—
    shot7_framesoptINT241–100000—
    shot7_promptoptSTRING—
    shot8_titleoptSTRINGShot 8—
    shot8_framesoptINT241–100000—
    shot8_promptoptSTRING—
    shot9_titleoptSTRINGShot 9—
    shot9_framesoptINT241–100000—
    shot9_promptoptSTRING—
    shot10_titleoptSTRINGShot 10—
    shot10_framesoptINT241–100000—
    shot10_promptoptSTRING—
    shot11_titleoptSTRINGShot 11—
    shot11_framesoptINT241–100000—
    shot11_promptoptSTRING—
    shot12_titleoptSTRINGShot 12—
    shot12_framesoptINT241–100000—
    shot12_promptoptSTRING—
    shot13_titleoptSTRINGShot 13—
    shot13_framesoptINT241–100000—
    shot13_promptoptSTRING—
    shot14_titleoptSTRINGShot 14—
    shot14_framesoptINT241–100000—
    shot14_promptoptSTRING—
    shot15_titleoptSTRINGShot 15—
    shot15_framesoptINT241–100000—
    shot15_promptoptSTRING—
    shot16_titleoptSTRINGShot 16—
    shot16_framesoptINT241–100000—
    shot16_promptoptSTRING—
    shot17_titleoptSTRINGShot 17—
    shot17_framesoptINT241–100000—
    shot17_promptoptSTRING—
    shot18_titleoptSTRINGShot 18—
    shot18_framesoptINT241–100000—
    shot18_promptoptSTRING—
    shot19_titleoptSTRINGShot 19—
    shot19_framesoptINT241–100000—
    shot19_promptoptSTRING—
    shot20_titleoptSTRINGShot 20—
    shot20_framesoptINT241–100000—
    shot20_promptoptSTRING—

    Outputs (3)

    NameTypeDescription
    storyboard_dataSTORYBOARD_DATA—
    shot_names_joinedSTRING—
    frame_lengths_joinedSTRING—