ApoGalleria-Ideo4
ApoGalleria-Ideo4 is a prompt library, not a prompt generator
- export_json
Ideogram 4 is a strange model to own. It was trained exclusively on structured JSON captions, so a plain sentence underperforms on it badly - and the documented way to prompt it, with hex palettes and [ymin, xmin, ymax, xmax] boxes on a 0–1000 grid, is genuine regional control that no other open model offers. It's also tedious enough that another custom node exists purely to have an LLM write the JSON for you.
ApoGalleria-Ideo4 takes the opposite bet: rather than generating captions, it treats the good ones you already have as a reusable library - browse them, lock the fields you like, graze across entries until something new is assembled, then pass the finished schema out as a string.
What you actually get
A split UI. On the left, a searchable grid gallery of your saved image/caption pairs with a folder-tree category picker you can create, rename and reorganise from the same flyout. On the right, the editable caption fields - the natural-language descriptions, plus the raw palette and element JSON underneath them.
The feature that makes it work is per-field locking. Every field has its own lock toggle, and a locked field ignores whichever library image you click next - so you browse for a lighting read, lock it, browse for a background, lock that too, and end up with a caption assembled from four source images. It's far more hands-on than asking a vision model to describe your idea back to you, and it suits Ideo4 because the schema is granular enough that a single field is genuinely reusable.
A mode toggle switches between Populate (library live, unlocked fields fill from the entry you select) and Pass to Output (library off, your current state assembled into the full schema).
How the node itself works
The quirk to understand first: nearly all the state lives in the frontend widget, not in Python. The JS side holds the gallery, the locks and the mode toggle, and on queue it assembles the full schema into a hidden STRING widget called assembled_json (default: "{}"). The Python class just returns that string unchanged as export_json.
So assembled_json is a hidden widget the UI writes to - nothing to configure. export_json is what you wire into Kijai's Ideogram 4 Prompt Builder via its import_json input. The pack's two sibling nodes convert that same output to Flux.2's schema, or to prose for Z-Image, Krea 2, Qwen-Image, Flux 1 and WAN.
Building the library
Pairs live as library/<category>/<entry_id>.<ext> plus a matching .json (a .txt sidecar is equivalent) inside the pack folder. Categories are leaf folders holding entries; grouping folders hold only subfolders, never entries.
Three ways in:
- PNG from your Ideogram 4 pipeline - Import from Image, then Save Current Image + JSON; the embedded caption metadata is extracted into a sidecar. No hand-authoring.
- JPG or WEBP - needs a pre-written JSON or txt caption, selected alongside the image when you save.
- Bulk - drop folders of image/caption pairs into the library directory.
Loaded entries can be edited live or copied out in one click.
Installing it
- ComfyUI Manager → search
ApoGalleria→ install. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/ApoloniArt/ApoGalleria ComfyUI-ApoGalleria
pip install -r ComfyUI-ApoGalleria/requirements.txt
- Restart. All three nodes appear, though the menu splits them: the Ideo4 node sits under ApoStudio/Gallery, the converters under ApoGalleria. Searching "ApoGalleria" finds all three.
Dependencies are Pillow>=9.0.0 and nothing else. The pack ships with an empty library; the author's ~60,000-image Visual Aesthetics Library is a separate project handed out through their Discord, so budget time to build your own.
Where people get burned
Back up library/ outside custom_nodes. Your collection lives inside the pack folder, and custom_nodes is the one directory people routinely nuke and re-clone. git pull is safe; deleting the folder is not.
Overwrite means overwrite. If you mixed fields from four entries and then hit overwrite, the currently selected image is the file that gets replaced - not the source of the field you just locked. The confirmation dialog is load-bearing; read it every time.
PNG import depends on embedded metadata. If the PNG didn't come out of your Ideo4 pipeline there's nothing to extract - use the sidecar route.
Nodes 2.0 and the legacy canvas differ. Normal mode scrolls with the wheel but visuals vanish below ~57% zoom; Nodes 2.0 uses a scrollbar and survives zooming out. The author's tip: spawn the node, pick an image, then open Live JSON Preview - resize first and every preview open expands it again.
It's early and quiet. The pack landed in September 2026 from a solo author, ApoloniArt, with no community discussion behind it yet. The README and the source are your documentation; the node's value is entirely the library you put into it.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| assembled_json | STRING | {} | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| export_json | STRING | — |