Save Video To Immich Server
Put your clips somewhere you'll actually find them
- video
- video
Video is the worst thing to own in this hobby. A five-second clip is hundreds of megabytes, it lands in ComfyUI/output/video/ next to four hundred of its friends, and you'll only find the good one again if you remember roughly when you made it. If you run Immich - self-hosted photo and video library, albums, phone app - this node saves the clip and files it into that library.
And to be clear: this is not an API node. No service, no credits, nothing leaving your network - it's a save node with a POST request to a box you own.
How it works
It subclasses ComfyUI's core Save Video, which means the encoding, the format/codec handling, the filename counter and the embedded metadata are all still core's job - this node only adds a note into the workflow copy and then, after the file is on disk, uploads it.
The upload path is unglamorous and works: it reads back the path core just wrote, builds http://<hostname>:<port>, checks that your Immich settings are complete, creates the album if it doesn't exist, and POSTs the file to Immich's /assets endpoint with your API key in an x-api-key header. Tags go along as an XMP sidecar written next to the file (Dublin Core subject plus IPTC keywords, which is what Immich reads), and it's deleted from your output folder afterwards. Finally it tries to POST the workflow and prompt to a /gz/ingest endpoint - that endpoint only exists in the author's own Immich fork, so on stock Immich that last step quietly fails and everything else works fine.
The inputs
Required: video (the VIDEO socket - whatever your video model emits), filename_prefix (default video/ComfyUI, so output lands in output/video/), format (default auto) and codec. Optional: notes, album_name, tags. One output, video, passed through unchanged.
format and codec come from core: pick a format and the codec list repopulates, so leave both alone unless a device complains. A plain h264 mp4 is the boring right answer, and auto gets you one.
album_name and tags are what make this worth having over rsyncing. An empty album falls back to the Default Album from settings, and your tags merge with the Default Tags from settings - so one standing ai-video tag plus per-run tags makes the library searchable later.
Install and setup
Manager → search Gprompts → install → restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/GadzoinksOfficial/comfyui_gprompts
The pack's only Python requirement is pillow. (The ffmpeg requirement in the README belongs to the audio node - this one hands encoding to core.) Then create an API key in Immich and enter it under Settings → Gadzoinks in ComfyUI: API key, hostname, port. That's server-wide config, shared by all four Immich nodes in the pack.
One install caveat: it subclasses core's newer Save Video, so it needs a reasonably current ComfyUI. On an old install the import fails and every node in the pack vanishes at once - read the console before reinstalling.
Where people get burned
- The URL is hardcoded to
http://. A reverse-proxied Immich with TLS won't connect; point the node at the plain internal host and port. - Settings are pushed from the browser. At execution the node asks any connected frontend for the Immich config and waits a few seconds, falling back to what was last persisted to disk. Run it once with the UI open, and headless or queued runs keep working afterwards. If it never finds a browser and nothing was saved, you get
Missing Hostname, Port, Api Key- with the node's own message pointing you at Settings → Gadzoinks. - The upload blocks the queue. The POST happens inside the node's execution, so ComfyUI sits there until the file is transferred. A 300MB clip to a NAS over wifi means every subsequent job waits. Keep Immich on the LAN.
- Notes aren't quite what the tooltip says. In the shipped 2.6 source the
noteswidget isn't used; the note added to the embedded workflow comes from the last prompt computed by the pack's GPrompts node, if you have one in the graph. Wire GPrompts in and you get it for free. - The local copy stays. The README describes an optional "delete after upload", but the 2.6 code hardwires keeping the file. Assemble the workflow with that in mind if disk is tight.
Verdict: if you already run Immich, this is the least annoying way to get clips off your ComfyUI box and onto your phone. If you don't, nothing here is worth standing up a server for.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| video | VIDEO | The video to save. | |
| filename_prefix | STRING | video/ComfyUI | The prefix for the file to save. This may include formatting information such as %date:yyyy-MM-dd% or %Empty Latent Image.width% to include values from nodes. |
| format | COMBO | auto | The format to save the video as. |
| codec | COMBO | The codec to use for the video. | |
| notesopt | STRING | Optional text for Notes Node in embedded workflow. | |
| album_nameopt | STRING | Optional album to add the video to. | |
| tagsopt | STRING | Optional tags. Comma seperated. Merged with Tags from Settings. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |