Prompt Manager (Split)
The library pane that never closes while you're iterating
- clip
- CONDITIONING
- STRING
There's a kind of friction in prompt work that has nothing to do with the model: you're comparing six phrasings of one idea, and every comparison costs three clicks - open the browser, search, load, close, run, reopen. By the fourth you've stopped comparing and started guessing, which is the point where a session quietly turns into random variation.
Prompt Manager (Split) exists to delete those three clicks. It's the same prompt library as the Focused node, except it stays on the canvas next to the editor instead of hiding behind a button.
What's actually different
Internally this is the least interesting node in the pack, and that's a compliment. It subclasses PromptManagerFocused and adds no inputs, no encoding path, no storage rules. Same CLIP call, same SQLite write, same CONDITIONING + STRING outputs. The difference is layout:
- Wide node: library on one side, editor on the other, both live.
- Narrow node: the panels stack vertically instead of fighting for horizontal room.
That's a responsive reflow, not a broken node - if you dragged it narrow and the library "disappeared," scroll down. It also stores its open/closed state and active search filters in the node's workflow properties, so a saved workflow reopens with the library as you left it. More than most custom node UIs manage.
The rest of the contract is identical to Focused: type in the editor, optionally tag it, and the prompt is written to the database when the node executes. Search the library, preview, Use prompt, and decide with Load metadata whether category and tags come along. Prepend and append are forceInput sockets here as well, so they're for wiring a trigger string in, not for typing.
Why bother, given you can just reuse the image
The honest counter-argument: ComfyUI already stores the entire graph in every PNG it saves, so dragging the image back returns the workflow, prompt and seed. Why a database?
Because that trick is per-file and per-run. It can't filter by "portraits, rated 4+, tagged neon," can't show twelve variants of one clause side by side, and can't survive you deleting output/. The PNGs are your archive; this is your index. Split is the variant for people who use it while working rather than as a lookup afterwards.
Inputs and outputs
Required: text (the prompt to encode and save) and clip.
Optional: category, tags, search_text, prepend_text, append_text. Of those, only the first two change anything you'd notice on the encoder side. search_text is the library's filter box mirrored into a widget so your query persists - the backend takes it and ignores it, so putting your prompt there does nothing. prepend_text/append_text are sockets only.
Outputs: CONDITIONING to the sampler's positive input, and STRING carrying the composed text with prepend/append applied. That second output is underrated - it's what was actually encoded, so it's the right thing to feed a filename template or a note node.
Install
ComfyUI Manager, search the pack title ComfyUI_PromptManager, or:
cd ComfyUI/custom_nodes
git clone https://github.com/ComfyAssets/ComfyUI_PromptManager
cd ComfyUI_PromptManager
pip install -r requirements.txt
watchdog and Pillow, nothing else - the pack pins runtime minimums low on purpose so updating it doesn't force upgrades across your whole environment. No models. Restart ComfyUI and it's under ComfyAssets → Prompts, next to Classic, Focused and (+/-). The dashboard is at http://localhost:8188/prompt_manager/admin.
Where people get burned
The node eats canvas space. That's the real cost: a side-by-side library on a 40-node graph is a giant box in the middle of your wires. Keep Split for workflows where prompt iteration is the work, and Focused or Classic where it isn't.
An empty library on a second install. All three layout nodes share one database, defaulting to prompts.db inside the extension directory. On Docker or a fresh clone that's either blank or a path that won't survive a rebuild - set an absolute database.default_path in config.json, and back it up properly (the WAL file matters; a plain .db copy can miss committed rows).
Prompts that never get saved. Storage failures are caught and logged as warnings so they can't break a render. If you queue a run and nothing appears in the library, check the ComfyUI console for the warning and check write permissions - don't assume the node is silently broken.
Frontend weirdness after an update. This canvas UI has to survive both ComfyUI's Classic frontend and the Nodes 2.0 rewrite, and the ecosystem transition has been rough. If the library pane renders wrong or stops updating, hard-refresh before filing an issue - the Python and JS halves of this pack are served separately.
Duplicate-looking entries. Prompts are deduplicated by a SHA256 hash of the text, so re-running an identical prompt updates the existing row. With dynamic prompts or wildcards, though, each resolved text is its own row - either exactly what you want for a variation sweep or an alarming growth curve, depending on your workflow.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | The text prompt to be encoded and saved to database. | |
| clip | CLIP | The CLIP model used for encoding the text. | |
| categoryopt | STRING | Optional category for organizing prompts (e.g., 'landscapes', 'portraits') | |
| tagsopt | STRING | Comma-separated tags for the prompt (e.g., 'anime, detailed, sunset') | |
| search_textopt | STRING | Search past prompts by text; add tag:name (or tag:"two words") to filter by tag | |
| prepend_textopt | STRING | Text to prepend to the main prompt (connected STRING nodes will be added before the main text) | |
| append_textopt | STRING | Text to append to the main prompt (connected STRING nodes will be added after the main text) |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| CONDITIONING | CONDITIONING | A conditioning containing the embedded text used to guide the diffusion model. |
| STRING | STRING | The final combined text string (with prepend/append applied) that was encoded. |