ComfyUI Extension: ComfyUI-EasyFilePaths
Custom ComfyUI nodes that automatically populate dropdowns based on your folder structure and user configuration, making it easy to generate consistent file names.
Custom Nodes (0)
README
Easy File Namer - ComfyUI Custom Node
Custom ComfyUI nodes that automatically populate dropdowns based on your folder structure and user configuration, making it easy to generate consistent file names.
Available Nodes
This package includes six core node families:
- Easy File Name - Full path and user selection with multiple outputs
- User Select - Simple user-only selection node
- Load Images - Directory loader plus single-image helpers (
Load Images From Directory Path,Load Image From Path,Load Random Image From Folder Path) - Character Lora Select - Config-driven character presets with lora files, power sliders, and prompts
- Action Lora Selectors - WAN / Chroma / QWEN action pickers with shared config
- Easy Loaders - LoRA, UNET, Checkpoint, CLIP, and VAE hint-based loaders
Features
- Automatic Dropdown Population: Scans your configured folder structure and populates dropdowns with available paths
- User Selection: Second dropdown for user selection from configurable user list
- Configurable: Edit
configs/storylist_config.jsonfor paths andusers.jsonfor users - Three Outputs: Outputs relative paths, absolute paths, and user names
- Safety Validation: Node errors if not properly configured - no accidental missing selections
- No Manual Entry: No need to type paths manually - just select from the dropdowns
- Hot Reload: Changes to config are picked up when you add/refresh the node - no restart needed
- Character Presets: Define per-character SDXL/QWEN/Chroma loras, per-model power values, and reusable prompt snippets in
configs/character_config.json - Action Presets: Configure WAN, Chroma, and QWEN action mappings in
configs/action_config.json - Remote Config Support: Automatically prefers
/runpod-volume/configswhen present, falling back to bundled configs otherwise - Visual Editor: Use
character_config_editor.htmlto manage lora paths, power sliders, and prompts in a modern dark-mode UI
Installation
-
Place this folder in your ComfyUI
custom_nodesdirectory:ComfyUI/custom_nodes/easy_filenamer/ -
Restart ComfyUI
Configuration
Story List Configuration (configs/storylist_config.json)
Edit the configs/storylist_config.json file in this folder. Use absolute paths for the base_folder:
ℹ️ Remote Override: If
/runpod-volume/configs/storylist_config.jsonexists, it will be used instead of the local file. This makes it easy to host shared configs while keeping project defaults as a fallback.
{
"base_folder": "X:\\ComfyUI\\custom_nodes\\easy_filenamer\\example folders\\characters",
"story_pattern": "stories"
}
- base_folder: Use an absolute path to the folder you want to scan (e.g.,
X:\\path\\to\\characters) - story_pattern: The folder name pattern to look for (default: "stories")
Users Configuration (users.json)
Edit the users.json file to configure available users:
[
"admin",
"editor",
"writer"
]
Simply list the user names as an array. Users can be anything: usernames, categories, tags, etc.
Usage
Easy File Name Node
- Find the "Easy File Name" node in the utility category
- Add it to your workflow
- Select a story path from the first dropdown
- Select a user from the second dropdown
- Connect the outputs as needed
User Select Node
- Find the "User Select" node in the utility category
- Add it to your workflow
- Select a user from the dropdown
- Connect the output as needed
The User Select node is a simplified version that only provides user selection - useful when you only need the user name without path selection.
Easy File Name Node - Inputs
- story_path: Dropdown populated from your folder structure (e.g.,
bubble\stories\sailing)- ⚠️ IMPORTANT: The dropdown defaults to "PLEASE SELECT A STORY" - you must choose a value!
- user: Dropdown populated from
users.json(e.g.,admin,editor,writer)- ⚠️ IMPORTANT: The dropdown defaults to "PLEASE SELECT A USER" - you must choose a value!
Note: The node will raise an error if you try to execute it without selecting values from both dropdowns.
Easy File Name Node - Outputs
- relative_path: Clean relative path string (e.g.,
bubble\stories\sailing) - absolute_path: Full absolute path (e.g.,
X:\ComfyUI\custom_nodes\easy_filenamer\example folders\characters\bubble\stories\sailing) - user: The selected user name (e.g.,
admin)
You can combine the user and relative_path outputs to create file names with user prefixes.
User Select Node - Inputs
- user: Dropdown populated from
users.json(e.g.,admin,editor,writer)- ⚠️ IMPORTANT: The dropdown defaults to "PLEASE SELECT A USER" - you must choose a value!
User Select Node - Outputs
- user: The selected user name (e.g.,
admin)
Folder Structure Example
Based on this structure:
example folders/
characters/
bubble/
stories/
sailing/
amy/
stories/
road trip/
The node will populate with these options:
bubble\stories\sailingamy\stories\road trip
The output will be a string in this format, ready to use for file naming.
How It Works
- When the node is added to your workflow, it reads the
configs/storylist_config.jsonfile - It scans the
base_folderlooking for directories matchingstory_pattern - For each story found, it constructs a path like
{character}\{story_pattern}\{story_name} - These paths are populated into the dropdown
- When you select a path, it outputs both:
- The relative path (for display/naming)
- The absolute path (for file operations)
Refreshing the Node
Changes to configs/storylist_config.json and users.json are picked up automatically:
- Delete the existing Easy File Name node from your workflow
- Add a new Easy File Name node
- Both dropdowns will now reflect the latest configuration
No need to restart ComfyUI!
Load Images Nodes
This suite covers batch loading, single file loading, and deterministic random sampling.
Load Images From Directory Path
- Inputs
directory(STRING, required): Folder containing images (e.g.,X:/path/to/images)image_load_cap,skip_first_images,select_every_nth(INT): Filtering controlsmeta_batch(VHS_BatchManager, optional): Integrates with Video Helper Suite batching
- Outputs
IMAGE: Batch tensorMASK: Alpha masks (or empty masks)frame_count: Number of frames returnedfile_paths: List of absolute file paths
- Features
- Maintains consistent dimensions via resizing to the most common shape
- Tracks directory changes via hashing for smart caching
- Supports batching helpers via
meta_batch
Load Image From Path
- Inputs
image_path(STRING): Absolute or relative path to a single image
- Outputs
IMAGE: Single image tensorfile_path: Absolute path to the loaded file
- Use Case: When you already know the exact file to fetch without scanning directories.
Load Random Image From Folder Path
- Inputs
directory(STRING): Folder to sample fromseed(INT): Deterministic random seed to pick a single image
- Outputs
IMAGE: Single image tensor selected by the seedfile_path: Absolute path of the chosen image
- Use Case: Procedural or seeded generation where reproducible randomness is needed.
Character Lora Select Node
This node reads the configs/character_config.json file and outputs pre-configured lora file names, power values, and an optional prompt for easy character loading. Perfect for managing multiple character loras across different models in one central place.
Configuration (configs/character_config.json)
Easy Way: Open character_config_editor.html in your browser for a visual editor with search and live preview!
Manual Way: Edit the configs/character_config.json file to configure your character mappings:
ℹ️ Remote Override: If
/runpod-volume/configs/character_config.jsonexists, it replaces the bundled config automatically.
{
"character_loras": {
"bubble": {
"lora_sdxl": "sdxl/character/bubble.safetensors",
"power_sdxl": 0.85,
"lora_qwen": "qwen/character/bubble.safetensors",
"power_qwen": 1.0,
"lora_chroma": "chroma/character/bubble.safetensors",
"power_chroma": 0.75,
"character_prompt": "Energetic, neon-accented heroine with playful poses."
},
"sophie": {
"lora_sdxl": "sdxl/character/sophie.safetensors",
"power_sdxl": 1.0,
"lora_qwen": "qwen/character/sophie.safetensors",
"power_qwen": 1.0,
"lora_chroma": "chroma/character/sophie.safetensors",
"power_chroma": 1.0,
"character_prompt": "Calm strategist with silver hair and holographic visor."
}
}
}
- character_loras: Object mapping character names to their configuration
lora_sdxl,lora_qwen,lora_chroma: Filenames or relative paths for each model familypower_sdxl,power_qwen,power_chroma: Float multipliers applied when loading the LoRAscharacter_prompt: Optional text snippet you can pipe into prompt builders
How It Works
- The node reads
configs/character_config.jsonwhenever it needs to populate the dropdown - Every key under
character_lorasbecomes a selectable character option - When you select a character, the node returns the configured lora filenames, power values, prompt text, and the character name
Inputs
- character: Dropdown populated with character names defined in
character_loras- ⚠️ IMPORTANT: Defaults to "PLEASE SELECT A CHARACTER" - you must choose a value!
Outputs
- lora_sdxl (STRING): The configured SDXL LoRA filename/path
- power_sdxl (FLOAT): Recommended strength for the SDXL LoRA
- lora_qwen (STRING): The configured QWEN LoRA filename/path
- power_qwen (FLOAT): Recommended strength for the QWEN LoRA
- lora_chroma (STRING): The configured Chroma LoRA filename/path
- power_chroma (FLOAT): Recommended strength for the Chroma LoRA
- character_prompt (STRING): Prompt snippet or style guidance for the character
- character_name (STRING): The selected character for easy piping downstream
Usage Example
- Add the "Character Lora Select" node to your workflow
- Select a character from the dropdown (e.g., "bubble")
- Connect the outputs:
lora_sdxl/power_sdxl→ to your SDXL LoRA loaderlora_qwen/power_qwen→ to your QWEN LoRA loaderlora_chroma/power_chroma→ to any Chromatic LoRA loader or equivalentcharacter_prompt→ to your prompt builder or text node
- The loaders will receive pre-configured filenames along with recommended strengths and the prompt text
Benefits
- No Manual Entry: Select characters from a dropdown instead of typing lora names
- Centralized Configuration: Manage all character-lora mappings in one config file
- Prompt Ready: Share consistent character prompts across workflows with one config entry
- Multi-Model Support: Configure different loras for different models (SDXL, QWEN, Chroma, etc.) with per-model strengths
- Hot Reload: Changes to the config are picked up when you refresh the node
Notes
- The node outputs filenames and floats—you still need loader nodes to apply the LoRAs
- Any field can be left blank; the node logs a warning so you know what’s missing
- Character names are case-sensitive and must match across your config and workflows
HTML Config Editor
The character_config_editor.html file provides a visual interface for editing your character configurations:
Features:
- 📁 Load JSON: Start by loading your existing
character_config.jsonfile - 🖱️ Drag & Drop: Drag the JSON file directly onto the upload area
- ➕ Add Characters: Easily add new character entries with one click
- 🗑️ Delete Characters: Remove characters you don't need anymore
- 🔍 Search: Quickly find characters by name
- 📊 Statistics: See how many characters are configured vs empty
- 🌙 Dark Mode: Beautiful dark theme that's easy on the eyes
- 🎨 Modern UI: Responsive design with smooth animations
- 📋 Copy to Clipboard: One-click copy of the generated JSON
- ✅ Live Preview: See the JSON output update in real-time
- 🧹 Clear All: Quick reset button for all fields
- 🔄 Reload: Switch to a different config file without closing the editor
- ⌨️ Keyboard Support: Press Enter to quickly add new characters
- 🎚️ Power Controls: Adjust SDXL/QWEN/Chroma power sliders with validation
- 📝 Prompt Editor: Store reusable character prompt snippets alongside the lora selections
How to Use:
- Open
character_config_editor.htmlin any web browser - Load your
configs/character_config.jsonfile by clicking the upload area or dragging the file - The editor will populate with all characters from your config
- Add new characters: Type a name in the text field and click "Add Character" (or press Enter)
- Edit lora paths: Fill in or edit the lora filenames and strengths for each character
- Delete characters: Click the "Delete" button on any character card you want to remove
- Click "Generate JSON" to see the updated output
- Click "Copy to Clipboard"
- Paste the JSON back into
configs/character_config.jsonand save
Tips:
- The editor dynamically loads from your JSON file, so it works with any number of characters
- New characters are automatically highlighted in green and scrolled into view
- If you try to add a duplicate character, it will scroll to the existing one
- All your existing data is preserved when loading the file
Action Lora Select Nodes
Three companion nodes share a single configs/action_config.json file, each focused on a model family.
Configuration (configs/action_config.json)
{
"wan_actions": {
"martial_stance": {
"primary_lora": "wan/actions/martial_stance_primary.safetensors",
"secondary_lora": "wan/actions/martial_stance_refiner.safetensors"
},
"power_leap": {
"primary_lora": "wan/actions/power_leap_primary.safetensors",
"secondary_lora": "wan/actions/power_leap_refiner.safetensors"
}
},
"chroma_actions": {
"color_burst": "chroma/actions/color_burst.safetensors"
},
"qwen_actions": {
"command_pose": "qwen/actions/command_pose.safetensors"
}
}
wan_actions: Object keyed by action name withprimary_lora/secondary_lorachroma_actions: Action name → lora path stringqwen_actions: Action name → lora path string
ℹ️ Remote Override: Place a copy at
/runpod-volume/configs/action_config.jsonto maintain a central action library. The local config is used only when the remote path is absent.
WAN Action Select
- Outputs:
primary_lora,secondary_lora - Use Case: Workflows that need a two-stage or base/refiner pairing.
Chroma Action Select
- Outputs: Single
lora_name - Use Case: Chromatic LoRA lookups with simple mappings.
QWEN Action Select
- Outputs: Single
lora_name - Use Case: QWEN LoRA selections using shared config data.
All nodes automatically expose available actions by reading the relevant section in configs/action_config.json. Add or edit entries, then refresh the node in ComfyUI to pick up changes.
Easy Lora Loader Node
A forgiving LoRA loader that takes a free-form string and resolves it to the first matching LoRA in your ComfyUI loras paths.
Inputs
model(MODEL): The base model inputlora_hint(STRING): A free-form hint, e.g.sarah.safetensorsorsarahstrength_model(FLOAT): LoRA strength for the model branch (default 1.0)
Matching Rules (case-insensitive)
- Exact match with listed LoRA path (as shown by ComfyUI)
- Endswith match (e.g.
.../sarah.safetensorsendswithsarah.safetensors) - Contains match (fallback)
Conveniences:
- If no extension in the hint, tries
name.safetensorsthenname.pt - Backslashes are normalized to forward slashes
- If multiple matches, the first is used and a warning is printed
Outputs
MODEL: The model with the resolved LoRA applied (clip strength 0)lora_full_path(STRING): The absolute full path to the resolved LoRA file
Example
- Input:
lora_hint = "sarah.safetensors" - Actual LoRA path on disk:
.../loras/characters/red/sarah.safetensors - Result: The node resolves and loads that LoRA, and outputs its absolute path
Easy UNET Loader Node
A forgiving UNET loader that takes a free-form string and resolves it to the first matching diffusion model in your ComfyUI diffusion_models paths.
Inputs
unet_hint(STRING): A free-form hint, e.g.realisticVision.safetensorsorrealisticVisionweight_dtype(choice):default,fp8_e4m3fn,fp8_e4m3fn_fast,fp8_e5m2
Matching Rules (case-insensitive)
- Exact match with listed model path (as shown by ComfyUI)
- Endswith match (e.g.
.../foo/rv.safetensorsendswithrv.safetensors) - Contains match (fallback)
Conveniences:
- If no extension in the hint, tries
name.safetensors, thenname.ckpt, thenname.pt - Backslashes are normalized to forward slashes
- If multiple matches, the first is used and a warning is printed
Outputs
MODEL: The loaded UNET diffusion modelunet_full_path(STRING): The absolute full path to the resolved model file
Example
- Input:
unet_hint = "realisticVision" - Actual model path on disk:
.../diffusion_models/realisticVision_v6.0.safetensors - Result: The node resolves and loads that model, and outputs its absolute path
Easy Checkpoint Loader Node
A forgiving checkpoint loader that accepts a free-form checkpoint hint, resolves the first match, and loads the checkpoint. If supported by your ComfyUI version, the config is guessed automatically.
Inputs
ckpt_hint(STRING): Free-form hint for the checkpoint, e.g.sdxl.safetensorsorsdxl
Matching Rules (case-insensitive)
- Exact match with listed file path (as shown by ComfyUI)
- Endswith match (e.g.
.../checkpoints/sdxl.safetensorsendswithsdxl.safetensors) - Contains match (fallback)
Conveniences:
- If
ckpt_hinthas no extension, tries.safetensors, then.ckpt, then.pt - Backslashes are normalized to forward slashes
- If multiple matches, the first is used and a warning is printed
Outputs
MODEL: The loaded base modelCLIP: The loaded CLIP modelVAE: The loaded VAEckpt_full_path(STRING): Absolute path to the resolved checkpoint file
Example
- Input:
ckpt_hint = "sdxl" - Actual file on disk:
.../checkpoints/sdxl_v1.safetensors - Result: The node resolves and loads the checkpoint, and outputs the checkpoint absolute path
Easy CLIP Loader Node
A forgiving CLIP/text encoder loader that takes a free-form hint and resolves it to the first matching text encoder.
Inputs
clip_hint(STRING): A free-form hint, e.g.t5_xxl.safetensorsormochi_t5type(choice): Selects the CLIP type (e.g.stable_diffusion,sd3,mochi, etc.)device(choice, advanced):defaultorcputo force CPU loading
Matching Rules (case-insensitive)
- Exact match with listed text encoder path (as shown by ComfyUI)
- Endswith match (e.g.
.../text_encoders/t5_xxl.safetensorsendswitht5_xxl.safetensors) - Contains match (fallback)
Conveniences:
- If no extension in the hint, tries
.safetensors, then.pt, then.bin - Backslashes are normalized to forward slashes
- If multiple matches, the first is used and a warning is printed
Outputs
CLIP: The loaded text encoderclip_full_path(STRING): Absolute path to the resolved text encoder file
Example
- Input:
clip_hint = "t5_xxl" - Actual file on disk:
.../text_encoders/t5_xxl.safetensors - Result: The node resolves and loads the text encoder, and outputs its absolute path
Easy VAE Loader Node
A forgiving VAE loader that accepts a free-form hint and resolves it to the first matching VAE option from the standard VAE list (including special options like taesd, taesdxl, taesd3, taef1, and pixel_space).
Inputs
vae_hint(STRING): A free-form hint, e.g.sdxl_vae.safetensorsortaesdxlorpixel_space
Matching Rules (case-insensitive)
- Exact match with listed VAE option (as shown by ComfyUI)
- Endswith match (for file-backed VAEs, e.g.
.../vae/sdxl_vae.safetensorsendswithsdxl_vae.safetensors) - Contains match (fallback)
Conveniences:
- If no extension in the hint, tries
.safetensors, then.pt, then.ckpt - Backslashes are normalized to forward slashes
- If multiple matches, the first is used and a warning is printed
Outputs
VAE: The loaded VAEvae_full_path(STRING): Absolute path if file-backed; empty for virtual options likepixel_space/taesd*
Example
- Input:
vae_hint = "sdxl_vae" - Actual file on disk:
.../vae/sdxl_vae.safetensors - Result: The node resolves and loads the VAE, and outputs its absolute path