Tag Table
The spreadsheet your anime prompt always wanted
- tags_text
If you prompt an Illustrious, NoobAI, or Pony checkpoint, you know the pain this node exists to fix: a thirty-line booru tag list living in one cramped text box, where untangling "which tag is the pose and which is the outfit" means squinting at a wall of commas. Tag Table gives you a real spreadsheet inside the node - one row per tag, with an enable checkbox, a comment column, drag-to-reorder, and a live preview of the final prompt. It's not a fancy node. It's the organizer the rest of your workflow was missing.
The trick that makes it worth your time: row order is prompt order. SDXL-lineage models weight earlier tokens more strongly, so the tag you drag to the top is the tag the model hears loudest. That's exactly why the drag-and-drop reorder exists, and it's a genuinely better way to think about a composition than editing text.
How it works
The backend is almost nothing - a Python node that takes a JSON blob, keeps rows where enabled is true and the tag isn't blank, and joins them with a space. All the real work is a JavaScript front end (web/tag_table.js) that replaces the node's boring widget with a rendered table: enable checkbox, drag handle, tag textarea, comment textarea, delete button, a copy button, and a Final Prompt preview that rebuilds as you type.
Comments are for your eyes only - they never reach the output, so you can label a row lighting without the model ever seeing it. Disabled rows and empty tags are skipped. What you get out is one clean space-joined string.
Inputs and outputs
You only ever touch one input directly:
- rows (INT, default 5, 1–100) - how many rows the table shows. Raise it if you're juggling more tags; the UI grows rows to match.
- table_data (STRING) - the hidden JSON that stores your actual rows. It's auto-maintained by the front end and hidden from view; you shouldn't hand-edit it, and it's the reason your table survives a restart.
The single output, tags_text (STRING), is the assembled prompt. Wire it straight into a CLIP Text Encode node (and into the negative encoder if you keep a small negative list) and you're done. Paste it into CivitAI when you're happy and the copy button makes it trivial.
Installing it
There are no dependencies, no model downloads, nothing to configure - the pyproject.toml ships with an empty dependency list. Either search "ComfyUI-TagTable" in ComfyUI Manager and install, or:
cd ComfyUI/custom_nodes
git clone https://github.com/xelavi9966-cell/ComfyUI-TagTable.git
Then restart ComfyUI. To update later, git pull inside the folder. That's the whole install story.
Where people get tripped up
The biggest "wait, why is my prompt wrong?" moment isn't a bug - it's forgetting that this node builds tokens for a CLIP-style encoder. Tag Table is a glorified string joiner with nice ergonomics; it does nothing to your tags beyond concatenating them. If you're feeding an LLM-encoded model like Flux or Z-Image, sentence-style prompts want a different tool, and this one will quietly underperform. It's built for the tag-prompting lineage, full stop.
Two smaller gotchas: underscores are fine to leave in (booru style is long_hair, and models trained on Danbooru know it), and if you reorder rows the meaning of the prompt changes - the top tag gets the most weight, so keep your subject and quality tags at the front. And since the node persists its table to the workflow's node properties, remember a saved table travels with the workflow - handy for sharing a finished prompt template with someone.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| rows | INT | 51–100 | — |
| table_data | STRING | [] | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| tags_text | STRING | — |