π BV LUT Job
Chain looks together by hand, one node at a time
- lut
- plan
- mask
- plan
- job_count
- summary
BV LUT Job is the "manual chains" way to build a LUT plan: each instance of the node appends one LUT + mask operation to an immutable list, and you chain several of them together to describe a sequence of grades. If BV Regional LUT Plan is the fancy route where regions and detectors decide everything, this is the plain, visible, no-magic route - better for small hand-built stacks and for learning what a plan actually is.
A plan here is just a versioned list of jobs, each with a LUT, an optional mask, a strength, and a mask-invert flag. Chain three Job nodes and you've described a three-step grade: warm base, sky swap, vignette. Later, hand that plan to BV LUT Loop Start and the loop executes it in order.
How it works
Each Job node takes a lut (from BV LUT Loader or a registry) plus a strength and a mask-invert toggle, optionally a mask, and - if you're chaining - the previous node's plan. It validates the incoming plan (the author's schema checks are strict: every job needs lut, strength, and mask_invert), appends its own job to a copy, and returns the new plan.
The important word there is immutable: it never mutates the incoming plan, it builds a new one. That matters because it makes plans safe to reuse - the same base plan can feed two different chains without one contaminating the other, which is a surprisingly rare property in graph node land.
Its summary output is the nice touch: a string like Warm Contrast -> Dustfire built from the accumulated job titles. Wire it to a display node and you can read the whole chain at a glance without opening anything.
The inputs and outputs that matter
lut- the LUT for this step. ABV_LUT_PROTOTYPEfrom the Loader or Registry.strength- 0β1, how strongly this step applies.mask_invert- boolean; flips the mask so the grade hits everywhere except the mask.plan(optional) - the incoming plan when chaining; leave unconnected to start a fresh one.mask(optional) - restrict this step to a region.- Outputs:
plan(feed to the next Job or to Loop Start),job_count,summary.
How to install
Ships in BV Node Pack:
cd ComfyUI/custom_nodes
git clone https://github.com/BlackVortexAI/bv_nodepack.git
Restart ComfyUI, hard-refresh the browser. Or ComfyUI Manager β "BV Node Pack". No model downloads.
Common issues
- "BV LUT prototype plan job N is invalid" - the incoming plan was built by something that isn't a prototype-format plan, or a job is missing a required field. If you mixed a regional plan into a manual chain, that's your culprit - the two schemas differ.
- "plan must be a version 1 BV LUT prototype plan" - the
planinput isn't a plan at all; you probably connected the wrong output. - The loop runs in the wrong order - jobs execute in the order they're appended, so the node closest to Loop Start in the chain is job 1. The
summarystring shows the order; check it.
For a single look you don't need a plan at all - just BV Apply LUT. But if you're stacking grades and want to keep them explicit, editable, and inspectable, chaining Job nodes beats a pile of nested Apply nodes every time.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| lut | BV_LUT_PROTOTYPE | β | |
| strength | FLOAT | 1.000β1 | β |
| mask_invert | BOOLEAN | false | β |
| planopt | BV_LUT_PLAN | β | |
| maskopt | MASK | β |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| plan | BV_LUT_PLAN | β |
| job_count | INT | β |
| summary | STRING | β |