Prompt Manager (Focused)
The text encoder that quietly builds you a prompt library
- clip
- CONDITIONING
- STRING
Everyone's prompt history is a graveyard: a text file with 300 lines and no dates, or forty PNGs you re-drag onto the canvas one at a time. Dragging the image back does work - the whole graph is baked into the PNG text chunks - but it hands you back exactly one run from one file. It can't answer "what was that lighting prompt I used three weeks ago."
That's the gap this node fills, in the way I like best: archiving is a side effect of generating, so you never sit down to "organise your prompts."
What it is, mechanically
PromptManagerFocused is a CLIPTextEncode replacement with a database bolted to the side. In the source it subclasses the plain PromptManager node and only rewrites INPUT_TYPES - encoding and storage are identical to the Classic node. Everything that differs is the frontend: an editor-first layout, an attached library browser, and collapsible Composition and Metadata sections that fold away when you're not using them.
On every execution it joins prepend_text, your text and append_text into one string, passes it through optional LoRA trigger-word injection, runs the ordinary clip.tokenize() → clip.encode_from_tokens_scheduled() path, and writes a row to a local SQLite database (prompts.db, in the extension folder by default) - hashed with SHA256, so identical text updates the existing row instead of duplicating it. Then it registers with the output-directory monitor that links generated images back to the prompt that made them.
The inputs that matter
text and clip are required, and both behave like the node you already know - multiline prompt, CLIP from your checkpoint or encoder loader.
Of the optional fields, category and tags are the ones worth filling in - one value, then a comma-separated list. Both autocomplete from your database, and tag suggestions narrow to tags that co-occur with what you've typed. That's the difference between tagging feeling productive and feeling like homework.
search_text deserves a warning: it looks like a prompt field, but the Python side accepts it and does nothing with it. It's the library's search box, persisted into the widget so your query survives a reload - typing there does not change your prompt. prepend_text and append_text are declared forceInput in this node, so they render as sockets only: wire a String node in rather than typing. Classic is the variant with text boxes.
Outputs: CONDITIONING to your sampler's positive input, as always. STRING is the composed text - hand it to a filename prefix or a note node when you need the exact string that actually encoded.
Using the library
Click Browse library. Search or filter by category and tags, preview, then Use prompt. Load metadata decides whether category and tags come along with the text. The selection is written into the widgets; nothing is saved until the node runs - the footer says "Loaded prompt. Saved when this node runs," which is honest and worth reading. The node is registered as an output node and its IS_CHANGED hashes text, prepend, append, category and tags, so the save fires whenever that combination changes.
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
That requirements file is two lines - watchdog>=2.1.0, Pillow>=8.0.0. No model downloads, no torch upgrades. Restart ComfyUI and the node appears under ComfyAssets → Prompts; the dashboard lives at http://localhost:8188/prompt_manager/admin.
The heavy stuff is opt-in later: AI AutoTag downloads WD14 ONNX classifiers (~400MB) on first use, and reading prompts out of MP4/WebM files needs ffprobe installed.
Where people get burned
Nothing shows up in the library. Saving is wrapped in a try/except that logs a warning and lets generation continue - a deliberate choice so a database hiccup never kills your run. It also means a read-only install directory or an unwritable database path fails silently from the canvas. Check the ComfyUI console before assuming the node is broken.
Docker ate my prompts. The default prompts.db lives inside the extension directory, so if that path doesn't persist your library resets. Set an absolute database.default_path in config.json - and moving that path without moving the old file shows an empty library, because it won't merge databases for you. Back up with the WAL file intact.
I typed in prepend and it vanished. That's the forceInput behaviour above. Drop a String node on it.
Same prompt, no second entry. Deduplication is by text hash, so re-running with new tags updates the existing row. Usually what you want; occasionally exactly what you don't.
A note on the pack itself: single maintainer, MIT, version 3.3.1, commits landing as recently as October 2026. It has grown into a full asset manager - gallery, tagging, diagnostics - but the node stays small, and if you only want the storage half you never have to open the dashboard.
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. |