Nodes/Majoor Assets Manager/〽️ Majoor Save Image πŸ’Ύ
ComfyUI Node

〽️ Majoor Save Image πŸ’Ύ

SaveImage, but it keeps a stopwatch on every render

By MajoorWaldiΒ·Created 9 months agoΒ·Updated 4 days agoΒ· 127
〽️ Majoor Save Image πŸ’Ύ
  • images
  • geninfo_override
    β—„filename_prefixMajoorβ–Ί
    β—„generation_time_ms-1β–Ί

    The short version

    Majoor Save Image is a drop-in replacement for ComfyUI's built-in SaveImage node. Same job - write your PNGs to the output folder with the prompt and workflow JSON baked in - but it adds one thing the core node won't give you: generation_time_ms, embedded right in the PNG text chunks. That number is what the Majoor Assets Manager sidebar (the pack this node ships in) uses so you can sort, filter, and find outputs by how long they took to render.

    Honest framing: if you never open the Assets Manager sidebar, this is still a perfectly good SaveImage that happens to write an sRGB ICC profile into its files. But the real point is the pair - the node feeds the library. Open the pack's sidebar, and every render you saved through this node shows up with its timing, prompt, and workflow ready to browse or drag back onto the canvas.

    Why the extra metadata matters

    ComfyUI's culture runs on "workflow included" - the prompt and workflow JSON get stuffed into every PNG as text chunks, which is exactly how you drag an old image onto the canvas and reconstruct the whole graph. Core SaveImage already does that. What Majoor adds is the timing dimension and the majoor_geninfo chunk, which makes the difference between "I know this took a while" and "I know this exact render took 14.2 seconds and here's the seed." If you're reviewing batches or building a dataset, that's not a nicety, it's the point.

    How it works

    When you run the node, it writes the standard chunks - prompt, workflow - plus:

    • generation_time_ms - elapsed time since the prompt started
    • CreationTime - an ISO timestamp
    • a majoor_geninfo chunk, if you've fed it from Majoor Gen Info Override

    The auto-detection is the neat part. Leave generation_time_ms at -1 (the default) and the node reads the prompt start time from the pack's runtime_activity module, which hooks into the ComfyUI prompt lifecycle. You get an accurate wall-clock measurement with zero wiring. Want to record something else - say, a render you resumed? Just type the number in milliseconds.

    One thing worth knowing: ComfyUI's frontend only rewrites %date% placeholders in the prefix for its own core save nodes, so the Majoor devs had to handle it server-side. The node resolves %date:...% tokens itself, which means prefixes like Majoor_%date:%Y-%m-%d% just work here.

    Inputs that matter

    • images (IMAGE) - the batch you're saving. Same as core SaveImage.
    • filename_prefix (STRING, default Majoor) - filename prefix, supports the usual ComfyUI placeholders including %date:...%.
    • generation_time_ms (INT, default -1) - leave at -1 to auto-detect, or set it explicitly.
    • geninfo_override (MAJOOR_GENINFO) - optional; wire it from Majoor Gen Info Override when you want the recorded generation info to be explicit instead of auto-traced.

    It's an output node, so there are no output sockets - just the save action. ComfyUI shows the saved images in the UI result, same as SaveImage.

    Install

    ComfyUI Manager β†’ search "Majoor Assets Manager" β†’ install β†’ restart. Or manually:

    cd ComfyUI/custom_nodes
    git clone https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager
    cd ComfyUI-Majoor-AssetsManager
    pip install -r requirements.txt
    

    The pack is heavier than it looks at a glance - aiohttp, aiosqlite, PyAV, watchdog, and friends - because it's a full media library, not just these three nodes. The save node itself only needs the runtime deps above, and ComfyUI Manager installs those for you.

    Gotchas

    • If you launch ComfyUI with --disable-metadata, the extra chunks aren't written at all. Check your launch flags before assuming the node is broken.
    • The sidebar won't pick up new files until it rescans - hit Ctrl+S in the Assets Manager tab.
    • generation_time_ms showing 0 means the runtime hook hadn't recorded a prompt start, usually from an oddly-queued render. Not a real problem, and an explicit value fixes it.

    This node is the boring half of the pack, and that's the compliment. It's a core SaveImage that also keeps receipts - and once you've used the library it feeds, you'll miss the receipts when you go back.

    CategoryMajoor

    Inputs (4)

    NameTypeDefaultDescription
    imagesIMAGEThe images to save.
    filename_prefixSTRINGMajoorPrefix for the saved file. Supports ComfyUI formatting placeholders.
    generation_time_msoptINT-1Generation time in milliseconds. -1 = auto-detect from prompt lifecycle.
    geninfo_overrideoptMAJOOR_GENINFOExplicit geninfo override from Majoor Gen Info Override.

    Outputs (0)

    No outputs