Make Storyboard Data
One shot list your whole video graph reads from
- storyboard_data
- shot_names_joined
- frame_lengths_joined
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 aSTORYBOARD_DATAhandle. 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.
Inputs (61)
| Name | Type | Default | Description |
|---|---|---|---|
| shot_count | INT | 81–20 | — |
| shot1_titleopt | STRING | Shot 1 | — |
| shot1_framesopt | INT | 241–100000 | — |
| shot1_promptopt | STRING | — | |
| shot2_titleopt | STRING | Shot 2 | — |
| shot2_framesopt | INT | 241–100000 | — |
| shot2_promptopt | STRING | — | |
| shot3_titleopt | STRING | Shot 3 | — |
| shot3_framesopt | INT | 241–100000 | — |
| shot3_promptopt | STRING | — | |
| shot4_titleopt | STRING | Shot 4 | — |
| shot4_framesopt | INT | 241–100000 | — |
| shot4_promptopt | STRING | — | |
| shot5_titleopt | STRING | Shot 5 | — |
| shot5_framesopt | INT | 241–100000 | — |
| shot5_promptopt | STRING | — | |
| shot6_titleopt | STRING | Shot 6 | — |
| shot6_framesopt | INT | 241–100000 | — |
| shot6_promptopt | STRING | — | |
| shot7_titleopt | STRING | Shot 7 | — |
| shot7_framesopt | INT | 241–100000 | — |
| shot7_promptopt | STRING | — | |
| shot8_titleopt | STRING | Shot 8 | — |
| shot8_framesopt | INT | 241–100000 | — |
| shot8_promptopt | STRING | — | |
| shot9_titleopt | STRING | Shot 9 | — |
| shot9_framesopt | INT | 241–100000 | — |
| shot9_promptopt | STRING | — | |
| shot10_titleopt | STRING | Shot 10 | — |
| shot10_framesopt | INT | 241–100000 | — |
| shot10_promptopt | STRING | — | |
| shot11_titleopt | STRING | Shot 11 | — |
| shot11_framesopt | INT | 241–100000 | — |
| shot11_promptopt | STRING | — | |
| shot12_titleopt | STRING | Shot 12 | — |
| shot12_framesopt | INT | 241–100000 | — |
| shot12_promptopt | STRING | — | |
| shot13_titleopt | STRING | Shot 13 | — |
| shot13_framesopt | INT | 241–100000 | — |
| shot13_promptopt | STRING | — | |
| shot14_titleopt | STRING | Shot 14 | — |
| shot14_framesopt | INT | 241–100000 | — |
| shot14_promptopt | STRING | — | |
| shot15_titleopt | STRING | Shot 15 | — |
| shot15_framesopt | INT | 241–100000 | — |
| shot15_promptopt | STRING | — | |
| shot16_titleopt | STRING | Shot 16 | — |
| shot16_framesopt | INT | 241–100000 | — |
| shot16_promptopt | STRING | — | |
| shot17_titleopt | STRING | Shot 17 | — |
| shot17_framesopt | INT | 241–100000 | — |
| shot17_promptopt | STRING | — | |
| shot18_titleopt | STRING | Shot 18 | — |
| shot18_framesopt | INT | 241–100000 | — |
| shot18_promptopt | STRING | — | |
| shot19_titleopt | STRING | Shot 19 | — |
| shot19_framesopt | INT | 241–100000 | — |
| shot19_promptopt | STRING | — | |
| shot20_titleopt | STRING | Shot 20 | — |
| shot20_framesopt | INT | 241–100000 | — |
| shot20_promptopt | STRING | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| storyboard_data | STORYBOARD_DATA | — |
| shot_names_joined | STRING | — |
| frame_lengths_joined | STRING | — |