链接分镜项目(进阶)· Link Storyboard Project
Point ComfyUI at the Project Folder
- moss_json
- width
- height
- resolution_json
- lora_name
- lora_strength
- negative
- page_info
Here's a workflow that will annoy you within a day: edit the storyboard in the plugin, export a new bundle, drag it into ComfyUI, run, notice a typo in a panel description, edit again, export, drag, run. The upload node copies every file you hand it into ComfyUI's input folder, so the copy never tracks the original. SodaLoadStoryboardPage is the same loader with the copy step deleted - it reads a project directory directly off the machine ComfyUI runs on, and recompiles when the files change.
The display name flags it as 进阶, advanced, which is fair: it assumes your storyboard is a project folder on disk rather than a file someone sent you.
How it works
The project layout the pack expects is a directory with project.json, a pages/ folder with one JSON per page, and a characters/ folder of character cards:
examples/stretch-color/
project.json
pages/
stretch-color.json
characters/
hiyone.json
You give it project_dir - that path - and page_id, which is the page file's name without .json. It loads that page plus the project's character cards, compiles the MOSS prompt, and emits the same values the upload-based loader does.
The reason it's worth the friction of having a project on disk is caching behaviour. Its change detection hashes the page content along with the mode widgets, so when you save a change in the plugin, the next run recompiles instead of handing you a cached graph. It's the difference between "edit, save, run" and the export-drag-run loop. The hash also degrades gracefully: probing a workflow during restoration never throws, it just falls back to a hash of the widget values.
dialogue_mode and slant_mode behave exactly as on the upload loader, and include_triggers is optional here rather than required.
Inputs and outputs
Required: project_dir, page_id, dialogue_mode, slant_mode. Optional: include_triggers.
Eight outputs, and the important thing is what's missing compared to SodaLoadStoryboard: there's no draft. No upload means no thumbnail render, so you get moss_json, width, height, resolution_json, lora_name, lora_strength, negative and page_info - and nothing to plug into a preview node. If you want a sketch of the page while you're working, add SodaStoryboardPreview downstream and it'll draw one from the same project.
page_info is the one to not forget: crop, mask, paste-back, cut and lettering all need it, and here it comes from a folder rather than a file you dropped in.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/cOkieeman/ComfyUI-Soda-Storyboard
cd ComfyUI-Soda-Storyboard && python -m pip install --upgrade soda-storyboard
Manager → search Soda Storyboard (comfyui-soda-storyboard), restart. You still need a MOSS-capable ComfyUI and the model files: SFT checkpoint, the moss_image text encoder, flux2-vae.
If you don't have a project yet, the repo ships one - examples/stretch-color/ in the clone - which is the fastest thing to point this node at while you're learning the rest of the pack.
Where people get burned
The path has to exist and be a directory. The pack resolves it strictly, so you get "请填写分镜项目目录" for a blank field and "分镜项目目录必须是文件夹" for anything that isn't a folder - a typo'd path doesn't get created for you. Relative paths resolve against wherever ComfyUI was launched, which is not always the folder you think; absolute paths are less exciting.
page_id is validated hard: only a filename inside pages/, no slashes, no colons, no ... The error spells out the rule ("请填写 pages 目录内的文件名(不含 .json)"), which is friendlier than the security reason behind it.
Two edge cases worth knowing. First, an empty project or page field raises "请先选择项目和页面" when you queue - it won't half-run. Second, the optional inline editor in this pack's sidebar only works when your browser and ComfyUI are on the same machine and origin; a remote browser through a reverse proxy gets the iframe blocked, so you'll want the upload-based loader (with its editor) for remote work and this one for local iteration.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| project_dir | STRING | — | |
| page_id | STRING | — | |
| dialogue_mode | COMBO | 3 options: 跟随页面, MOSS 画字, 程序排字 | |
| slant_mode | COMBO | 2 options: cut, hint | |
| include_triggersopt | BOOLEAN | true | — |
Outputs (8)
| Name | Type | Description |
|---|---|---|
| moss_json | STRING | — |
| width | INT | — |
| height | INT | — |
| resolution_json | STRING | — |
| lora_name | STRING | — |
| lora_strength | FLOAT | — |
| negative | STRING | — |
| page_info | STRING | — |