* chore: relicense to GPL-3.0 and backfill upstream attribution ComfyUI-Koolook v0.1.0 and v0.1.1 shipped under a claimed MIT license while already incorporating GPL-3.0-derived code from fxtdstudios/radiance under forks/radiance_koolook/. GPL-3.0 §5(c) requires the entire combined work to be GPL-3.0 — relicensing the whole package is the simplest honest fix and aligns with the dominant license posture of the ComfyUI custom-node ecosystem. Changes: - Add full GPL-3.0 LICENSE text at repo root (pyproject.toml already referenced LICENSE but the file did not exist). - Update README.md "## License" section to declare GPL-3.0 and explain the §5(c) implication for downstream users. - Backfill forks/THIRD_PARTY.md with full attribution entries for the Radiance v1.0.1 baseline (already in the repo) and the upcoming Radiance v2.3.3 VAE subset (scaffolded in v0.1.2). - Update forks/forks_manifest.yaml: set the existing entry's license field to "GPL-3.0" (was "to_verify_at_source_ref"), add a license_verified_at field, and pre-register the v2.3.3 VAE entry with verified license metadata. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * feat(skills): add license-pre-check + port add-external-fork to .claude/skills/ Two skills to prevent the v0.1.0/v0.1.1 license-incompatibility class of bug from happening again on future forks: - license-pre-check: blocking compatibility audit run BEFORE any code is copied or written based on upstream. Reads the upstream LICENSE, compares against ours via an SPDX matrix, refuses to proceed on incompatible combinations, and records the result for the manifest. - add-external-fork: ports the existing .cursor/skills/add-external-fork procedure to .claude/skills/ so Claude Code can run it directly. The port adds a mandatory Phase 0 ("run license-pre-check first") and expands Phase 3c to require GPL §5(a) modification headers on derived files. The .cursor/ copy is left in place for Cursor users; the two should be kept in sync manually until a unifying mechanism is adopted. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * feat(forks): port v2.3 VAE Encode/Decode as slim video-friendly wrapper Adds forks/radiance_koolook/versions/v2_3_3/ — a slim re-implementation of RadianceVAEEncode / RadianceVAEDecode under the namespace suffix __koolook_v2_3_3. Mirrors the input surface of upstream's RadianceVAE4KEncode / RadianceVAE4KDecode (fxtdstudios/radiance v2.3.3, GPL-3.0) but deliberately skips the 4K cosine-blend tile engine. Why skip the tile engine: that pipeline errors with `size of tensor a (192) must match the size of tensor b (132) at non-singleton dimension 4` when chained into Wan 2.2 video workflows, because the tiler's spatial layout disagrees with the video VAE's internal temporal-aware encoding. Modern video VAEs (Wan 2.2, Hunyuan, CogVideoX, LTX) handle their own internal stitching, so the tiler is redundant and actively breaks the chain. What ships: - forks/radiance_koolook/versions/v2_3_3/nodes_vae.py — RadianceVAEEncode and RadianceVAEDecode classes (~330 lines), rank-agnostic, with a STRING `debug_info` second return that mirrors the pattern from v1's RadianceOCIOColorTransformV2. - forks/radiance_koolook/versions/v2_3_3/__init__.py — applies __koolook_v2_3_3 namespace suffix and " (Koolook v2.3.3)" display suffix, mirroring the v1_0_1 wrapper layout. - forks/radiance_koolook/versions/v2_3_3/UPSTREAM_PIN.yaml — pinned upstream commit f262f47 + license metadata. - forks/radiance_koolook/__init__.py — merges v1_0_1 + v2_3_3 mappings. - pyproject.toml — version bumped to 0.1.2. - CHANGELOG.md — full [0.1.2] entry covering the license relicense, the new v2_3_3 fork, the two new skills, and the carry-over RELEASING.md docs that landed on main since 0.1.1. Existing __koolook_v1_0_1 nodes are unchanged and remain available for backward compatibility with saved workflows. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * refactor(forks/v2_3_3): rename VAE nodes to Easy_hdr_VAE_encode/decode + bump 0.1.3 Per user direction, the new video-friendly VAE wrappers are now exposed under clean Koolook-style IDs and display names — no more `__koolook_v2_3_3` suffix in the ComfyUI node-add UI: - `Easy_hdr_VAE_encode` (was `RadianceVAEEncode__koolook_v2_3_3`) - `Easy_hdr_VAE_decode` (was `RadianceVAEDecode__koolook_v2_3_3`) Why: when both upstream Radiance v2.3.3 and our pack are installed, both expose `Radiance VAE Encode` in the search — the Koolook-suffixed display name still buried "Koolook" at the end of a long line, so users were likely to mis-pick. The new names lead with the Koolook brand and the Easy_* family convention used elsewhere in this pack (Easy_Version, EasyAIPipeline, EasyResize, etc.). Mechanism: new `SKIP_VERSION_SUFFIX = {...}` set in `versions/v2_3_3/__init__.py` opts specific IDs out of the auto-suffix. The version is still tracked structurally (file path) and textually (file header, UPSTREAM_PIN.yaml, forks/THIRD_PARTY.md). Future Koolook-original nodes in this fork can opt out the same way; ports of upstream-named classes still get the suffix by default for collision safety. 0.1.2 was test-published to the registry with the previous IDs but never tagged or formally released; bumping to 0.1.3 publishes the renamed version cleanly. Old 0.1.2 entry retained in CHANGELOG with a "superseded" note for transparency. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
ComfyUI-Koolook-Nodes
This repository provides custom nodes for ComfyUI tailored for VFX and AI image/video generation workflows.
For change history see CHANGELOG.md. For workflow conventions and naming see CLAUDE.md and Glossary.md.
Koolook nodes (root package)
| Node | Display name | Category | Source |
|---|---|---|---|
Easy_Version |
Easy Version | VFX/Utils |
k_easy_version.py |
EasyWan22Prompt |
Wan 2.2 Easy Prompt | Koolook/Wan_Video |
k_easy_wan22_prompt.py |
EasyResize |
Easy Resize | Koolook/Image |
k_easy_resize.py |
EasyAIPipeline |
Easy AI Pipeline | Koolook/VFX |
k_ai_pipeline.py |
easy_ImageBatch |
Easy Image Batch | Koolook/VFX |
k_easy_image_batch.py |
KoolookLoadCameraPosesAbsolute |
Koolook Load Camera Poses (Absolute Path) | Koolook/Camera |
k_easy_track.py |
Brief descriptions:
- Easy Version: Generates a padded version string like
v001from an integer. Ideal for naming renders, sequences, or iterations in VFX pipelines. - Wan 2.2 Easy Prompt: Dynamic prompt builder driven by
config.json(light source, lighting type, time of day, etc.). Outputs a comma-separated prompt string and optional CLIP conditioning. - Easy Resize: Aspect-aware image resize that enforces divisibility (e.g.,
32) for model compatibility. Modes: stretch, letterbox, pillarbox; padding and cropping supported. Inspired by the Resize Image V2 node from ComfyUI-KJNodes. - Easy AI Pipeline: Aggregates VFX shot parameters (shot duration, seed, base path, shot name, AI method, version) into a fully formatted output file path with overwrite protection. For organized writes from Save EXR / Save Image.
- Easy Image Batch: Builds an
IMAGE+MASKbatch of lengthtotal_framesfrom 1–4 keyframe images placed at explicit frame indices (withstart_frameoffset). Empty frames are filled with black/gray and the mask marks empty=white / occupied=black. Useful for sparse keyframe control with Wan-style video models. - Koolook Load Camera Poses (Absolute Path): Loads RealEstate10k-style
CAMERACTRL_POSESfrom any absolute path (no ComfyUI path stripping), with overrideable pose width/height. Pairs with AnimateDiff CameraCtrl downstream.
Radiance Koolook nodes (forked, namespaced)
These come from forks/radiance_koolook/versions/v1_0_1/ and load through the root __init__.py. All IDs are namespaced with the suffix __koolook_v1_0_1 (display suffix (Koolook v1.0.1)) to avoid collisions with upstream Radiance.
- HDR / EXR / color:
ImageToFloat32,Float32ColorCorrect,HDRExpandDynamicRange,HDRToneMap,ColorSpaceConvert,SaveImageEXR,LoadImageEXR,LoadImageEXRSequence,SaveImage16bit,HDRHistogram,LogCurveEncode,LogCurveDecode - OCIO:
RadianceOCIOColorTransformV2(also exposed under the compact IDk_easy_OCIO_v101),RadianceLogCurveDecode
See forks/README.md for the full fork workflow.
Features
- Dynamic Inputs for Prompts: Fields and dropdowns in Wan 2.2 Easy Prompt are defined in
config.json, allowing easy customization without code changes—great for VFX artists iterating on lighting or camera parameters. - Image Resizing with Aspect Control: Easy Resize ensures precise resolutions for AI models, with options for keep_proportion preservation, padding colors, and device selection (CPU/CUDA). Supports masks for compositing in VFX.
- Pipeline Path Generation: Easy AI Pipeline assembles VFX-style output paths and filenames from shot/version inputs, with optional version disabling and overwrite protection.
- Sparse Keyframe Batches: Easy Image Batch constructs aligned
IMAGE+MASKbatches from up to four keyframe images, ready for sparse video-model control. - Camera Pose Loading: Koolook Load Camera Poses (Absolute Path) reads RealEstate10k pose TXT files from any disk location and emits
CAMERACTRL_POSES. - Startup Loading: Nodes load configurations at ComfyUI launch; edit
config.jsonand restart to update. - Output Formatting: Wan 2.2 Easy Prompt outputs comma-separated strings (skipping "none"), compatible with prompt builders. Easy Resize outputs resized images, masks, and width/height integers. Easy Version provides padded strings for filename appending.
- Error Handling: Fallbacks for missing/invalid JSON in Wan 2.2 Easy Prompt; validation for aspect ratios and divisibility in Easy Resize.
- Compatibility: Works with ComfyUI-Manager for easy installation via Git URL. The Koolook root nodes have no extra Python dependencies; the Radiance Koolook nodes optionally use
OpenEXR,Imath,PyOpenColorIO,colour,opencv-python, andimageio(imports are guarded — if a dep is missing, the affected Radiance node is unavailable but the rest of the package still loads).
RunPod
RunPod management has been moved to a separate private repository for active operations and iteration.
- Runtime/deployment scaffolding is no longer maintained in this public repo.
- This public repo remains focused on the ComfyUI nodes/plugin code.
Release & Stability
For production usage, install a pinned stable tag/commit instead of following moving branch heads.
- Release procedure:
RELEASING.md(canonical, step-by-step) - Per-release checklist template:
.github/ISSUE_TEMPLATE/release_checklist.md - Change history:
CHANGELOG.md - Fork tracking:
forks/THIRD_PARTY.md,forks/forks_manifest.yaml - Fork workflow guide:
forks/README.md
Tagging Policy (from now on)
- Repo releases:
vMAJOR.MINOR.PATCH(example:v0.2.0). - Fork code versions in paths use underscore format:
v1_0_1,v2_3_3. - Comfy node ID namespace suffixes match fork version paths:
__koolook_v1_0_1. - External raw checkout naming:
- pinned:
<repo>-v<version>-koolook - rolling upstream:
<repo>-main-upstream
- pinned:
Sibling Projects
Some related work lives in sibling folders/repositories outside MAIN. They are consulted (read-only knowledge sources, references, etc.) but never imported by MAIN at runtime. To keep the public repo free of machine-specific absolute paths, every sibling is referenced through an environment variable.
Conventions
- Variable prefix:
KOLOOK_*(matches the existingKOLOOK_FORKS_DIR). - Real paths live in a local, gitignored
.envfile. The committed.env.exampledeclares the variable names with placeholder values. - Public docs and committed code reference siblings only via the env var name (and an optional portable relative default like
../<folder>). Never hardcode an absolute path with a username. - A sibling project is a runtime-optional reference. If the variable is unset and no default is documented, agents/code must treat the sibling as unavailable and continue gracefully.
Registered siblings
| Role | Env var | Portable default | Status |
|---|---|---|---|
| External forks root (raw upstream clones) | KOLOOK_FORKS_DIR |
../ComfyUI-Forks |
documented in forks/forks_manifest.yaml |
| ComfyUI knowledge database | KOLOOK_COMFYUI_KB_DIR |
../ComfyUI_knowledge___DB |
read-only knowledge source |
| Personal knowledge database | KOLOOK_PERSONAL_KB_DIR |
(no default — user-specific) | optional |
Local setup
cp .env.example .env
# Edit .env to point at the real paths on your machine.
Do not commit .env. The default .gitignore already excludes .env, .env.local, and .env.*.local.
External Fork Workflow (No Vendoring in MAIN)
This repository is the MAIN control repo. Large third-party repositories must stay outside MAIN.
- Default external forks root (relative):
../ComfyUI-Forks - MAIN stores only:
- wrappers under
forks/ - provenance/tracking under
forks/
- wrappers under
- MAIN does not store full external trees (no vendored copies).
Radiance Koolook Version Layout
- Package entry path:
forks/radiance_koolook/__init__.py - Version path (current):
forks/radiance_koolook/versions/v1_0_1/ - Modified node source is local and tracked in MAIN:
forks/radiance_koolook/versions/v1_0_1/nodes_hdr.pyforks/radiance_koolook/versions/v1_0_1/nodes_color_management.pyforks/radiance_koolook/versions/v1_0_1/nodes_dna.py
- External checkout is reference-only raw upstream:
- default location:
../ComfyUI-Forks/radiance-v1.0.1-koolook - baseline used for comparison: upstream
comfyuitag (f1b8ae330848fa08aba24c9d3e355cb432d3515b) becausev1.0.1tag is not published upstream
- default location:
- Node IDs are namespaced with version suffixes (current:
__koolook_v1_0_1) to avoid collisions. - Each version folder should include
UPSTREAM_PIN.yamlto keep parity with external pinned references.
Version Pinning (Portable Across PCs/macOS)
- Track every external repo in
forks/forks_manifest.yamlwith:source_ref(tag/version)pinned_commit(exact hash used in production)external_checkout.relative_path_from_forks_root
- Keep checkout folder names versioned, e.g.:
radiance-v1.0.1-koolookradiance-v2.3.3-koolook
Machine Setup Example
From the parent directory that contains ComfyUI-Koolook:
mkdir -p ../ComfyUI-Forks
cd ../ComfyUI-Forks
git clone https://github.com/fxtdstudios/radiance.git radiance-v1.0.1-koolook
cd radiance-v1.0.1-koolook
git checkout f1b8ae330848fa08aba24c9d3e355cb432d3515b
This external folder is for upstream comparison/sync work only.
Installation
Via ComfyUI-Manager (Recommended)
- Open ComfyUI and access the Manager interface.
- Go to "Install Custom Nodes" > "Install via Git URL".
- Paste the repository URL:
https://github.com/malkuthro/ComfyUI-Koolook.git. - Install and restart ComfyUI.
- Nodes appear under these categories in the node search:
VFX/Utils— Easy VersionKoolook/Wan_Video— Wan 2.2 Easy PromptKoolook/Image— Easy ResizeKoolook/VFX— Easy AI Pipeline, Easy Image BatchKoolook/Camera— Koolook Load Camera Poses (Absolute Path)- Radiance categories (set by upstream Radiance) for the namespaced
(Koolook v1.0.1)nodes
Manual Installation
- Clone this repository into your
ComfyUI/custom_nodes/directory:git clone https://github.com/malkuthro/ComfyUI-Koolook.git - Ensure
__init__.pyandconfig.jsonare in the cloned folder. - Restart ComfyUI.
The root Koolook nodes have no additional Python dependencies. To enable the Radiance Koolook v1.0.1 nodes that handle EXR / OCIO / HDR work, install the optional packages: OpenEXR, Imath, PyOpenColorIO, colour-science, opencv-python, and imageio.
Usage
Easy Version
- Add the "Easy Version" node to your workflow under "VFX/Utils".
- Connect an INT input (e.g., from a Constant node) to the "version" slot.
- Output is a STRING like "v001" for input 1, "v011" for 11—use for appending to filenames in Save Image nodes or VFX render queues.
Wan 2.2 Easy Prompt
- Add the "Wan 2.2 Easy Prompt" node to your workflow under "Koolook/Wan_Video".
- Select options from the dropdowns (e.g., Light Source: "Sunny lighting", Lighting Type: "Soft lighting").
- Add custom text in the "body" field for main prompt content.
- Optionally connect a CLIP for conditioning output.
- Connect the STRING outputs (combined_prompt or fields_only) to a prompt input, such as the "prompt" slot in the PromptJSON node (from NeuralSamurAI/ComfyUI-PromptJSON).
- To customize fields:
- Edit
config.json(see example below). - Restart ComfyUI to apply changes.
- Edit
- VFX Tip: Use for generating consistent lighting/shot descriptions in video generation workflows, like with AnimateDiff or SVD.
Example config.json
This is the default configuration based on Wan 2.2 parameters:
{
"category": "Koolook/Wan_Video",
"node_name": "Wan_2.2",
"fields": [
{
"name": "light_source",
"type": "combo",
"options": ["none", "Sunny lighting", "Artificial lighting", "Moonlighting", "Practical lighting", "Firelighting", "Fluorescent lighting", "Overcast lighting", "Mixed lighting"],
"default": "none"
},
{
"name": "lighting_type",
"type": "combo",
"options": ["none", "Soft lighting", "Hard lighting", "Top lighting", "Side lighting", "Underlighting", "Edge lighting", "Silhouette lighting", "Low contrast lighting", "High contrast lighting"],
"default": "none"
},
// ... (additional fields like time_of_day, shot_size, etc.)
],
"output_type": "STRING"
}
Easy Resize
- Add the "Easy Resize" node to your workflow under "Koolook/Image".
- Connect an IMAGE (and optional MASK) input.
- Set the base dimension (Width or Height), base size, aspect ratio (e.g., "16:9" for landscape, "9:16" for portrait), and other options like keep_proportion (stretch, letterbox, pillarbox), pad_color (e.g., "0, 0, 0" for black), crop_position, divisible_by, and device.
- Connect the outputs: IMAGE and MASK for further processing, INT width/height for resolution-aware nodes like samplers or upscalers.
- VFX Tip: Use for preprocessing footage in multi-resolution pipelines, ensuring divisibility for efficient GPU processing in tools like IPAdapter or ControlNet.
Node Code Overview
The core logic is split across files for modularity:
Root Koolook nodes:
- k_easy_version.py —
Easy_Versionclass for padded version-string formatting. - k_easy_wan22_prompt.py — loads
config.jsonat import time, builds inputs dynamically (combos for dropdowns, strings for text), and formats selections into prompt strings with optional CLIP conditioning. - k_easy_resize.py — parses aspect ratios, computes divisible dimensions, resizes with
common_upscale, and handles padding/cropping. Inspired by Resize Image V2 from ComfyUI-KJNodes. - k_ai_pipeline.py —
EasyAIPipelinebuilds VFX output paths/filenames from shot/version inputs and creates the output directory. - k_easy_image_batch.py —
easy_ImageBatchbuilds alignedIMAGE+MASKkeyframe batches with placeholder fill. - k_easy_track.py —
KoolookLoadCameraPosesAbsoluteloads RealEstate10k pose TXT files from any path.
Forked/wrapped nodes:
- forks/radiance_koolook/ — version-namespaced wrapper for the Radiance fork. Currently exposes the
v1_0_1set; modified node sources live inforks/radiance_koolook/versions/v1_0_1/{nodes_hdr,nodes_color_management,nodes_dna}.py. The wrapper applies the__koolook_v1_0_1ID suffix and the optional short IDk_easy_OCIO_v101. - forks/forks_manifest.yaml, forks/THIRD_PARTY.md, forks/README.md — fork tracking metadata.
Glue and frontend:
- __init__.py — imports all node packages, merges
NODE_CLASS_MAPPINGS/NODE_DISPLAY_NAME_MAPPINGS, and exposesWEB_DIRECTORY = "./web". - web/ — JavaScript extensions loaded by ComfyUI for the Koolook nodes (e.g.,
ai_pipeline.js).
For advanced customizations (e.g., different output formats or additional resize modes), modify the execute or adjust_to_aspect methods in the respective files.
Troubleshooting
- ComfyUI Won't Start: Check console logs for errors (run
python main.py). Common: Missingconfig.jsonor invalid JSON—use a validator like jsonlint.com. - No Fields Visible in Wan 2.2 Easy Prompt: Indicates JSON load failure; the node falls back to empty inputs.
- Errors in Easy Resize: Ensure aspect ratio is "w:h" format, divisible_by >=1, and pad_color is "r, g, b" floats (0.0-1.0).
- Updates: Pull latest from GitHub and restart.
Credits
- Based on ComfyUI custom node examples.
- Parameters for Wan 2.2 Easy Prompt derived from Wan 2.2 docs (https://alidocs.dingtalk.com/i/nodes/EpGBa2Lm8aZxe5myC99MelA2WgN7R35y).
- Easy Resize inspired by ComfyUI-KJNodes (https://github.com/kijai/ComfyUI-KJNodes), specifically the Resize Image V2 node in image_nodes.py.
- Compatible with nodes like PromptJSON for LLM workflows.
License
GPL-3.0 (see LICENSE).
This package incorporates and adapts code from
fxtdstudios/radiance (also
GPL-3.0) under forks/radiance_koolook/. Per GPL-3.0 §5(c), the entire
work is licensed as GPL-3.0. Attribution and per-fork modification notes
are tracked in forks/THIRD_PARTY.md and
forks/forks_manifest.yaml.
Note for downstream users: any work that incorporates, links to, or derives from
ComfyUI-Koolookmust itself be distributed under GPL-3.0 (or a compatible license). If you need a non-copyleft license for any piece of this code, contact the maintainers — some Koolook-original nodes (those with no upstream Radiance lineage) may be available under a more permissive license on request.