MetaHub Save 3D Model
The only 3D save node that remembers how the mesh was born
- model_3d
ComfyUI's built-in 3D save is a cold end to a hot workflow. SaveGLB writes the mesh and drops everything else - the prompts, the seed, the model, the LoRAs that shaped it are gone, and six months later you're staring at a .glb you can't even tell which checkpoint produced. MetaHub Save 3D Model fixes exactly that: it's the save node from the Image MetaHub pack that stamps a full generation recipe onto your mesh, both embedded in the file and as a readable sidecar.
It's the official companion node for Image MetaHub, a free, local-only image browser for the 20k-PNGs-of-chaos crowd. That app lives on the metadata your normal save nodes throw away, and this node is how you get that metadata out of ComfyUI's 3D corner. No API, no cloud, no key - everything happens on your machine.
How it works
Wire it up and it reads the graph, not a form. It walks your workflow, pulls out seed, steps, CFG, sampler, scheduler, positive/negative prompts, the checkpoint name plus its SHA256 hash, and any LoRA stack, then bundles that with telemetry (VRAM peak, GPU device, generation time) into one JSON payload. The payload goes two places: a sidecar file, <name>.glb.imagemetahub.json, next to every save in every format, and - for GLB only - embedded inside the file at asset.extras.imagemetahub_data, which is the glTF 2.0 standard spot for exactly this kind of thing. --disable-metadata nukes both; the mesh still saves.
The input side matters more than the metadata, though. The model_3d socket is a wildcard that accepts two very different things:
- A ComfyUI
MESH(from ComfyUI-3D-Pack or the native nodes) - a batch of vertex/face tensors with optional vertex colors, UVs, and a texture. The node hand-writes a real glTF 2.0 binary: texture embedded as a PNG, transparency promoted toBLENDalpha mode, and an optional unlit material. It writes this as.glb. - A
File3Dobject - something that already knows its own format (GLB, GLTF, OBJ, FBX, STL). It just callssave_to()and keeps whatever format the upstream node produced.
That second path is the quiet win: mesh → GLB, but your File3D stays OBJ if that's what you need for a slicer or Blender.
The inputs that matter
Only two are required, and you'll probably leave one alone:
model_3d- the mesh or File3D. Connect this and the node does the rest.filename_prefix- default3d/ComfyUI, which lands files inoutput/3d/ComfyUI_00001_.glbwith the usual auto-incrementing counter.
Optional fields are the Image MetaHub organizer stuff: tags, notes, and project_name (so files arrive pre-sorted in the app), plus generation_time_override - feed it the elapsed_time output from the same pack's MetaHub Timer node for honest timing instead of a rough estimate. There are no output sockets - it's an output node - but it pushes ui.3d, so ComfyUI's native 3D preview shows the saved model right in the graph.
Installing it
Standard fare, no heavy deps. ComfyUI Manager → search Image MetaHub Save → install → restart. Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/LuqP2/ImageMetaHub-ComfyUI-Save.git
cd ImageMetaHub-ComfyUI-Save
pip install -r requirements.txt
Then restart ComfyUI and look for MetaHub Save 3D Model under 3d/save. Its dependencies are just numpy and Pillow - both already in any ComfyUI install, so there's no CUDA wheel roulette like the rest of the 3D ecosystem.
Where people trip
- Wrong input type. It's a wildcard socket, so a
GS_PLYsplat or point cloud will connect visually, then throwTypeError: expected a MESH or File3D valueat runtime. If you want splats saved, you're in the wrong node. - Empty or broken meshes. An empty mesh raises "Cannot save an empty 3D mesh"; out-of-range face indices raise a clear error. Generated 3D often has garbage topology - that's a mesh-quality problem, not a node bug, and the error is at least honest about it.
- Metadata missing but file saved. If the extractor can't parse a custom node in your graph, the save still succeeds and flags the metadata
partial- the mesh is never the casualty. - "Where did my files go?" It uses the same
folder_pathscounter system asSaveImage, so batch items get_00001_,_00002_suffixes inoutput/3d/.
Given this pack has effectively zero search visibility yet, you may be an early adopter - but the mechanism is solid, the GLB writer is genuinely hand-rolled, and for anyone who wants their 3D outputs as reproducible as their PNGs, this is the one.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| model_3d | * | ComfyUI MESH or File3D model | |
| filename_prefix | STRING | 3d/ComfyUI | — |
| tagsopt | STRING | — | |
| notesopt | STRING | — | |
| project_nameopt | STRING | — | |
| generation_time_overrideopt | FLOAT | — |
Outputs (0)
No outputs