Visual Filename Manager (Studio Leiel)
Stop wiring 40 string nodes together — drag your filename into shape instead
- run_after
- text_1
- text_2
- text_3
- text_4
- text_5
- text_6
- text_7
- text_8
- text_9
- text_10
- filename_prefix
- folder
- filename
- report
You care about filenames, and ComfyUI makes you pay for it. A name like 2026-08-21_Le Seuil_retrovintage(1.0)_Elise_v2(0.95)_steps(10)_time(57.4s)_00001_.png normally costs you 40–60 nodes of Widget To String, Text Concatenate, and Text Find and Replace - and every one of them runs after rendering. One mistake means a finished render that never gets saved. Visual Filename Manager (Studio Leiel) is the person who sat down and said "there has to be a better way."
The name undersells it, honestly. It's a drag-and-drop filename builder. Every widget in your workflow - sampler, steps, shift, LoRA names and strengths, checkpoint, seed - appears as a chip in a palette at the top of the node. You drag chips into a FOLDER box and a FILE box, and a live preview at the bottom shows the exact path before you ever hit Queue. No API, no key, nothing to train. It's plumbing, but it's the good kind.
How it works
The trick is that ComfyUI hands every node two hidden inputs: PROMPT (node id → class → widget values for the whole graph) and EXTRA_PNGINFO (the workflow JSON, including node titles and modes). This node reads those and looks up "node title → widget → value" for the entire workflow. That's the whole magic - no wiring needed, because the data was already there.
Bypass sync is where it gets actually clever. The backend checks each chip's node mode (mute = 2, bypass = 4) and drops the chip from the name in real time. Bypass your enhancer and Enhancer(0.5) vanishes from the preview while you watch - no re-queue, no rewiring. The filename records what actually ran, which is the entire point. Chips aren't deleted, just marked bypassed - omitted, so your layout survives a day of toggling nodes.
The layout lives in the node as layout_json, so it travels with the workflow file and re-points itself at whatever graph it's pasted into (matched by node class, then title, then unique widget). Every change is also snapshotted to browser storage, and the SAVE panel can export the layout as plain text.
The inputs that matter
Both real inputs are optional, and the node labels them with what they're for:
run_after (for elapsed)- connect the image line feeding Save Image here if you use theelapsedchip. The node otherwise may run before sampling and report a near-zero time. The value is discarded; it exists purely to force ordering.lora_text (for LoraManager)- with willmiao's Lora Manager, the browser can only see every registered LoRA (often 20+). Feeding itstrigger_wordsoutput in here narrows the palette to the ones actually switched on.
Widgets worth knowing: folder_style = names_only (default) strips strengths and drops numeric chips from the folder path while keeping them in the filename - same chip gives you retrovintage in the folder and retrovintage(1.0) in the name. resolve_mode = ui_snapshot (default) means the preview equals the output; switch to live_prompt only if you want runtime values like a randomized seed, and accept the tradeoffs.
Outputs: filename_prefix (folder + name - feed it to Save Image's filename_prefix widget after converting that to an input), plus separate folder, filename, and a report string that lists anything dropped and why. The report is the first place to look when a name isn't what you expected.
Install
Via ComfyUI Manager: Manager → Custom Nodes Manager, search "Visual Filename Manager", install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/studioleiel/comfyui-visual-filename-manager
Then restart ComfyUI and hard-refresh the browser (Ctrl+Shift+R) - the UI is a frontend extension and browsers cache it aggressively. Zero dependencies, Python standard library only. No models, no heavy downloads.
Troubleshooting
- Node appears but no UI inside → cached JS. Hard-refresh.
- Palette empty → press the R button to rescan the workflow.
- Time reads near zero →
run_afterisn't connected (only matters if you useelapsed). - Chip shows
skipped in folder→ expected; numeric chips are dropped from folders undernames_only. - Chip resolves to the wrong value → flip
resolve_modeback toui_snapshot.
Worth knowing before you fall in love: this is a brand-new pack with no community track record yet, so the edge-case lore a battle-tested node accumulates hasn't had time to form. The code is defensive - it never raises and always falls back to a valid name - which is more than most custom nodes can claim, but treat early versions with caution. Prefer typing? The same pack ships the text-template sibling Filename Template.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| layout_json | STRING | — | |
| folder_sep | STRING | / | — |
| file_sep | STRING | _ | — |
| max_filename_chars | INT | 19040–250 | — |
| resolve_mode | COMBO | ui_snapshot | 2 options: ui_snapshot, live_prompt |
| folder_style | COMBO | names_only | 2 options: names_only, as_is |
| escape_percent | BOOLEAN | true | — |
| fallback_name | STRING | LEIEL_FALLBACK | — |
| run_afteropt | * | — | |
| lora_textopt | STRING | — | |
| text_1opt | * | — | |
| text_2opt | * | — | |
| text_3opt | * | — | |
| text_4opt | * | — | |
| text_5opt | * | — | |
| text_6opt | * | — | |
| text_7opt | * | — | |
| text_8opt | * | — | |
| text_9opt | * | — | |
| text_10opt | * | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| filename_prefix | STRING | — |
| folder | STRING | — |
| filename | STRING | — |
| report | STRING | — |