ComfyUI Extension: ComfyUI-EasyFilePaths

Authored by Tr1dae

Created

Updated

0 stars

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:

    1. Easy File Name - Full path and user selection with multiple outputs
    2. User Select - Simple user-only selection node
    3. Load Images - Directory loader plus single-image helpers (Load Images From Directory Path, Load Image From Path, Load Random Image From Folder Path)
    4. Character Lora Select - Config-driven character presets with lora files, power sliders, and prompts
    5. Action Lora Selectors - WAN / Chroma / QWEN action pickers with shared config
    6. 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.json for paths and users.json for 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/configs when present, falling back to bundled configs otherwise
    • Visual Editor: Use character_config_editor.html to manage lora paths, power sliders, and prompts in a modern dark-mode UI

    Installation

    1. Place this folder in your ComfyUI custom_nodes directory:

      ComfyUI/custom_nodes/easy_filenamer/
      
    2. 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.json exists, 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

    1. Find the "Easy File Name" node in the utility category
    2. Add it to your workflow
    3. Select a story path from the first dropdown
    4. Select a user from the second dropdown
    5. Connect the outputs as needed

    User Select Node

    1. Find the "User Select" node in the utility category
    2. Add it to your workflow
    3. Select a user from the dropdown
    4. 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\sailing
    • amy\stories\road trip

    The output will be a string in this format, ready to use for file naming.

    How It Works

    1. When the node is added to your workflow, it reads the configs/storylist_config.json file
    2. It scans the base_folder looking for directories matching story_pattern
    3. For each story found, it constructs a path like {character}\{story_pattern}\{story_name}
    4. These paths are populated into the dropdown
    5. 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 controls
      • meta_batch (VHS_BatchManager, optional): Integrates with Video Helper Suite batching
    • Outputs
      • IMAGE: Batch tensor
      • MASK: Alpha masks (or empty masks)
      • frame_count: Number of frames returned
      • file_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 tensor
      • file_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 from
      • seed (INT): Deterministic random seed to pick a single image
    • Outputs
      • IMAGE: Single image tensor selected by the seed
      • file_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.json exists, 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 family
      • power_sdxl, power_qwen, power_chroma: Float multipliers applied when loading the LoRAs
      • character_prompt: Optional text snippet you can pipe into prompt builders

    How It Works

    1. The node reads configs/character_config.json whenever it needs to populate the dropdown
    2. Every key under character_loras becomes a selectable character option
    3. 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

    1. Add the "Character Lora Select" node to your workflow
    2. Select a character from the dropdown (e.g., "bubble")
    3. Connect the outputs:
      • lora_sdxl / power_sdxl → to your SDXL LoRA loader
      • lora_qwen / power_qwen → to your QWEN LoRA loader
      • lora_chroma / power_chroma → to any Chromatic LoRA loader or equivalent
      • character_prompt → to your prompt builder or text node
    4. 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.json file
    • 🖱️ 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:

    1. Open character_config_editor.html in any web browser
    2. Load your configs/character_config.json file by clicking the upload area or dragging the file
    3. The editor will populate with all characters from your config
    4. Add new characters: Type a name in the text field and click "Add Character" (or press Enter)
    5. Edit lora paths: Fill in or edit the lora filenames and strengths for each character
    6. Delete characters: Click the "Delete" button on any character card you want to remove
    7. Click "Generate JSON" to see the updated output
    8. Click "Copy to Clipboard"
    9. Paste the JSON back into configs/character_config.json and 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 with primary_lora / secondary_lora
    • chroma_actions: Action name → lora path string
    • qwen_actions: Action name → lora path string

    ℹ️ Remote Override: Place a copy at /runpod-volume/configs/action_config.json to 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 input
    • lora_hint (STRING): A free-form hint, e.g. sarah.safetensors or sarah
    • strength_model (FLOAT): LoRA strength for the model branch (default 1.0)

    Matching Rules (case-insensitive)

    1. Exact match with listed LoRA path (as shown by ComfyUI)
    2. Endswith match (e.g. .../sarah.safetensors endswith sarah.safetensors)
    3. Contains match (fallback)

    Conveniences:

    • If no extension in the hint, tries name.safetensors then name.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.safetensors or realisticVision
    • weight_dtype (choice): default, fp8_e4m3fn, fp8_e4m3fn_fast, fp8_e5m2

    Matching Rules (case-insensitive)

    1. Exact match with listed model path (as shown by ComfyUI)
    2. Endswith match (e.g. .../foo/rv.safetensors endswith rv.safetensors)
    3. Contains match (fallback)

    Conveniences:

    • If no extension in the hint, tries name.safetensors, then name.ckpt, then name.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 model
    • unet_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.safetensors or sdxl

    Matching Rules (case-insensitive)

    1. Exact match with listed file path (as shown by ComfyUI)
    2. Endswith match (e.g. .../checkpoints/sdxl.safetensors endswith sdxl.safetensors)
    3. Contains match (fallback)

    Conveniences:

    • If ckpt_hint has 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 model
    • CLIP: The loaded CLIP model
    • VAE: The loaded VAE
    • ckpt_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.safetensors or mochi_t5
    • type (choice): Selects the CLIP type (e.g. stable_diffusion, sd3, mochi, etc.)
    • device (choice, advanced): default or cpu to force CPU loading

    Matching Rules (case-insensitive)

    1. Exact match with listed text encoder path (as shown by ComfyUI)
    2. Endswith match (e.g. .../text_encoders/t5_xxl.safetensors endswith t5_xxl.safetensors)
    3. 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 encoder
    • clip_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.safetensors or taesdxl or pixel_space

    Matching Rules (case-insensitive)

    1. Exact match with listed VAE option (as shown by ComfyUI)
    2. Endswith match (for file-backed VAEs, e.g. .../vae/sdxl_vae.safetensors endswith sdxl_vae.safetensors)
    3. 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 VAE
    • vae_full_path (STRING): Absolute path if file-backed; empty for virtual options like pixel_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