Commit Graph
35 Commits
Author SHA1 Message Date
ausboss a1e6940deb Keep the browser from running old frontend files after an update
ComfyUI sends no cache header for .mjs, so after a Manager update a browser
could reuse old shared modules while loading the new entry scripts. The new
entries then imported functions the old modules lack and about a third of the
pack stopped loading.

The pack now serves its .mjs files with Cache-Control: no-cache, and a small
entry (js/cache_guard) refreshes the stored copies and asks for a reload when
a tab runs older files than the installed version. It replaces the old
stale-cache toast in the appearance entry.
2026-10-01 09:10:47 -05:00
ausboss fdbc674d8a Add Realign to Source (experimental): undo an edit's zoom and shift
Qwen Image 2.1 draws broad edits (watercolor, anime, oil) a few percent
taller than the source, up to about 12%, differently for every seed, and
snapping sizes does not change it. Realign to Source measures that zoom
and shift against the source and warps the edit back onto the source's
frame, at the source's size. empty_mask marks the strip the model pushed
out of view; report gives the measured zoom, shift and worst corner, or
why a frame was left as it is. The display name carries EXPERIMENTAL.

Promoted from the lab node. The measurement is unchanged (the same
matrices on 166 real Qwen 2.1 renders). The warp now samples the edit
with its edge pixels extended for every fill, so the gray and source
fills no longer draw a dark line beside the strip.

New example: Qwen Image 2.1 Edit + Realign, the Qwen 2.1 Edit graph with
the realign step after decode, its report, and before and after compares.
2026-09-27 13:53:59 -05:00
ausboss c087ea8dd8 Keep the node module list alphabetical 2026-09-23 23:47:52 -05:00
ausboss 699208dadc Prepare 2.0.0 release candidate 2026-09-07 19:56:23 -05:00
ausboss 3b81a79c1e Add Save Image, fix the invented-pixels case, and cut the 1.2.0 release
- New node: Save Image - PNG or lossless JPEG XL (optional
  pillow-jxl-plugin, the pack's new jxl extra), workflow embedding on or
  off (honoring --disable-metadata), an exact_name mode that saves under
  exactly that filename with no counter suffix, overwrite/skip/error
  collision policy, output_dir up to absolute dataset paths, a caption
  .txt sidecar sharing the basename, file_path and IMAGE passthrough
  outputs, and always-re-run semantics so a deleted file re-saves.
- Image Resize now only invents pixels on an explicit width+height pad
  request: scale-derived modes resolve divisible_by snaps with a
  sub-half-step resize instead of padding a sliver; the tour workflow
  switched to an explicit 512x512 letterbox so its mask lane demonstrates
  real bars.
- Registry-facing metadata: the description now names every node family
  (Manager search matches against it) and the keyword list grew to match.
- Release 1.2.0: version bump, frontend version constant synced,
  changelog dated, and a publish workflow (Comfy-Org/publish-node-action)
  that releases to the registry whenever pyproject.toml changes on main.
2026-08-27 13:50:47 -05:00
ausboss 3f715a4af8 Ship the crush-list build-out: 7 new node files, replace button, video and LoRA polish
- New nodes: Image Resize plus the Utility group (Text, Integer, Float,
  Show Text, Math Expression, Select Every Nth, Split Batch, Merge
  Batches, Free Memory) - the dependency-free gaps that let shared
  workflows drop heavy packs.
- Replace with AusBoss nodes (prototype): preview-then-confirm graph
  rewrite swapping known third-party nodes for pack equivalents, with a
  tested translation map, per-node opt-out, and refuse-with-reason for
  nodes the pack cannot stand in for.
- Load Video: single-frame FRAME picker, an honest "what will load"
  label from the probed source rate, drop-a-video-to-restore. Save
  Video: format-aware widgets and a file_path output. Stitch Inpaint
  gained a blend_mask output, Select Frame negative from-the-end
  indexing, Image Size a batch count - all appended, saved workflows
  load unchanged.
- LoRA Loader: drag-to-reorder rows, hover thumbnails on rows, file
  size and date in the info card.
- Appearance: flagship scheme deepened to slate-teal; the retired
  bright-teal pair upgrades automatically via LEGACY_SCHEME_PAIRS.
  Optional queue-completion chime, off by default.
- Image Resize invariant: pixels are only invented on an explicit
  width+height pad request - scale-derived modes resolve divisible_by
  snaps with a sub-half-step resize, never bars.
- Docs refreshed for six stale pages, stale text and metadata fixed
  across the pack, the panel-height rule codified in AGENTS.md and the
  brand skill, and ausboss_node_tour.json added - a model-free example
  exercising 17 node types in one graph.

Validated: scripts/validate_nodes.py (24 files), 300 JS tests, all
Python suites under the ComfyUI embedded interpreter.
2026-08-27 13:30:35 -05:00
ausboss 5a93c3c44a Move Frame Chooser to the lab
Pausing the graph for an interactive pick is a bigger surface than
anything else here - a server route, a resumable pause, a panel that has
to survive a reload - and it has open issues that are not worth holding a
release for. The lab is where that belongs until they are fixed.

Removes the node, its helpers, its panel, its shared DOM-free module,
its docs and its tests, and drops it from NODE_MODULES, PUBLIC_NODE_IDS,
the panel guard list and the README. _execution_helpers stays: Load Video
and Save Video use it too.

The port lives in ComfyUI-AusBoss-Lab as AUSBOSS_LAB_FrameChooser, with
its routes moved from /ausboss/frame_chooser to /ausboss_lab/ so both
packs can be installed at once. A saved workflow using the public id
reports it as missing.
2026-08-17 23:40:20 -05:00
ausboss ec50d3acfe Promote the Krea 2 outpaint pair from the lab
Krea 2 accepts reference latents, but they arrive with no position, so the
model treats them as a loose style hint: it borrows the look and reinvents
the content. That is the whole reason an outpaint drifts instead of
continuing the photo.

Krea 2 Encode attaches the reference latents and emits the negative from
the same node, so a turbo graph at CFG 1.0 stops carrying a second text
encode that does nothing. Krea 2 Outpaint Model Patch registers those
reference tokens into the target grid at the rectangle the stitcher
records, on frame axis 1.

Load Image + Pad gained a `reference` output - the unpadded source, fitted
to a 384px long edge and a multiple of 16, because the VAE downsamples by
8 and the DiT patchifies by 2. It is APPENDED after `stitcher`, never
inserted: a workflow stores links by output slot index, so any other
position silently rewires every saved graph.

The stitcher now records where the source sits, as source_bbox in pixels
and bbox_normalized in 0..1. Padding knows the rectangle exactly, so it
rides with the canvas instead of a parallel wire that can be left
unplugged. apply_stitch reads neither key, so an older stitcher stitches
identically.

Ported from the lab rather than copied: the lab's _krea2_helpers had its
own pad_image, feather_pad_mask, plan_pad_canvas, parse_fill_color and
build_canvas_stitcher. Duplicating the padding engine here would let the
outpaint path and the inpaint path disagree about what a stitcher is, so
the public module keeps only what is specific to Krea 2 and uses the
existing helpers for the rest.

Two departures from the lab version. The model patch declared a kv_cache
input and never read it - the cache was always on - so it is wired up now.
And it imports comfy's flux internals when you run it rather than at
startup: a core release that moves one then surfaces as an error on that
node, instead of deleting it from the menu and leaving saved workflows
reporting it missing.
2026-08-17 22:17:19 -05:00
ausboss 772f78d031 Remove Pad Image
Load Image + Pad does the same job from the same stage and starts from
the file, so the only thing the second node added was taking an IMAGE
wire - one idea holding two slots in the menu.

Deletes the node, its panel, its help doc and its stage-only shared
helpers (padEmptyStateText, findPadPreview), and drops it from
NODE_MODULES, PUBLIC_NODE_IDS, the README and the panel guard list.

The padding helpers are untouched; Load Image + Pad and Align Image both
use them. Two console labels there named the removed node, so
_fill_tensor now takes the source name - Align Image passes its own
pad_color, and a colour it cannot read is no longer reported against
padding. The BHWC and mode errors read "Padding"/"Pad mode" instead.

The on-node pad stage moves to ComfyUI-AusBoss-Lab, which has its own
AUSBOSS_LAB_PadImage.
2026-08-17 21:59:07 -05:00
ausboss 10382f1643 Remove Drop Shadow
The node produced a mask offset, grown and blurred - no contact
darkening, no perspective - so it read as a sticker halo rather than a
shadow in the scene. That is the approach, not a tuning problem, so it
comes out rather than shipping under the pack's name.

Deletes the node, its helper module, its test file and its help doc, and
drops it from NODE_MODULES, PUBLIC_NODE_IDS and the README. The colour
helper tests keep their two-callers case using Pad Image and Transform,
the real remaining call sites.

blur_mask and grow_shrink_mask stay in _mask_helpers - Crop For Inpaint
and Pad Image use both.
2026-08-17 21:59:07 -05:00
ausboss c15c6c9317 Implement the pack audit batch: on-node pad editors, feature gaps, removals
The audit compared every node against ComfyUI core and the major packs;
this lands its outcomes in one branch.

On-node visual editing (the old Codex-pack interaction, rebuilt):
- New Load Image + Pad: image loader with whole-edge pad dragging on the
  node canvas, align-to-multiple rounding, and a megapixel target that
  rescales the source before padding so the mask seam stays binary.
- Pad Image gains the same handle canvas, fed by an execution-time
  snapshot of its input; wireframe with diagnostic empty states before
  the first run. Widgets, outputs, and saved workflows unchanged.
- Image Crop + Rotate + Pad's compact panel is now a live stage - crop,
  pad, and rotate handles on the node, one shared implementation with
  the full-screen editor so the two surfaces cannot drift.

Feature gaps closed against the ecosystem:
- Crop For Inpaint: target_megapixels, selectable rescale_algorithm
  (recorded in the stitcher for the paste-back), and extend_* inputs
  that grow the frame itself for outpainting.
- Save Video: format choice - mp4 h264, mp4 h265, webm vp9 with Opus
  (resampled to 48 kHz); CRF drives all three.
- Load Video: every_nth thinning (fps output divides to match) and a
  max_frames cap that ends the decode early.
- LoRA Loader: saved stack templates behind a bar button, and a console
  warning when a LoRA's base-model family disagrees with the checkpoint.
- LM Studio Chat: history in/out for multi-turn chains and a json_schema
  widget for structured replies.
- Drop Shadow: multiply blend and a shadow_mask output. Align Image:
  offset outputs for un-aligning after sampling. Color Match:
  first_frame reference mode as a one-node video flicker fix.

Removed (backed up in git history): Select Frame Range and the Video
Bundle family - core ImageFromBatch and the core VIDEO wire now cover
both jobs. Dead NODE_ID module variables cleaned out of every node file.

455 Python tests, 216 JS tests, validate_nodes.py green on 19 node files.
2026-08-17 10:49:55 -05:00
ausboss 85b70389ff Add Align Image, Image Size, and LM Studio Chat
Align Image snaps width and height to a clean multiple - 16, 32,
whatever the model wants - because Qwen image models, VAEs and plenty of
samplers only behave on cleanly divisible sizes. Each mode implies its
own rounding, so there is no separate direction widget: resize rescales
to the nearest multiple, crop center-crops down, pad replicate-pads up,
and a side smaller than one multiple always grows to exactly one rather
than erroring. The new size comes out as INTs for wiring into latents.

Image Size reads width, height, longest edge and shortest edge off the
wire so resizes and latents key off the actual image instead of retyped
numbers that drift.

LM Studio Chat posts a prompt - and optionally one image - to a local
LM Studio server, or anything else speaking the OpenAI-compatible chat
API. The interface is the middle ground the installed ecosystem packs
miss on either side: endpoint string, model string where EMPTY means
whatever the server has loaded (a dropdown fetched at ComfyUI startup
goes stale whenever LM Studio was not running yet), optional system
prompt, prompt required unless an image is connected, temperature,
max_tokens, seed as the re-roll knob, a timeout, and an image downscale
cap. Reasoning-model think blocks land on their own output so the text
stays clean for conditioning. Stdlib urllib only - no new dependencies -
and the POST runs off the executor thread. Every error names what to
fix, with the server's own words when it had any.

Verified live against a running LM Studio: a JIT-loaded qwen3.5-9b
answered a text round trip in 7.6 s through the real node; the
no-model-loaded 400 and a dead port both surfaced their actionable
messages. The vision payload shape is unit-tested; the two local VL
quants refused images server-side (missing projector / failed load), so
the live vision check stays on the deployment checklist.

48 offline tests cover the alignment math, both size nodes, the URL and
payload builders, think-splitting, image encoding, and every mocked
network error path.
2026-08-15 20:51:51 -05:00
ausboss e0813c765d Merge pull request #27 from ausboss/feat/frame-interpolate
Add FPS-aware frame interpolation
2026-08-14 10:18:07 -05:00
ausboss 2f034c61ee Add FPS-aware frame interpolation 2026-08-13 17:55:49 -05:00
ausboss 8a42a26a13 Add a masked Drop Shadow node 2026-08-13 17:55:49 -05:00
ausboss 2dcb89fa3e Add Pad Image node with four fill modes and an outpaint mask
Pads any side with a solid color, an averaged edge-color band,
replicated edge pixels, or a blurred and dimmed pillarbox backdrop.
The original region stays bit-identical in every mode and the second
output masks exactly the new padding, ready for outpainting.
2026-08-13 17:55:49 -05:00
ausboss e22219c4a8 Add Color Match node with pure-torch LAB statistics transfer
Per-channel LAB mean/std matching against a reference image, with an
optional mask that restricts both measurement and application, a
strength blend, and batch-1 reference broadcasting. Pixels outside the
mask stay bit-identical.
2026-08-13 17:55:49 -05:00
copilot-swe-agent[bot]andausboss a5625ccdb6 Merge remote-tracking branch 'origin/main' into feat/video-bundle-compare
# Conflicts:
#	__init__.py
#	scripts/validate_nodes.py

Co-authored-by: ausboss <102309304+ausboss@users.noreply.github.com>
2026-08-13 16:35:53 +00:00
copilot-swe-agent[bot]andausboss 5063b83ed6 Merge origin/main into feat/inpaint-crop-stitch
Co-authored-by: ausboss <102309304+ausboss@users.noreply.github.com>
2026-08-13 16:33:06 +00:00
ausboss 688a905302 Merge remote-tracking branch 'origin/main' into feat/inpaint-crop-stitch
# Conflicts:
#	scripts/validate_nodes.py
2026-08-13 09:44:40 -05:00
ausboss d41b316efd Merge remote-tracking branch 'origin/main' into feat/frame-chooser 2026-08-13 09:43:47 -05:00
ausboss 1119528d11 Add the Crop For Inpaint and Stitch Inpaint node pair 2026-08-13 09:43:32 -05:00
ausboss ee252ee041 Add the Frame Chooser backend with a pausing selection flow 2026-08-13 09:43:08 -05:00
ausboss a0667f8c93 Merge remote-tracking branch 'origin/main' into feat/video-bundle-compare
# Conflicts:
#	__init__.py
#	scripts/validate_nodes.py
2026-08-13 09:42:35 -05:00
ausboss 728bf63a1f Add the A/B Compare node with a slide and hold panel
An OUTPUT_NODE that saves temp previews of each batch's first frame
and renders them stacked in a DOM panel: slide mode clips B to the
pointer with a seam line, hold mode flashes B while pressed. image_a
passes through unchanged so the comparison can sit mid-graph. Pure
clip and mode logic lives in js/shared/compare.mjs under node:test.
2026-08-13 09:40:56 -05:00
ausboss 50b8cffb16 Add the AUSBOSS_VIDEO bundle wire and its node trio
Video Bundle packs frames, fps, and optional audio into one custom
wire; Video Unbundle unpacks it; Video Bundle Edit copies a bundle
overriding only the connected inputs. Frame count, size, and duration
are derived from the frames tensor and fps at bundle time and
recomputed on every edit, so they can never drift from the frames.
2026-08-13 09:37:46 -05:00
ausboss 148c11eb6c Merge pull request #7 from ausboss/feat/lora-loader
Add the LoRA Loader node
2026-08-13 09:33:53 -05:00
ausboss d6875fcaf8 Add the LoRA Loader node with stacked rows and trigger words 2026-08-12 22:54:06 -05:00
ausboss dce3c149de Add Select Frame Range node 2026-08-12 22:51:00 -05:00
ausboss 873662997e Add Save Video node and cut VHS and Easy-Use from the watermark workflow 2026-08-11 18:49:33 -05:00
ausboss 64fe157a7f Add Load Video and Refine Mask nodes 2026-08-11 18:36:48 -05:00
ausboss c3d0a8e8b6 Add LaMa Inpaint and Select Frame nodes with the watermark remover workflow 2026-08-11 18:03:19 -05:00
ausboss fa79b825cf Release transform editors 1.0.0 2026-07-24 20:48:43 -05:00
ausboss 83fae3b36b Build polished transform editors 2026-07-24 20:43:53 -05:00
ausboss 8254f647ca Scaffold ComfyUI-AusBoss node pack
Project structure modeled on ComfyUI-Pixaroma (MIT) with original code:
fail-soft module loader in __init__.py, one file per node under nodes/,
per-node frontend folders under js/ with shared .mjs utilities, offline
validation script, docs, and a smoke-test workflow.

Phase 1 placeholder nodes: Text Box, Show Text (with JS frontend),
Random Line, Image Dimensions.
2026-07-24 17:21:30 -05:00