ComfyUI Extension: comfyui-comparison-grid

Authored by evandcoleman

Created

Updated

0 stars

Run ComfyUI workflows without the setup

No installs, no CUDA version roulette, no GPU sitting idle on your bill. Bring a workflow and run it in the browser.

A custom ComfyUI node that generates comparison grids in a single node.

Looking for a different extension?

Custom Nodes (0)

    README

    ComfyUI Comparison Grid

    A custom ComfyUI node that generates comparison grids in a single node. Compare any two parameters (LoRA, strength, seed, steps, CFG, sampler, scheduler, denoise) across rows and columns, with labeled cell images and an assembled grid output.

    Installation

    Clone this repo into your ComfyUI custom_nodes directory:

    cd /path/to/ComfyUI/custom_nodes
    git clone https://github.com/evandcoleman/comfyui-comparison-grid.git
    

    Restart ComfyUI. The node will appear under image/comparison as Comparison Grid.

    How It Works

    The Comparison Grid node replaces what would normally be a large multi-node workflow (100+ nodes for a 4x4 grid) with a single node. Internally it:

    1. Parses row and column axis values
    2. Pre-loads all needed LoRA weights
    3. Iterates over every row/col combination, running the full pipeline per cell:
      • Applies LoRA (if applicable)
      • Samples (KSampler equivalent)
      • Decodes via VAE
      • Overlays a text label ("row_label | col_label")
    4. Assembles all cells into a labeled grid image with row/column headers

    Node Inputs

    Required

    | Input | Type | Description | |-------|------|-------------| | model | MODEL | Base diffusion model | | clip | CLIP | CLIP model | | vae | VAE | VAE for decoding | | positive | CONDITIONING | Positive prompt conditioning | | negative | CONDITIONING | Negative prompt conditioning | | latent_image | LATENT | Starting latent (e.g. from EmptyLatentImage) | | row_axis | COMBO | Parameter to vary across rows | | row_values | STRING | One value per line for the row axis | | col_axis | COMBO | Parameter to vary across columns | | col_values | STRING | One value per line for the column axis | | default_lora | COMBO | Default LoRA file (used when lora is not an axis) | | default_strength | FLOAT | Default LoRA strength | | default_seed | INT | Default seed | | default_steps | INT | Default sampling steps | | default_cfg | FLOAT | Default CFG scale | | default_sampler | COMBO | Default sampler algorithm | | default_scheduler | COMBO | Default scheduler | | default_denoise | FLOAT | Default denoise strength | | font_size | INT | Label font size | | font_color | STRING | Label text color (hex, e.g. #FFFFFF) | | bg_color | STRING | Label background color (hex, e.g. #000000) |

    Optional

    | Input | Type | Description | |-------|------|-------------| | font_path | STRING | Path to a .ttf font file | | lora_name | * | LoRA filename from an upstream download node | | lora_N | * | Additional LoRA filenames (dynamic inputs: lora_1, lora_2, ...) |

    Outputs

    | Output | Type | Description | |--------|------|-------------| | cell_images | IMAGE | Batch of all labeled cell images (R*C images, row-major) | | grid_image | IMAGE | Single assembled grid image with row/column headers | | num_rows | INT | Number of rows in the grid | | num_cols | INT | Number of columns in the grid |

    Axis Parameters

    Any two of these can be used as row/column axes:

    | Parameter | Value Format | Example | |-----------|-------------|---------| | lora | Filename (from loras/ folder) | my_lora.safetensors | | strength | Float | 0.5, 0.75, 1.0 | | seed | Integer | 12345, 67890 | | steps | Integer | 10, 20, 30 | | cfg | Float | 1.5, 4.0, 7.0 | | sampler | Sampler name | euler, dpmpp_2m_sde | | scheduler | Scheduler name | normal, karras | | denoise | Float (0-1) | 0.5, 0.75, 1.0 |

    Values are entered one per line in the multiline text inputs.

    LoRA Integration

    LoRA files are loaded from ComfyUI's standard loras/ folder via folder_paths. There are two ways to provide LoRAs:

    From the dropdown (non-axis default)

    Select a LoRA from the default_lora dropdown. This is used when lora is not one of the axes.

    From upstream download nodes (axis or default)

    Connect one or more lora_name / lora_N inputs from upstream nodes that output filenames (e.g. comfyui-model-manager's ModelManagerLoRADownload node).

    When lora is an axis, the linked LoRA inputs become the axis values automatically, replacing whatever is in the multiline text field. The label for each LoRA is derived from its filename (extracting "Epoch N" patterns when present).

    Example Workflow

    A minimal workflow with this node:

    UNETLoader ─────────────┐
    CLIPLoader ──┬──────────┤
                 |          |
    CLIPTextEncode(+) ──────┤
    CLIPTextEncode(-) ──────┤
    VAELoader ──────────────┤
    EmptyLatentImage ───────┤
                            |
    ModelManagerLoRADownload ──┐
    ModelManagerLoRADownload ──┤
    ModelManagerLoRADownload ──┤
    ModelManagerLoRADownload ──┤
                               ▼
                       ComparisonGrid
                               |
                               ▼
                         SaveImage
    

    A companion workflow generator script (generate_workflow.py) is available in the LoRA-Testing project that builds this workflow from a simple config.

    License

    MIT

    Run ComfyUI workflows without the setup

    No installs, no CUDA version roulette, no GPU sitting idle on your bill. Bring a workflow and run it in the browser.

    Learn more