Commit Graph
90 Commits
Author SHA1 Message Date
ausboss b2eb11996b Merge main: FlashVSR Upscale and Prompt Variations share the zh locale file 2026-11-11 23:11:35 -06:00
ausboss cb21a14424 Add FlashVSR Upscale: a video upscale node with one model file
Makes a video larger and sharper with the FlashVSR v1.1 model, from 1x to
4x. The model, the loop and the tiling are the pack's own code in plain
PyTorch, so the node needs one model file and no other pack. A long clip
needs no more graphics memory than a short one, and a result too large for
the free memory is made in tiles.

Comes with a help page, the example workflow FlashVSR Video Upscale, and
tests for the helpers.
2026-11-11 22:49:17 -06:00
ausboss f9ca96f648 Prompt Variations node: pick one choice from each {a|b|c} set by seed
A prompt box that changes on every run. Choices in curly brackets are
picked on the server from the wired seed, so the same seed gives the same
prompt again and a randomized seed with a run count of 50 gives 50 mixes.
Brackets without a | are left alone, so JSON prompts pass through.
2026-11-11 22:17:53 -06:00
ausboss 47d1c4f739 Text Lines: run what comes after once for each line of text
A new node. Type a list of prompts, one on each line, or wire in a list
another node wrote. Empty lines are skipped, a number or bullet at the
start of a line can be taken off, and a limit stops a list that ran long.
2026-11-11 19:41:41 -06:00
ausboss c206d9e9da Edit Lock: an edit leaves the rest of the picture where it was
Two new nodes. Edit Lock sits between the model and the sampler, reads
what the edit changes from the model's own prediction at every step, and
puts the original back everywhere else. Edit Lock Restore swaps the
original's pixels in for those parts after the decode.

The zoom and shift a model adds to the whole picture are measured and
discounted before anything is compared, and an even tint is taken out.
An edit of the whole picture is left alone.

On MiniMax-H3-Image at 4 megapixels, 18 local edits at two seeds each
moved by up to 14.5 px plain and by 0.12 px or less locked.
2026-11-11 00:59:25 -06:00
ausboss 28340ded7e Count the newer COMBO input format as a widget in the example check
ComfyUI reports newer dropdowns as "COMBO" instead of a list of choices,
so saved values for them were ignored and four examples were flagged as
missing required inputs they do have.
2026-11-08 21:18:49 -06:00
ausboss 475d6e19ea Offline checks read pyproject as TOML and catch more hidden mappings
Review fixes for the pack's offline checks.

- The startup version reader and the checks read pyproject.toml as TOML
  instead of a regex.
- validate_nodes and registry_contract catch more ways a node mapping
  or the module list could be hidden from registry scanners.
- release_preflight flags network-client imports and spaced or
  qualified fetch calls in shipped code.
- workflow_contract verifies saved widget values against the real
  widget order, covers subgraphs and validates model download info.
- Krea 2 Inpaint Masked example: two Note nodes' named widget values
  now match their positional values, which the new check requires, and
  the file ends with a newline. The graph itself is unchanged.

Tests: tests/test_check_regressions.py, with one adjusted case in
tests/test_workflow_contract.py.

No inputs, outputs or mapping keys change. No version change.
2026-11-08 19:33:20 -06:00
ausboss 0386e9c416 Keep node IDs unique across frontend smoke probes (#297) 2026-11-06 20:11:28 -06:00
ausboss eb3b74242a Fix shared note tiles and H3 video edit controls (#293) 2026-11-06 18:48:28 -06:00
ausboss e761b3dd0b Serve the release badge from the repository (#290)
Keep the release badge available from GitHub and reject stale generated badge versions during release preflight.
2026-11-05 20:28:47 -06:00
ausboss 3b0baf351a Release 2.21.0 and keep GitHub releases current (#289)
Publish matching pack and frontend versions, release notes, and automatic GitHub Releases after Registry uploads. Point the README badge at the latest release.
2026-11-05 20:19:37 -06:00
ausboss 7cb0abaacf Add Load Audio node: wave, trim, preview and max length (#272) 2026-11-03 23:58:16 -06:00
ausboss 75621c341f Merge remote-tracking branch 'origin/main' into feat/h3-prompt-writer
# Conflicts:
#	CHANGELOG.md
2026-11-02 16:49:47 -06:00
ausboss a61d3d4ee0 H3 Prompt Writer node with width and height outputs 2026-11-02 02:07:29 -06:00
ausboss 6d6876dd38 Chinese node names and descriptions (#245)
locales/zh/nodeDefs.json gives every public node a Chinese name,
description and input and output names, which ComfyUI shows when its
language is set to Chinese. Cards and help pages stay English.
tests/test_locales.py keeps the entries matched to the node API, and the
preflight lets locales/ ship.
2026-11-02 01:26:38 +00:00
ausboss 3ba27901cb Step Preview node, and a steps switch on Save Image and Save Video
Watch the picture form one sampling step at a time and stop a run that is
going wrong. Step Preview needs no wires and shows whichever sampler is
working, with Stop and Stop all. Save Image and Save Video get a steps
switch, off by default, that shows the steps where the saved picture goes,
with a Stop button.

A queued workflow that shows its steps asks ComfyUI for the auto preview
method for that run, only when no method was chosen in the frontend or on
the command line.
2026-10-25 15:35:06 -05:00
ausboss 15718c07ee LoRA Loader: Fetch Civitai info also saves the LoRA's picture
The browser downloads a small copy of the LoRA's first picture from
Civitai's picture server (PG-13 or milder unless the gear menu's Civitai
picture option says any), and the server saves it beside the LoRA as
<model>.preview.jpg, never replacing a picture. The LoRA Previews add-on
is no longer needed, so its hooks and install hint are gone.
2026-10-24 18:30:09 -05:00
ausboss 166deeae67 Layout Boxes: a box canvas for layout prompts that works in both node looks
Draw boxes on a canvas and say what goes in each one: a thing, or words to
write in the picture. Wire elements to MOSS-Image Layout Prompt and the
picture puts each thing where its box is.

It gives what ComfyUI's own Create Bounding Boxes gives (preview, bboxes,
elements; same types, same order, same values from the same boxes), so it
can take that node's place, and its canvas also draws in the classic node
look. The boxes are kept as parts of the canvas in a hidden socketless
string, so a wired size never moves them.
2026-10-19 09:46:44 -05:00
ausboss b614d96929 Release 2.12.2: leave CHANGELOG.md out of the Registry archive
The Registry shows each version's notes, made from CHANGELOG.md when the
version is published, and the full list stays in the repository; nothing
in the pack reads the file. The nodes are the same as in 2.12.1.
2026-10-14 18:12:27 -05:00
ausboss 3c80fe9af9 Examples: Qwen Image 2.1 Inpaint, for people who get workflows from the pack
Click a thing in your picture on Mask by Touch, say what to change, and
Qwen repaints only that part. It is the workflow of its page, with the
Seed on fixed as every example here has it.

The workflow carries a note above its Workflow Note that links to the
video channel. The example check wanted every node but the Workflow Note
inside a numbered group, so that note counted as a stray node. A Callout
in the Workflow Note's own column now belongs to the note. A Callout
anywhere else outside the groups, and any other node in that column, is
still refused.
2026-10-12 01:38:09 -05:00
ausboss 6255c2293d Release notes: the pack's mark goes with the space before it
A changelog entry that opens with a node's name and a colon, as in
"Callout: links", came out as "Callout : links" in the notes sent to the
Registry: the mark after the name was taken off and its space stayed.
2026-10-12 00:05:29 -05:00
ausboss a2c584210f Releases: a version's changelog entries go to the Registry as its notes
The Registry has shown no notes for any version since 1.2.0, when
publishing moved to the publish action: it sends none. comfy-cli takes
them from COMFY_NODE_CHANGELOG, so the publish workflow now puts this
version's CHANGELOG entries there before it publishes, one short line
each: the entry's bold opening, and for a new node or example the sentence
that says what it does.

scripts/changelog_notes.py makes the notes and prints them for any
version. The release check fails when the pyproject version has no
entries in CHANGELOG.md, so a release cannot go out blank.
2026-10-12 00:05:29 -05:00
ausboss 8198e8d530 Tests: run the pack against the newest ComfyUI every night
A ComfyUI update can break a node without a line of the pack changing, and
until now nothing looked: CI installs no ComfyUI. A nightly workflow now
installs ComfyUI's newest release and its development head for the CPU and
runs three checks that need no model:

- tests/test_comfy_core_contract.py reads the pack's source for everything
  it takes from ComfyUI (modules, functions, ComfyUI's own nodes it calls
  and the inputs it passes them) and looks each one up in the real thing.
- scripts/compat_boot.py asks a running ComfyUI which nodes it offers:
  every public node of the pack, and every node and required input the
  example workflows use.
- scripts/dev/face_smoke.mjs puts every node on a graph in headless
  Chrome, in both node views, and fails when a face does not come up or
  something throws.

The full Python suite runs there too. A failure on the release opens an
issue; the development head only after two nights in a row.
2026-10-10 22:06:11 -05:00
ausboss 6338dbb49b Add Mask by Touch: click a thing on the picture, get its mask
A new node in the Mask group. The picture is on the node: moving over it
lights up what a click would take and names it, a click picks it, and two
arrows swap the pick for the next thing at that spot. Subject and
Background take the picture's main subject, or everything else, in one
click. Pick | Draw switches to a brush for an area painted by hand, + and -
add or take away, Undo takes a pick back, and every pick has a chip under
the picture. Fine edges follows hair and fur strand by strand, takes out
background seen between the strands, and gives a cut-out the thing's own
colour. The eye beside Undo and Clear shows the result as a cut-out or as
the mask. Outputs: the mask, the cut-out and the names of what was picked.

The search is ComfyUI's own SAM 3. Subject, Background and Fine edges use
ComfyUI's own background-removal model (ComfyUI 0.21 or newer). The pack
downloads nothing.

With it: a widget card can name its choices with a function and keeps
showing a value its list does not offer, the help page, an example
workflow with its thumbnail, the README section and the CHANGELOG entry.
2026-10-10 19:33:07 -05:00
ausboss e330ec312a Zoom and pan the graph from every part of a node
The wheel did nothing over a preview picture, the text of a Callout or the
padding of a card, and the middle button did not pan there. Those parts of a
panel let the mouse through, so in the classic renderer the pointer lands on
the frontend's .dom-widget wrapper, which takes the mouse and hands nothing
on. The pack looked for its panel between the pointer and the wrapper and
found none. A pointer on the wrapper now counts as over the panel inside it.

scripts/dev/wheel_sweep.mjs turns the wheel at every point of every node and
reports each spot where the graph does not zoom. In the classic renderer 33
of the 41 nodes had such spots; none has one now. Nodes 2.0 had none.
2026-10-09 17:10:20 -05:00
ausboss 98fb121060 Add Tiled Upscale and Tiled Upscale Stitch
Two Image nodes that take a picture past the size a model can redraw in
one go. Tiled Upscale sets the finished size in megapixels and cuts the
picture into tiles; Tiled Upscale Stitch blends the joins, keeps each
tile's colors on the picture's own and fits the result to the size asked
for. Any model can sit between the two.

Adds the tile planner with its tests, the two widget cards, help pages,
README sections, a changelog entry, the API snapshot and a new example,
Qwen Image 2.1 Upscale + Restore. The README's example count now matches
the folder.
2026-10-06 21:20:38 -05:00
ausboss 604bd005d5 Registry: the description fits its 1000 byte limit
The 2.8.0 upload was refused with "description is too long": naming
Image Folder and Callout took the description to 1024 bytes and the
Registry takes 1000. It is 989 now, and release_preflight.py fails on a
description over the limit, so this is caught before a version lands.

The Registry's scan also warned about two statements on one line in
tests/test_image_folder.py and says that becomes an error. They are two
lines now.
2026-10-06 18:07:28 -05:00
ausboss 4a5b8c5af3 Callout: a note whose text fills the box, with arrows you type
A new Utility node for explaining a workflow on the canvas. The text grows
to the largest size that fits the note, so it reads without zooming in, and
each point gets a thin teal line beside it.

An arrow emoji in the text (or the arrow row under the editor) becomes a
teal arrow in the line. Click a node while editing, then press an arrow, and
the arrow is linked to that node: clicking it later brings the node into
view, the way Workflow Switches does. The link is kept in the text as #id,
so editing the words never moves it.

The node has one hidden text input and no outputs, so it never runs.
2026-10-06 17:49:53 -05:00
ausboss 36d6905477 Add Image Folder: pick a folder, tick its pictures, run the workflow on each
A loader for many pictures. The card chooses the folder inside ComfyUI's
input or output folder, and a thumbnail gallery under it ticks the pictures
to use. All in one run sends every picked picture through as a list; one
per run loads one picture each run and moves on when a run is queued. It
gives image, mask, filename, index and count. Pictures dropped on the node
or added with Add are uploaded into the input folder.

Folder names and picked names are attacker-controlled: a folder is only
read as a path below the input or output folder, links that lead out are
refused, and picked names are compared with what the folder holds, never
opened.
2026-10-06 13:28:51 -05:00
ausboss 895493c49c Mask by Name: the card, the FIND button and the picture on the node
Registers the node, gives it a widget card and the shared preview panel
with a FIND tool that runs the node alone, a readout of how many things
matched and how sure SAM 3 was, and the stop message on the node's own
face. A stopped run shows the plain picture, not the last find. Each name
asks SAM 3 for up to 16 matches, and Sureness starts at 0.7.
2026-10-06 09:59:28 -05:00
ausboss 0692e0a26d Add the logic behind Workflow Switches 2026-10-05 23:49:19 -05:00
ausboss da60955801 LoRA Loader: bring back Fetch Civitai info as a click-only browser lookup
The pack's server still never contacts a host. The info card's button has the
browser ask civitai.com about one file by its SHA256, then the server saves
the answer beside the LoRA as <model>.civitai.info after checking it names the
same file (size, shape and hash). The old Python HTTP call stays gone.

release_preflight now allows a raw fetch() only in js/cache_guard and
js/lora_loader. SECURITY.md, AGENTS.md, the README and the LoRA Loader help
page describe the change.
2026-10-03 15:23:57 -05:00
ausboss 2bbe5014b4 Save the example media loaders empty
Every image and video loader in the seven examples is saved with no file
picked, in both saved widget copies. Remove the three sample pictures the
new examples added, put the Registry archive budget back to 12 MB, and
update the README examples section and the CHANGELOG.
2026-09-29 02:35:58 -05:00
ausboss f34169a132 Update the Krea 2 Outpaint example
Replace it with the version that pads with Image Crop + Rotate + Pad,
with its sample picture and a new thumbnail. Point the README's Load
Image + Pad section at Klein 9B Outpaint, and update the example table,
the outpaint caption, the Krea 2 Outpaint Model Patch help page and the
CHANGELOG. Raise the Registry archive budget to 18 MB.
2026-09-29 02:06:08 -05:00
ausboss 3a315e2924 Trim the example workflows
Keep Krea 2 Outpaint, Klein 9B Outpaint, LTX 2.3 Video Outpaint,
Qwen Image 2.1 Edit + Realign and Simple Video Watermark Remover, and add
Krea 2 Inpaint Masked and Krea 2 Rotate + Outpaint with their sample
pictures. Remove the other sixteen examples and the sample picture only
they used.

Update the README example table and links, the Realign to Source help
page, a test comment, the CHANGELOG and the pyproject description, and
raise the Registry archive budget to 13 MB.
2026-09-29 01:52:07 -05:00
ausboss 964e82ad7a Update contributor documentation 2026-09-28 22:02:19 -05:00
ausboss 62fcc88262 Edit + Realign example writes its own prompt; plain docs; LoRA Loader in every example
- Qwen Image 2.1 Edit + Realign: type a short edit and Qwen3-VL 8B, the
  text encoder the edit already loads, writes the full instruction. The
  consistency LoRA sits in a LoRA Loader row, switched off.
- LTX 2.3 Video Outpaint: the distilled LoRA and the outpaint IC-LoRA load
  in one LoRA Loader instead of two core loaders. The workflow checks now
  refuse core LoRA loaders in examples.
- Realign to Source: description, tooltips and help page rewritten in
  plain words, with the technical detail at the end of the help page.
- Settings menus: in a short window the rows no longer squeeze together
  and overlap; the menu scrolls instead.
- AGENTS.md: text people read starts with the plainest version.
2026-09-27 21:00:26 -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 58c0a5fab0 Check the example problems this round fixed so they stay fixed
The workflow contract now fails an example whose named widget values
disagree with the values it loads, whose id is not a random UUID, whose
saved zoom is too low to draw widget text, whose download info names a
file its loader does not select, or whose save node writes into a
folder.
2026-09-24 00:36:09 -05:00
ausboss 46d4ee39d6 Read the ComfyUI address from COMFY_URL in the dev scripts
The five CDP scripts looked for ComfyUI at http://127.0.0.1:8188/ only;
COMFY_URL now overrides it. cdp_nav_debug.mjs says so when no ComfyUI
tab is open instead of crashing, and cdp_drag.mjs gives up on a request
after 25 s like cdp.mjs rather than waiting forever. The live-testing
notes mention COMFY_URL, give the full path of the screenshot pairs,
and say that only CDP_RELOAD=1 reloads into a fresh tab.
2026-09-24 00:20:58 -05:00
ausboss 39c636dd10 List the real Registry archive in the release preflight
Check 4 tried .comfyignore on 22 hand-picked paths with its own
gitignore matcher. With git it now lists what comfy-cli packs - tracked
files minus the ones .comfyignore matches - and fails when anything
outside the runtime allowlist ships, when .comfyignore drops a runtime
file, when an allowlist entry, js/docs/ or example_workflows/inputs/
ships empty, or when the archive grows past 12 MB (201 files and 7.1 MB
today). A copy without its own git repository keeps the sample-path
check.
2026-09-24 00:20:58 -05:00
ausboss 58b5d05202 Check public node names and help pages, and allow appended outputs
The transform output check now pins the first four outputs instead of
the whole tuple: saved workflows link outputs by slot index, so those
can never move, but a fifth output appended later is compatible. Two
new checks hold today and keep holding: every public display name ends
with the pack suffix, and every public node has js/docs/<key>.md. The
docstring lists the checks in order and describes check 4 as the code
enforces it, and the never-filled warnings list is gone.
2026-09-24 00:20:58 -05:00
ausboss b4f985a8f4 Validate only the Python files a registry scanner reads
The compile check walked every .py under the checkout, gitignored
_scratch/ ports and nested checkouts included, and py_compile wrote a
__pycache__ folder next to each file it checked. It now compiles in
memory. It and the stray-mapping scan (and its test) share one file
list: tracked plus untracked-but-not-ignored files from git, or, when
git cannot answer for the tree (an installed copy), a walk that skips
dot-folders, caches and _scratch/.
2026-09-24 00:20:58 -05:00
ausboss 1fb4ca9db5 Keep README media out of the Registry archive
The README's images and GIFs were 7.3 MB of a 14.4 MB archive, and only
GitHub shows them; nothing in the pack loads assets/. The editor
swap-file patterns and the one for a local copy of the brand skill
matched no tracked file, and comfy-cli packs tracked files only, so
they are gone.
2026-09-24 00:20:58 -05:00
ausboss f6ecb51d61 Fail the release preflight on shipped network code
Shipped backend code must not contain an HTTP or socket client, and the
frontend must not reintroduce the index-based connect call.
2026-09-23 23:47:52 -05:00
ausboss 3bc8ffa362 Drop the committed scratch note and prune stale ignore rules
todo2 was a finished checklist that rode along with the 2.1.0 release
commit. The ignore files listed personal note names one by one, including
several that no longer exist; local notes now follow one rule instead.
2026-09-23 23:35:26 -05:00
ausboss 4cb2af204a Release 2.1.0: Qwen workflows and polished image/video controls 2026-09-22 15:23:07 -05:00
ausboss 9c4efa49fd Report pending Registry reviews without failing the status check 2026-09-10 10:08:21 -05:00
ausboss 699208dadc Prepare 2.0.0 release candidate 2026-09-07 19:56:23 -05:00
ausboss f2f69afc97 Make the README release badge dynamic instead of checked
shields.io's dynamic TOML badge reads the version straight out of
pyproject.toml on main at view time, so the badge cannot go stale by
construction - no third version string to bump. Preflight check 3 flips
from comparing a hardcoded number to guarding the mechanism: the dynamic
badge must be present and a hardcoded release-X.Y.Z badge fails the
check. AGENTS.md's release step 1 goes back to two version strings.
2026-08-30 23:08:56 -05:00