Nodes/BV Node Pack/πŸŒ€ BV LUT Registry
ComfyUI Node

πŸŒ€ BV LUT Registry

Name every look once, then forget the filenames

By BlackVortexAIΒ·Created 8 months agoΒ·Updated a day agoΒ· 6
πŸŒ€ BV LUT Registry
    • lut_count
    • registry_summary
    • resource_provider
    β—„config_jsonβ–Ί

    The BV LUT Loader is fine for one look on one image. The moment you want to grade different regions of a scene differently - subject gets "Dustfire", background gets "Cool Graphite", and you want to swap those looks without rewiring anything - you want names, not dropdown positions. That's what this node is: it loads several LUTs at once, gives each a stable id and name, and hands the whole batch to the Regional V3 resource system as a single typed provider.

    It's the LUT counterpart to BV LoRA Registry: same shape, same philosophy. One config block, one output wire, and every downstream regional node references looks by id instead of by file path.

    How it works

    You feed it a config_json string that must match a specific schema (bv.lut_registry_config v1). It looks like this:

    {
      "schema": "bv.lut_registry_config",
      "version": 1,
      "collector_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
      "luts": [
        { "id": "hero", "lut_name": "Built-in: Dustfire" },
        { "id": "bg", "lut_name": "Built-in: Cool Graphite" }
      ]
    }
    

    The node validates the JSON, resolves every lut_name against the built-ins and whatever's in ComfyUI/models/luts, loads each one through the same code path as BV LUT Loader, and builds an immutable registry. Then it packages the registry as a BV_RUNTIME_RESOURCE_PROVIDER - the typed contract that BV Regional LUT Plan and the loop nodes consume. If a name isn't found, the whole node errors rather than silently skipping, which is the right failure mode: you want to know a look is missing before you render 200 frames with a hole in it.

    The collector_id is a UUID and it matters - downstream resource references point at it, so it's what keeps "which LUT is which" stable across workflows. Use one from the UI (the pack's builder generates valid ones) or any UUID generator.

    The inputs and outputs that matter

    One input, config_json (multiline JSON). Three outputs:

    • resource_provider - the one that matters. Wire it to BV Regional LUT Plan (or a loop start's provider inputs) so region jobs can reference "hero" and "bg" by id.
    • lut_count - how many looks registered.
    • registry_summary - one line per look (hero Β· Built-in: Dustfire), a quick textual check that you loaded what you meant to.

    How to install

    It ships in BV Node Pack:

    cd ComfyUI/custom_nodes
    git clone https://github.com/BlackVortexAI/bv_nodepack.git
    

    Restart ComfyUI, hard-refresh the browser. No models to download - LUTs are generated or read from ComfyUI/models/luts.

    Common issues

    • "LUT registry configuration must be bv.lut_registry_config v1" - the JSON is missing the schema/version fields or has an unknown field. Paste the skeleton above and edit from there.
    • "LUT not found: …" - the lut_name isn't a built-in and isn't in your luts folder. The dropdown on the Loader shows exactly what's available; cross-check against that.
    • "collector_id must be a UUID" - an empty or non-UUID collector id. Generate one; the node is strict on purpose.

    Honestly, if you're doing single-image work, this is overkill - use the Loader. If you're building a regional workflow where looks are part of the composition, the registry is how you keep that from turning into a tangle of file paths.

    CategoryπŸŒ€ BV Node Pack/regional/LUT

    Inputs (1)

    NameTypeDefaultDescription
    config_jsonSTRINGβ€”

    Outputs (3)

    NameTypeDescription
    lut_countINTβ€”
    registry_summarySTRINGβ€”
    resource_providerBV_RUNTIME_RESOURCE_PROVIDERβ€”