Nodes/EBU Workflow/EBU Unique File Name
ComfyUI Node

EBU Unique File Name

Never overwrite a save again

By burnsbert·Created about a year ago·Updated 12 months ago· 0
EBU Unique File Name
    • unique_filename
    strfile
    join_str-
    seed0

    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 seed from a random source to force re-runs, remember the node doesn't use the seed's value - only whether it changed.
    CategoryUtility

    Inputs (3)

    NameTypeDefaultDescription
    strSTRINGfile
    join_strSTRING-
    seedINT0

    Outputs (1)

    NameTypeDescription
    unique_filenameSTRING