πΈ Save + Thumbnail
Save a library entry and its thumbnail in one queue step β build your prompt library as you generate
- thumbnail
- text
- id
The πΈ Library is Frog Node Pack's centerpiece - a visual gallery of named prompts with thumbnail tiles, tags, ratings, and per-entry LoRA stacks. The one chore that keeps people from actually maintaining one is the two-step ritual of "save the prompt, then separately save the thumbnail." πΈ Save + Thumbnail fuses both into a single node: wire in the text and an image, fill in a name, queue once, and the entry lands in the gallery complete with artwork. It's the pack's "build your library as you generate" node.
The mechanism, from the source: the node writes directly into the same data/ folder the πΈ Library node uses - entries to FrogNodePack/data/prompts.json, thumbnails to data/images/ - so the change shows up in the gallery the moment the queue finishes. It's described as an atomic write: entry and thumbnail land together, so the gallery never shows a tile with the wrong artwork or a missing image. (That atomicity is the point of fusing the two steps - the pack also ships the single-step πΈ Thumbnail Saver for updating artwork only, and this node is the "do it all" version.)
Inputs that matter:
name- the display name on the tile. Required; leaving it blank is a mistake the node will catch on thetextside (an empty prompt raises an error rather than silently saving a blank entry).text- the positive prompt to store. Required; empty raises an error so an unwired input doesn't create garbage.thumbnail- the IMAGE to use as the entry's artwork (first frame of a batch).tags- comma-separated;category:valueform (e.g.style:cyberpunk) enables the gallery's category-grouped filter chips.overwrite_by_name- when on, an existing entry with this name gets updated instead of a new one being created. When several entries share a name, the most-recently-updated wins.negative- optional, stored with the entry and emitted on the Library node'snegativeoutput later.prompt_id- optional override that pins the entry to a specific ID (must match[A-Za-z0-9_-]{1,64}); leave blank to auto-generate from the name. Takes priority overoverwrite_by_name.
Outputs: text (the saved prompt, passed through) and id (the entry ID - wire it into a Library loader's prompt_id or back into this node on the next run). It's an output node, so it terminates the chain.
Why bother building a library this way? Because the gallery is what makes prompt reuse feel good instead of like bookkeeping. Click a tile, and its positive/negative text flows out of the πΈ Library node into your conditioning, with its LoRA stack applied automatically if you pass your MODEL/CLIP through. Save + Thumbnail closes the loop: generate, capture, reuse. If you're the kind of person who re-rolls the same character prompt from memory, this is the node that turns your best outputs into a searchable, thumbnailed archive.
Installing it
Part of Frog Node Pack:
- ComfyUI Manager: search Frog Node Pack, install, restart.
- Manual:
cd ComfyUI/custom_nodes && git clone https://github.com/RabbitThatIsPink/FrogNodePack, restart, hard-refresh (Ctrl+Shift+R).
No pip dependencies - requirements.txt is empty; Pillow ships with ComfyUI. Find πΈ Save + Thumbnail under πΈ Node Pack.
Common issues
The error you'll actually hit is an empty text - the node raises rather than saving a blank entry, which is deliberate but can surprise you if an upstream prompt wire came up empty. Check the name too: duplicate names create duplicate tiles unless you flip overwrite_by_name. And if a thumbnail doesn't show up in the gallery, hard-refresh the browser - the node writes the file to data/images/, but a stale frontend cache can hide it until refresh.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| name | STRING | Display name shown on tiles. Required. | |
| text | STRING | Positive prompt text to store. An empty value raises an error so an unwired input doesn't silently save a blank entry. | |
| thumbnail | IMAGE | Image to save as the entry's thumbnail. The first frame of a batch is used. | |
| tags | STRING | Comma-separated tags. Use 'category:value' (e.g. style:cyberpunk) to enable category-grouped filter chips. | |
| overwrite_by_name | BOOLEAN | false | When prompt_id is unset and an entry with this name already exists, update it instead of creating a new one. When several entries share the name the most-recently-updated one wins. |
| negativeopt | STRING | Optional negative prompt stored alongside this entry and emitted on the Library node's 'negative' output. | |
| prompt_idopt | STRING | Override the auto-derived ID. Must match [A-Za-z0-9_-]{1,64}. Leave blank to generate from 'name'. Takes priority over overwrite_by_name. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| text | STRING | The saved prompt text (passthrough of the input). |
| id | STRING | The entry ID β wire into the Library loader's prompt_id or back into this node on the next run. |