Nodes/ComfyUI LC Vision Nodes/LC Vision Storyboard Save (BETA) 🎞️
ComfyUI Node

LC Vision Storyboard Save (BETA) 🎞️

The node that files your reference pictures where the movie can find them

By lonecatone23Β·Created about a month agoΒ·Updated about 14 hours agoΒ· 11
LC Vision Storyboard Save (BETA) 🎞️
  • images
  • sheet
  • summary
β—„jobβ€”β–Ί

A storyboard picture is only useful if the next workflow can find it. Save it with a normal Save Image node and you get ComfyUI_00041_.png in output/: a file with no idea that it's the face reference for Earl, or that it belongs to bank_heist, or that it should come back as a face and not a place.

LC Vision Storyboard Save is the boring, essential half of the storyboard pair. It takes the pictures the sampler just made, works out which picture is which from the tag the Builder attached to it, writes them into the project's own reference folder, and registers them in the project so the movie can actually use them.

What it does, precisely

It takes two inputs. images is the sampler's output. job is the Builder's job output - one small JSON string per picture, carrying the project, the kind (face / place / anchor) and the name. The node is list-aware, so it flattens any batch dimension and pairs pictures with jobs in order.

Each picture is written as PNG to input/lc_h3_refs/<project>/sb_<kind>_<name>.png. Then it's added to the project's storyboard.json with a role mapped for the movie's own vocabulary: a face becomes face, a place becomes setting, an anchor becomes layout. Faces also pick up the character's look line from the Shot List as a note, so the reference carries the description alongside the image.

Two things follow from that, and they're the ones that surprise people:

The file name is deterministic, so a remake overwrites. Same kind, same name, same filename. That's a feature - you redo Earl's portrait and the project still points at one picture of Earl, not two. But if you liked the old one, it's gone.

Pictures land in input/, not output/. Which is right, and worth understanding if you've internalised "saves go to output". input/ is the directory LoadImage reads from; these are reference images that other nodes and other workflows are meant to consume, so that's where they belong. The cost is that they won't show up in your output gallery, and if you clean out input/ you'll silently break a movie project.

After writing, the node fires a small websocket event carrying the saved items, which is how the Storyboard Sheet refreshes itself and how anything the Reference Assembler had no picture for gets filled in automatically.

The inputs, briefly

Just the two. There's no project_name here on purpose - the project comes from inside job, so a mis-wired project can't file pictures into the wrong movie. Wire images from your sampler (or from a VAE Decode, depending on how your graph is built) and job from the Builder. That's the whole node.

The outputs are summary, a plain-text list of what got saved where, and sheet - a single wide contact-strip image of everything in that run, tiles resized to a common height. The strip is genuinely handy: it's one image you can preview at the end of the graph to see the whole batch at a glance, instead of clicking through twelve previews. It's also an output node, so it runs even with nothing wired after it.

Install

Same pack, same two commands:

cd ComfyUI/custom_nodes
git clone https://github.com/lonecatone23/ComfyUI_LC_Vision_nodes.git

install.py then runs (Manager does this for you on install or update), followed by a ComfyUI restart. If you're only here for the storyboard trio, the installer's llama-cpp-python wheel is for the rest of the pack - this node needs nothing but Python, PIL and NumPy.

Where it bites

Pictures end up mislabelled. The pairing is positional: first image with first job. If your sampler drops an image, or the Builder blocked a job and produced nothing for it, everything after it shifts and your faces become places. Check summary against the Builder's own summary - if the counts don't match, don't trust the folder.

"Saved 0 picture(s)." Either images is empty, or every job in the list was blocked because there was nothing to make. Run the Builder with make: everything or an only name and try again.

Odd names get mangled. Filenames are sanitised - anything that isn't a letter, digit, space, underscore or hyphen is stripped, spaces become underscores, and long ones are truncated. "the bank lobby (morning)" becomes sb_place_the_bank_lobby_morning and still registers correctly, because the name in the project is untouched. So the folder looks uglier than the project does.

The Sheet still says "missing". The Save has to actually run for the project to learn about the pictures, which means it can't be bypassed or muted. If the storyboard group is off, the Sheet will happily tell you the pictures don't exist.

One quiet design win: this node never writes project.json. The storyboard's list lives in storyboard.json beside it, because a movie Run re-saves project.json from the Reference Assembler - write there and every run would wipe your storyboard. Small decision, obviously learned the hard way.

CategoryLC Vision/movie

Inputs (2)

NameTypeDefaultDescription
imagesIMAGEThe pictures from the sampler, one per Builder job.
jobSTRINGThe Builder's job output (which picture is which).

Outputs (2)

NameTypeDescription
sheetIMAGEβ€”
summarySTRINGβ€”