Storyboard · Text Table
A prompt library that lives inside the graph
- prompt
- negative
- name
- weight
Every regular has a set of prompts they reuse: the portrait setup, the landscape base, the anime style. Normally that means a row of CLIP Text Encode nodes cluttering the graph, each with the text baked in. TextTable is the answer - a little prompt library as a node, with each row storing a name, a prompt, a negative, and a weight. Pick a row and it hands you four outputs ready to wire.
It's one of the five nodes in Storyboard Suite (Smyshnikof/comfyui-storyboard-suite), @itsmyshnikov's pre-production pack. Like the rest of it, this is pure UI plus a couple of Python one-liners - no GPU, no model, no dependencies. It solves the repetition half of ComfyUI's plumbing problem: the same prompt feeding five places, or five prompts you keep toggling between.
How it works
table_data holds a JSON array of rows - each one name, prompt, negative, weight. A select value picks the active row by name (case-insensitive) or by index, defaulting to "portrait". The web frontend hides the JSON behind an actual editable table with + Add row, Duplicate, and Delete toolbar buttons, plus drag-sort to reorder.
Nice resilience detail: if the JSON ever gets mangled in a workflow file, the parser falls back to pipe-separated text - name|prompt|negative|weight - so a hand-edited widget still works.
The inputs that matter
- table_data - the library itself. Multi-line JSON, one row per entry.
- select - which row is active. The UI shows this as a dropdown of row names.
That's it. Everything else is outputs.
The outputs that matter
- prompt, negative - both STRING, the obvious wiring target:
prompt→CLIP Text Encodepositive,negative→ negative. (That's the README's own recommended hookup.) - name - the row's name, useful if you're building filenames.
- weight - a FLOAT, and here's the honest caveat: the node does nothing with it. TextTable just outputs the number. If you don't wire
weightinto something that actually consumes a weight, it's decoration. And even if you do wire it, the weight is an SD1.5/SDXL-era trick - modern LLM-encoded models (Flux, Z-Image, the 2026 crop) silently discard attention weighting, so(word:1.3)and friends do nothing there. Same story for the negative column: it's very much alive on SDXL-lineage models, close to inert on LLM encoders. Treat the weight column as a "for SDXL and older" feature, not a promise.
Install
Same as every node in this pack - no dependencies, nothing to download, just the clone:
cd ComfyUI/custom_nodes
git clone https://github.com/Smyshnikof/comfyui-storyboard-suite
Or use ComfyUI Manager and search "comfyui-storyboard-suite". Restart, then right-click → Add Node → Storyboard → Text Table.
Gotchas
selectbinds by name, so renaming a row can silently reset the selection to the first row.- The default
selectis"portrait"- if you delete that row, selection falls back to the first remaining one, which can surprise you mid-shoot. - Because
weightis passive, the most common beginner mistake is setting weights and seeing zero effect. Either wire it to a consumer or ignore it and edit prompts directly. - The table UI is custom JS, so a stale browser cache can leave you looking at a bare node. Hard-refresh and the table appears; the underlying JSON widget still works regardless.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| table_data | STRING | [ { "name": "portrait", "prompt": "cinematic close-up portrait, soft window light, 85mm", "negative": "blurry, low quality", "weight": 1.0 }, { "name": "landscape", "prompt": "wide epic mountain landscape at sunrise, mist", "negative": "", "weight": 1.0 }, { "name": "anime", "prompt": "anime style, vibrant colors, clean lineart, detailed", "negative": "photorealistic", "weight": 1.2 } ] | — |
| select | STRING | portrait | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| prompt | STRING | — |
| negative | STRING | — |
| name | STRING | — |
| weight | FLOAT | — |