EBU Unique File Name
Never overwrite a save again
- unique_filename
EBU Unique File Name generates a filename that changes every single run. Feed it a base string like "portrait", a separator like "-", and you get back portrait-2026_08_16_14_30_05. Feed it into any save node's filename field and you've eliminated the "my last image got clobbered" failure mode forever.
It's part of the EBU Workflow pack (burnsbert/ComfyUI-EBU-Workflow), a small utility collection with no external dependencies. This is the pack's answer to the annoying habit ComfyUI's built-in save nodes have of reusing the same output name until you remember to change the counter.
How it works
Nothing clever, and that's the appeal. The node takes your base string, appends join_str, then appends the current time formatted as %Y_%m_%d_%H_%M_%S (year_month_day_hour_minute_second). That's second-level granularity, so two runs within the same second could collide - but in practice, nobody queues two saves in the same second and expects both to survive as distinct files. If you need more than that, rename manually.
The output is a single STRING, unique_filename, ready for a save node's filename input or a path builder.
The input that isn't really an input
Here's the thing worth understanding: seed (default 0) is a dummy. The node's code ignores it entirely - the timestamp always comes from datetime.now() at execution time. So why does it exist?
Because ComfyUI caches node results by their inputs. If a node's inputs never change, ComfyUI can skip re-executing it and just reuse the cached output - which would mean the filename wouldn't change run to run. The dummy seed exists to give you a widget you can change (or let a randomizer drive) to force the node to re-run and produce a fresh timestamp. In practice the node re-executes in most flows anyway, but the seed is there for when caching bites you.
Inputs
- str (STRING, default "file") - the base name.
- join_str (STRING, default "-") - the separator between base and timestamp. Use "_" if your downstream tooling hates dashes, or "" for
base2026_08_16.... - seed (INT) - ignored by the logic, exists to bust the cache.
Where it fits
Any save node that takes a string filename - Image Save, video frame writers, anything that writes to disk. It's also handy for logs: pair it with the pack's EBU Append To File and you can build a file-per-run log without ever worrying about collision.
Installing
Standard EBU Workflow install - no dependencies beyond Python's standard library, no model downloads. ComfyUI Manager (search "EBU Workflow"), or:
cd ComfyUI/custom_nodes
git clone https://github.com/burnsbert/ComfyUI-EBU-Workflow
then restart ComfyUI.
Gotchas
- Second-level timestamps mean same-second collisions are theoretically possible. Rare enough that I wouldn't engineer around it.
- The timestamp is local time, not UTC. If you sync outputs across machines in different timezones, the names won't sort chronologically. Cosmetic, but it has caught people out.
- If you're driving
seedfrom a random source to force re-runs, remember the node doesn't use the seed's value - only whether it changed.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| str | STRING | file | — |
| join_str | STRING | - | — |
| seed | INT | 0 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| unique_filename | STRING | — |