- Fix batch bypass tuple handling, memory budget device-awareness, grain
RNG device, roto payload limits, preview temp-file cleanup, and route
double-registration.
- Add native VIDEO output (fps/audio) to effect nodes that previously
only returned IMAGE/MASK when fed a VIDEO input.
- Split the oversized src/preview/ops/geometry.ts and add a starting
golden-fixture test harness (spherize, transform) comparing backend
and frontend math.
- Remove ImageOpsAppendV2 (Autogrow) and ImageOpsLensArtifacts; inline
Append's helper back into its single caller.
- Collapse the Color Correct curve widget behind a toggle so the node
no longer grows too tall.
- Fix Crop/generic-node video preview playback running at the RAF rate
instead of the source video's real fps.
- Fix Crop losing its saved output size after a workflow reload:
syncCropWidgets recomputed height from width and a preset aspect
ratio on every resync (including onConfigure on load), discarding
the restored value. It now only refreshes aspect-ratio bookkeeping
on a resync.
Build example/All Nodes MIO.json from the node schemas with
scripts/generate_example_workflow.py: 32 nodes plus Load Image, 39
links, executed end to end in ComfyUI. An integration test fails when
the file goes stale.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Defining NODE_CLASS_MAPPINGS made ComfyUI skip comfy_entrypoint, so
/imageops/viewmedia and node replacements were never registered. Load
as a V3 extension only, move server.py to routes.py so it stops
shadowing ComfyUI's server module, and transcode animated previews
with PyAV instead of an external ffmpeg.
- Require ComfyUI 0.19.0 (has_intermediate_output); CI floor updated.
- Process 11 nodes on ComfyUI's torch device when the frames fit in
free memory (IMAGEOPS_COMPUTE_DEVICE=cpu disables it).
- Add core CURVE input to Color Correct, BOUNDING_BOX output/input to
Crop and Crop Stitch, LAYERS output to Comp (ComfyUI 0.31+),
essentials_category, and Merge blend modes with golden parity.
- Report progress through the public set_progress API and drop the
hidden unique_id input.
- Add ImageOps settings and a refresh-previews command.
- Fix ImageOpsComp rotation and preview saving (undefined
to_display_range) and masked Transform edge colors.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Add ImageOpsVignette, ImageOpsChromaticAberration, ImageOpsBloom, and
ImageOpsLensArtifacts for common lens/compositing effects.
- Add ImageOpsDefocus: depth-driven defocus/bokeh with shaped aperture
kernels (circle/hexagon/octagon/custom) and highlight bloom.
- Add input_space (srgb/linear) to ImageOpsColorAjust so scene-linear/HDR
sources aren't gamma-encoded twice.
- Add image_b + compare_mode/wipe_position to ImageOpsPreview for a real
A/B comparison, plus a separate live on-demand A/B toggle while editing.
- Redesign the live-preview HUD: unified pill-style badges, frame counter
now shows the real total and hides for single-frame sources, and the
Output overlay only appears for Pad Out with the real pixel size.
- Align README with the current node set and fix stale blend-mode docs.
- FrameRange: reattach interactive controls on onConfigure instead of
leaving them permanently dead after a workflow load/undo/paste
- FrameRange: stop silently swapping an inverted trim range in the
preview - match _timeline_indices' documented zero-frame contract
- Append: bypass no longer concatenates audio/fps from clips that
aren't part of the bypassed output
- Append: preview loop point now accounts for bypass
- Crop: bypass now returns a full-frame bbox instead of a 2-tuple that
broke the node's declared 3-output contract
- Channel: shuffle preview now errors like the backend when "Mask" is
selected without a connected mask, instead of faking success
- host.ts: RAF loop keeps polling instead of stopping for good when
the canvas is briefly detached from the DOM
- Text: fix drag miscalibration when the preview is zoomed
- Eyedropper: restore picking from any canvas (VHS/WAS previews
included), only excluding the LiteGraph graph canvas
- video_io.py: stop swallowing comfy_api import failures
- Remove dead code: compat/comfy_v3.py (V3NodeBase), core/parameters.py,
core/validation.py, dbl-click-reset.ts, unused MEDIA_INPUT_TYPE
imports, an unreachable fragment in _ensure_rgba
- memory.py: narrow an overly broad except clause
- distort.py: finish the first progress bar before starting the second
- keyer.py: fix inconsistent indentation
tests/package.json, tests/scripts/app.js, tests/frontend/node-modules.test.ts,
and tests/__init__.py were untracked but already required by
`npm run test:ts` (tsconfig.frontend-tests.json includes tests/frontend/**/*.ts);
leaving them untracked breaks that script for anyone else cloning the repo.
test_comp_backend.py and test_nodes.py are real test suites sitting directly
under tests/ rather than tests/unit or tests/integration, so CI doesn't
collect them yet; tracked as-is pending that cleanup.
.cursorrules and comfyui_agent.md are personal AI-agent config, not part of
the project; gitignored alongside the existing AGENTS.md/CODEX_TODO.md entries.
Core (nodes/core/): alpha, masks, batch consolidation, blend, transform
matrix, bbox, parameters, validation engines shared across nodes, each with
unit tests.
Fix an unconditional RGB clamp to [0,1] that silently destroyed HDR/negative
values in Merge, Transform, Color Correct, Comp, CornerPin, Distort,
Spherize, Crop Stitch, and the shared masked-compositing helpers. Alpha
stays clamped everywhere; RGB no longer does.
Fix Grain applying `amount` twice in overlay/soft_light modes (quadratic
instead of linear falloff).
Add STMap mode to Distort (absolute UV remap vs relative displacement).
Add bbox output/input wiring between Crop and Crop Stitch. Add edge_grow
and edge_color_match to Crop Stitch. Add despill to Keyer. Add shuffle mode
to Channel (R/G/B/A routed from any source). Add size/luma_response to
Grain. Add grid mode to Constant. Add frame/layer accumulation limits to
Preview and Draw, plus a font-path containment fix and supersampling in
Text.
Make Frame Range and Append recognize a real ComfyUI VIDEO input (not only
this pack's internal media wrapper), preserving true fps/audio instead of
silently dropping them, and add a native VIDEO output alongside the
existing IMAGE output on both.
Add node_replacements.py (empty registry, wired into the extension
lifecycle) for future schema migrations.
Add a CI matrix pinning the verified requires-comfyui floor, and
.comfyignore for Registry packaging.
In the V3 migration, IMAGE/VIDEO inputs were mistakenly converted to io.String.Input with force_input=True. This breaks ComfyUI UI links as they now resolve to STRING inputs.\nReplaced all such instances with native io.MultiType.Input('image', types=[io.Image, io.Video]).
- Refactor 26 nodes to io.ComfyNode with define_schema and execute\n- Implement ComfyExtension subclass with async comfy_entrypoint\n- Preserve majoor_imageops synthetic namespace loader to avoid nodes module collision\n- Update and validate unit, registry and frontend test suites\n- Rebuild frontend dist files
- Add ImageOpsCropStitch node for cropping and stitching images
- Update ImageOpsCrop node to include a crop mask output
- Implement crop region mask generation for improved cropping functionality
- Update related metadata and widget configuration for new and updated nodes
- Add { passive: false } to event listeners for better control
- Remove color swatches and related logic from constant node
- Reset view instead of fit all in pad-out node
- Refine pan and zoom interactions in preview navigation
- Stop unnecessary event propagation in some cases