Nodes/Storyboard Suite/Storyboard · Text Table
ComfyUI Node

Storyboard · Text Table

A prompt library that lives inside the graph

By Smyshnikof·Created 2 months ago·Updated 2 months ago· 6
Storyboard · Text Table
    • prompt
    • negative
    • name
    • weight
    table_data[ { "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 } ]
    selectportrait

    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: promptCLIP Text Encode positive, 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 weight into 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

    • select binds by name, so renaming a row can silently reset the selection to the first row.
    • The default select is "portrait" - if you delete that row, selection falls back to the first remaining one, which can surprise you mid-shoot.
    • Because weight is 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.
    CategoryStoryboard

    Inputs (2)

    NameTypeDefaultDescription
    table_dataSTRING[ { "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 } ]
    selectSTRINGportrait

    Outputs (4)

    NameTypeDescription
    promptSTRING
    negativeSTRING
    nameSTRING
    weightFLOAT