ComfyUI-BCNodes
Utility nodes for ComfyUI: logic, mask, image, PostFx film looks, dataset analysis (Caption Audit, Image Quality Gate), Social Media Export, SeedVR2 streaming, loaders and workflow helpers (AutoBypass, Anything Everywhere, comparers).
Nodes (54)
Pick whichever branch you actually wired up
Stop dragging the same wire across the canvas
Prompts Under [WxH] Headers
Make the workflow bring its own models
The cutout node with actual knobs on it
Masks That Snap to Blocks, Not to Pixels
Catch the word that's in every caption before you train
One training caption per frame, wired straight into your dataset folder
Depth Anything in One Node, With No Second Pack to Install
Paint a Colour Through a Mask, Per Frame, Without the Round Trip
One switch per chunk of your workflow
The Face of One Upscale, the Skin Texture of Another
Put A and B on one node and drag the divider
Keep the blurry ones out of the dataset
Stretch, Pad, Crop or Pillarbox
The resize node that takes the mask with it
Did the detector actually find anything?
Glue two batches together and keep the count
Change one sampling field without throwing away the model's own defaults
The node that picks your chat model and loads absolutely nothing
A slider that behaves like a switch, and the 0.5 gotcha
The LoRA Loader That Fixes the Keys Core Skips
Stop your matte looking like Swiss cheese
Grow it, shrink it, feather it — one node, two numbers
Sizes, seeds and step counts without a calculator
The film stock and the grain, applied after the sampler
Your own grade, or one knob on top of a stock
Drop a .cube in the folder and get a colourist's grade
Print every film stock onto your own photo
The node you only need when you're chaining looks
Power Lora Loader — Same Name as rgthree's, Deliberately Different Job
The node that tells you which of your rules is wrong
PreFlight Observe turns an image into a strict JSON description — and refuses to judge it
PreFlight Outcome is how you find out whether your predictions were any good
PreFlight Report predicts how Instagram, TikTok and X will treat your post — as a range, not a verdict
Prompter writes your prompt for you — and can hand back conditioning, ready to sample
Prompt List — Type Twenty Prompts, Get Twenty Runs
Qwen LM runs a chat model inside ComfyUI — no Ollama, no GGUF, no second process
Repeat Mask Batch
Save Image — Filenames That Actually Tell You What Made the Picture
Building a LoRA Dataset Out of Your Outputs
Seed — The Node That Fixes the One Thing `control_after_generate` Gets Wrong
How Many Frames Will Your Card Actually Take? Ask It Instead of Guessing
Pick SeedVR2's Downscale From the Face, Not From Your Mood
SeedVR2 PostProcess — The Colour Match That Stops Upscales Looking 'More AI'
SeedVR2 Decode and Post-Process in One Node, With Your VRAM Not Growing by the Frame
The SeedVR2 Input Stage in One Node, With the Clip Never Held Twice
SeedVR2 Resize — The Input Stage ComfyUI's Own Scale Nodes Can't Reproduce
SeedVR2 VAE Decode — Where Long Clips Used to Die at Frame 190
SeedVR2 VAE Encode — Encodes a Whole Clip Without the VRAM Bill
A Switch You Pick By Name, and Only the Branch You Pick Runs
Show Text — A Window Into Your Graph That Also Travels in the File
Skin Texture — Pores, Because 'Glossy Skin' Is Still the Number One AI Tell
Social Media Export — Stop Letting the Platform Crop Your Crop
ComfyUI-BCNodes
Utility nodes for ComfyUI, in one small pack.
| Registration key | Display name | What it does |
| --- | --- | --- |
| BC_AutoBypass | Auto Bypass | Bypasses its targets automatically when a watched source is empty |
| BC_LogicBoolean | Logic Boolean | 0–1 float → BOOLEAN / NUMBER / INT / FLOAT |
| BC_IsMaskEmpty | Is Mask Empty | MASK → BOOLEAN |
| BC_MaskFillHoles | Mask Fill Holes | Fills enclosed holes in a mask |
| BC_MaskGrow | MaskGrow | Grows / shrinks a mask, then blurs it |
| BC_DrawMaskOnImage | Draw Mask On Image | Paints a colour (with opacity) through a mask onto an image batch |
| BC_BlockifyMask | Blockify Mask | A mask as the blocks of its bounding box that hold any of it |
| BC_RepeatMaskBatch | Repeat Mask Batch | A mask batch repeated amount times |
| BC_ImageScaleByAspectRatio | Image Scale By Aspect Ratio | Scales an image / mask to an aspect ratio and side length; MASK output is never None |
| BC_ImageResize | Image Resize | Resizes an image batch (and mask) to a width and height: stretch, keep the proportion, pad or crop |
| BC_JoinImageLists | Join Image Lists | Concatenates image lists, unlimited inputs |
| BC_MathExpression | Math Expression | Arithmetic over a, b, c without eval() |
| BC_PromptList | Prompt List | One prompt per line, as a list |
| BC_AspectPromptList | Aspect Prompt List | Prompts grouped under [WxH] headers, as prompt / width / height lists |
| BC_AnySwitch | Any Switch | First connected non-None input, any type, unlimited inputs |
| BC_SelectSwitch | Select Switch | Input of the selected named option, any type; only the selected branch runs |
| BC_Seed | Seed | Seed widget; -1 draws a new random seed on every run |
| BC_ShowText | Show Text | Shows incoming text on the node, passes it on |
| BC_QwenLM | Qwen LM | Runs a Qwen chat model (Qwen3.5-4B / 9B, Qwen3.8-27B, Qwen3-VL-8B, and abliterated builds of Qwen3.5-9B and Qwen3-VL-8B) through ComfyUI core: system / user / prefill and images in, text and thinking out, with the official chat templates and sampling defaults and one LoRA; the model file is found in models/Qwen-LM or models/text_encoders, or downloaded on first use |
| BC_LMConfig | LM Config | Sampling settings for an LM node: only the fields you change or link replace the model's official defaults |
| BC_LMLoader | LM Loader | Picks the chat model a wrapper node runs (Captioner, Prompter): family, model, precision, one LoRA and its strength, keep loaded; loads nothing itself, and its lists follow the selected family and model |
| BC_Captioner | Captioner | One training caption per image frame with the model of a connected LM Loader: a built-in tags or prose prompt, or the image alone (none) for your own image-to-caption LoRA, optionally with an instruction or an LM Config; outputs the frames and their captions as lists, ready for Save Image With Caption |
| BC_Prompter | Prompter | One text-to-image prompt from a short brief and / or a reference image with the model of a connected LM Loader: a built-in prompt that writes the person's appearance (include identity) or leaves it to a character LoRA (exclude identity), or none for your own prompter LoRA; text out, and with a CLIP connected the positive conditioning as CLIP Text Encode encodes it |
| BC_PreFlightObserve | PreFlight Observe | Runs Qwen3.5-9B INT8 ConvRot (downloaded on first use) as a pure observation sensor: an image or frame batch → a strict observations JSON (garment, exposure, framing, pose, in-image text, …); greedy, so the same input gives the same output; an error comes back as {"error": ...} |
| BC_PreFlightReport | PreFlight Report | The rules engine: observations + caption → per-platform verdict ranges (Instagram / TikTok / X: OK, RISK = reach demotion, BLOCK = removal), a summary and the prediction logged to the feedback store |
| BC_PreFlightOutcome | PreFlight Outcome | Records what a platform actually did to a published post (clean / demoted / removed); its record list shows each new prediction at once |
| BC_PreFlightCalibrate | PreFlight Calibrate | The feedback store as two calibration tables (per platform, per rule), as text for Show Text; runs again only when the store changed |
| BC_ImageComparer | Image Comparer | Two images on the node, compared with a sliding divider |
| BC_PowerLoraLoader | Power Lora Loader | MODEL + any number of LoRA rows → MODEL, no CLIP; each LoRA with the key fix of Lora Loader (Key Fix) |
| BC_LoraLoaderKeyFix | Lora Loader (Key Fix) | MODEL + one LoRA → MODEL, with the keys ComfyUI's own loader leaves out renamed first (lightx2v .diff_m, PEFT keys without the diffusion_model. prefix); the console says how many were renamed and how many match no module |
| BC_AnythingEverywhere | Anything Everywhere | Feeds unconnected inputs of a type at prompt time |
| BC_FastGroupsBypasser | Fast Groups Bypasser | One bypass toggle per group |
| BC_BiRefNetRemoveBackground | BiRefNet Remove Background | Background removal with BiRefNet, plain torch |
| BC_DepthAnythingV2 | Depth Anything | Depth map with Depth Anything V2 Small or Depth Anything 3 (Small, Base, Mono-Large, Metric-Large; all Apache-2.0), near = white, at a ControlNet preprocessor's size or exactly width x height |
| BC_SeedVR2FramingDownscale | SeedVR2 Framing Downscale | SeedVR2 Resize's downscale_factor from the face size: the tallest SAM 3 face box picks close-up, medium or far, each with its factor; the measured face fraction comes out too |
| BC_SeedVR2Resize | SeedVR2 Resize | Original image → the padded frame SeedVR2 encodes (lanczos downscale, shortest-edge antialiased bicubic, pad 16, 4n+1 frames) plus the colour reference |
| BC_SeedVR2VAEEncode | SeedVR2 VAE Encode | SeedVR2 VAE encode with the frames streamed from RAM slice by slice, so VRAM does not grow with the frame count |
| BC_SeedVR2ChunkSize | SeedVR2 Chunk Size | The longest 4n+1 chunk the SeedVR2 sampler fits on this card, from the latent's size and the card's total memory; wire to Split SeedVR2 Latent's manual frames_per_chunk |
| BC_SeedVR2VAEDecode | SeedVR2 VAE Decode | SeedVR2 VAE decode with every decoded slice streamed to RAM, so VRAM does not grow with the frame count |
| BC_SeedVR2PostProcess | SeedVR2 PostProcess | Post-Process SeedVR2 Output one frame at a time into one float16 output, no full-size temporaries |
| BC_SeedVR2PreprocessCompact | SeedVR2 Preprocess (Compact) | SeedVR2 Resize and VAE Encode in one node: outputs only the latent and the plan PostProcess (Compact) reads, no colour reference kept |
| BC_SeedVR2PostProcessCompact | SeedVR2 PostProcess (Compact) | SeedVR2 VAE Decode and PostProcess in one node: decodes only the kept frames and corrects them in place against a reference rebuilt per chunk from the original frames |
| BC_AutoModelDownloader | Auto Model Downloader | Lists a workflow's models and fetches the missing ones into models/ |
| BC_PostFxApply | PostFx Apply | Applies a postfx film-emulation look (theme + condition + strength) to an image batch, optional look override and mask |
| BC_PostFxTheme | PostFx Theme | Built-in postfx theme → POSTFX_LOOK, to start a chain from a named look |
| BC_PostFxCustomLook | PostFx Custom Look | Builds a look from common controls, or overrides them on top of an incoming look |
| BC_PostFxLut | PostFx LUT | 3D .cube LUT as a look, standalone or layered on a theme |
| BC_PostFxSignatureSheet | PostFx Signature Sheet | Labeled contact sheet of every theme in a category applied to one image |
| BC_CaptionAudit | Caption Audit | Runs caption-audit over a LoRA caption folder and draws the report card on the node |
| BC_SocialMediaExport | Social Media Export | One platform-ready derivative per ticked platform, minimum crop, spec-driven |
| BC_ImageQualityGate | Image Quality Gate | Blur / sharpness / noise / clipping / entropy → PASS / SO-SO / FAIL badge, verdict and scores |
| BC_SaveImage | Save Image | Saves images with folder / file names built from prompt widget values, any Pillow format, prompt + workflow embedded; preview only in the gallery, never under the node |
| BC_SaveImageWithCaption | Save Image With Caption | Saves images as PNG and, with a caption connected, the caption next to each image under the same name, for training datasets |
| BC_SkinTexture | Skin Texture | Micro-texture on skin inside a SAM 3 mask: boosts the image's own detail and multiplies in a synthetic pore field, in linear light |
| BC_FrequencyMerge | Frequency Merge | The low frequencies (structure, colour) of one image + the high frequencies (texture, fine detail) of another of the same size, split by a Gaussian |
| — | Align | Align / distribute buttons in the selection toolbox |
| — | Process Monitor | Not a node: live RAM / VRAM bars, an estimate before a run, per-node measurement, the reason a killed run died, a full clear back to the startup memory without a restart, and a drop stale outputs setting (off) (see Process Monitor) |
Registration keys are BCNodes' own, so the packages above can be installed side by side without a clash. Type BCNodes in the node library to see them all; in the menu they sit in these groups:
| Category | Nodes |
| --- | --- |
| BCNodes/logic | Logic Boolean, Math Expression, Any Switch, Select Switch, Seed |
| BCNodes/mask | Mask Fill Holes, MaskGrow, Draw Mask On Image, Blockify Mask, Repeat Mask Batch, Is Mask Empty, BiRefNet Remove Background |
| BCNodes/image | Image Scale By Aspect Ratio, Image Resize, Join Image Lists, Depth Anything, Social Media Export, Save Image, Save Image With Caption, Skin Texture, Frequency Merge |
| BCNodes/postfx | PostFx Apply, Theme, Custom Look, LUT, Signature Sheet |
| BCNodes/analysis | Image Quality Gate, Caption Audit |
| BCNodes/text | Prompt List, Show Text |
| BCNodes/lm | Qwen LM, LM Config, LM Loader, Captioner, Prompter |
| BCNodes/preflight | PreFlight Observe, Report, Outcome, Calibrate |
| BCNodes/loaders | Power Lora Loader, Lora Loader (Key Fix), Auto Model Downloader |
| BCNodes/seedvr2 | SeedVR2 Framing Downscale, Resize, VAE Encode, Chunk Size, VAE Decode, PostProcess; Compact: Preprocess (Compact), PostProcess (Compact) |
| BCNodes/workflow | Image Comparer, Anything Everywhere, Fast Groups Bypasser, Auto Bypass |
Installation
cd ComfyUI/custom_nodes
git clone https://github.com/0xBeycan/ComfyUI-BCNodes
pip install -r ComfyUI-BCNodes/requirements.txt
Restart ComfyUI. requirements.txt holds opencv-python (the morphology of MaskGrow and the hole filling of Mask Fill Holes) and the two packages that back the PostFx and Caption Audit nodes, postfx and caption-audit; everything else ships with ComfyUI. Without postfx and caption-audit the pack still loads and only those nodes are absent. If this repository is still present under its old name ComfyUI-AutoBypass, delete that folder — its AutoBypass node is this pack's BC_AutoBypass.
The Align buttons are not a node; they appear in the toolbox above a multi-selection.
Documentation
- Logic — booleans, arithmetic, switches and the seed
- Mask — mask checks, fill / grow / draw / blockify / repeat, BiRefNet background removal
- Image — scaling and resizing, image lists, depth maps, social media export, saving, skin texture, frequency merge
- PostFx — film-emulation looks: themes, custom looks, LUTs, signature sheets
- Analysis — the caption set audit and the image quality gate
- Text — prompt lists and showing text
- LM — chat models through ComfyUI core: Qwen LM, LM Config, LM Loader, Captioner, Prompter, the models and their files, sampling, LoRAs,
models.yaml - PreFlight — how Instagram, TikTok and X would likely treat an image or video before it is published: the observation sensor, the rules engine, reading a verdict, the feedback loop and calibration
- Loaders — LoRA loading (with the key fix for LoRAs core loads only in part) and the model downloader
- SeedVR2 — the downscale factor from the framing, the SeedVR2 input stage, streaming VAE encode / decode, the chunk size and the VAE tile for the card, post-processing
- Workflow — image comparer, Anything Everywhere, group bypass, Auto Bypass, the Align buttons
- Unused outputs — unconnected whole-batch outputs come out empty
- Measurements — time, RAM and output size of the mask nodes and Image Resize against the nodes they replace
- Process Monitor — RAM / VRAM live, an estimate before a run, per-node measurement, the report of a killed run, the full clear
- Development — the repository layout, the tests and the import rule
Third-party code
models/birefnet/arch/— the BiRefNet architecture and its Swin v1 backbone, MIT, notices inmodels/birefnet/arch/LICENSE.models/depth_anything_v2/arch/— the Depth Anything V2 DPT head and its DINOv2 ViT-S backbone, Apache-2.0, notices and license text inmodels/depth_anything_v2/arch/LICENSE.
Everything else in this pack is BCNodes' own code.
License
MIT. The code in models/birefnet/arch/ keeps its own MIT notice, in models/birefnet/arch/LICENSE; the code in models/depth_anything_v2/arch/ keeps its Apache-2.0 license, in models/depth_anything_v2/arch/LICENSE.