Nodes/Frog Node Pack/🐸 Save + Thumbnail
ComfyUI Node

🐸 Save + Thumbnail

Save a library entry and its thumbnail in one queue step β€” build your prompt library as you generate

By RabbitThatIsPinkΒ·Created 3 months agoΒ·Updated 24 days agoΒ· 1
🐸 Save + Thumbnail
  • thumbnail
  • text
  • id
β—„nameβ–Ί
β—„textβ–Ί
β—„tagsβ–Ί
β—„overwrite_by_namefalseβ–Ί
β—„negativeβ–Ί
β—„prompt_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 the text side (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:value form (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's negative output 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 over overwrite_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.

Category🐸 Node Pack

Inputs (7)

NameTypeDefaultDescription
nameSTRINGDisplay name shown on tiles. Required.
textSTRINGPositive prompt text to store. An empty value raises an error so an unwired input doesn't silently save a blank entry.
thumbnailIMAGEImage to save as the entry's thumbnail. The first frame of a batch is used.
tagsSTRINGComma-separated tags. Use 'category:value' (e.g. style:cyberpunk) to enable category-grouped filter chips.
overwrite_by_nameBOOLEANfalseWhen 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.
negativeoptSTRINGOptional negative prompt stored alongside this entry and emitted on the Library node's 'negative' output.
prompt_idoptSTRINGOverride 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)

NameTypeDescription
textSTRINGThe saved prompt text (passthrough of the input).
idSTRINGThe entry ID β€” wire into the Library loader's prompt_id or back into this node on the next run.