Commit Graph
254 Commits
Author SHA1 Message Date
ausboss cb6b947f75 Fix shared note tiles and H3 video edit controls 2026-11-06 18:46:32 -06:00
ausboss 50389b0cdb Improve crop controls, playback, and media selection (#288)
* Group crop controls and put video scrubbing below the preview

* Stop IN where the connected clip length still fits

* Add play and pause beside the crop scrubber and clarify resize padding

* Preview the current brush beside Size in Image Compare

* Center the crop and its padding together on each axis

* Polish crop controls and load images from Outputs

* Add crop controls preview
2026-11-05 20:07:33 -06:00
ausboss 28dd526447 Remove the LoRA Loader stack row limit (#287) 2026-11-05 20:07:24 -06:00
ausboss abf6cecd52 Style workflow guide and model download tiles (#286)
* Style workflow guide and model download tiles

* Add workflow tile preview
2026-11-05 20:04:58 -06:00
ausboss 12e7d8c33f Limit Latent Size to workflow-approved resolutions and share panel controls (#285) 2026-11-05 18:23:30 -06:00
ausboss de95db228c H3 Prompt Writer: a swap that keeps the clip's sound only gives the new person their own lines, timed from that sound (#277)
* Add Load Audio node: wave, trim, preview and max length

Load a sound file and keep only the part you want. The node shows the
whole file as a wave. Drag the IN and OUT handles (or type the times),
press play to hear just that part, and set Max length to the longest
sound the next step takes: anything past it turns red and is cut off,
so you see what comes out before you run. Max length can be wired.

Only the picked part is decoded. Outputs the audio and its seconds.
Help page, README, changelog, Chinese names, tests and the API snapshot
are included.

* Load Audio: open smaller and go down to 280 wide

* Load Audio: shorter wave, length moves off the wave next to OUT

* Add the Pika H3 Flex example workflow

* H3 Prompt Writer: a swap puts each person picture in one person's place

* H3 Prompt Writer: keep quoted words in a swap and read who goes out of a longer line

A swap dropped every typed line once it had read who goes, so words in
quotes never reached H3 and the new person's lips were guessed. Those
lines now stay as the new person's words, landing on the lip movement of
the video, and a voice with a swap no longer says nobody speaks.

"Elon is @1, he replaces the person at the counter" went whole into the
description of who goes. The words after replaces (or takes the place of,
instead of, ...) are now who goes, and a name given to @1 is left out.

* H3 Prompt Writer: swap lines go to the right speaker

Names given with a comma ("Altman is @1, the man on the left. Dario is
@2, ...") no longer run into each other, and a later "Dario says" or
"He says" goes to that person. A thing that speaks, like the card
reader, says its words from off screen so nobody's lips move. "raps"
and a few other ways of speaking count as speech, so "and raps" stays
out of who goes.

* H3 Prompt Writer: keep how a swap line is said, and its exact time

"The card reader says in a flat robot voice" now names the card reader
and keeps "in a flat robot voice" as how it says the words. A time like
3.2s at the start of a line was read as a list number and lost its 3; it
now stays 3.2, a time typed inside a swap line counts too, and the first
words of a swap say when they start.

* H3 Prompt Writer: a person off screen gets their own voice

"A woman off screen says" went to the person on screen, as their voiceover,
and in a swap it landed on the swapped-in person. Now a person or a name
the line puts off screen (off screen, off camera, behind the camera, O.S.)
speaks from off screen as their own speaker, in a swap and outside one.
An unnamed voiceover, an @ or a he or she still stays the main person's.
Off-screen voices no longer get a 'stays silent with the lips closed' line.

* H3 Prompt Writer: a swap can keep the clip's clothes

A swap always dressed the new person in the picture's clothes. Typing
"keeps her outfit", "in the clip's clothes" or "keep the clothes from the
video" now takes only the face and hair from the picture and keeps the
clothes of whoever goes. "keeps her own clothes" still means the picture's.

* H3 Prompt Writer: a thing said to be off screen speaks for itself in every mode

"A card reader off screen says" got its own voice only in a swap. In copy
its moves and the other modes it became the person on screen's voiceover.
Anything a line puts off screen now speaks for itself; "a voice" and
"narrator" stay the main person's voiceover.

* H3 Prompt Writer: a swap that keeps the clip's sound gives the new person only their own lines, timed from that sound

With the clip's own sound under a swap, H3 heard every voice and moved the
new person's mouth to lines that weren't theirs. The new Clip's own sound
switch leaves out anyone else's words, says the new person keeps the lips
closed between their lines, and puts each untimed line where speech starts
in the video's sound. A typed time still wins.

* H3 Prompt Writer: tell voices apart by pitch when timing lines from the clip's sound

Loudness gaps alone put the new person's lines on the other speaker's words
when two people trade lines quickly. Each line now takes a run of speech
that fits its syllables, starts after a quiet, and keeps one voice at one
pitch. On the lip sync clips this lands every line within 0.15 s of
Whisper's times, except one soft word under a crowd.

* H3 Prompt Writer: a short name for who goes in a swap keeps their line

"The man in the car" for "the man in the back of the police car" was read
as someone else, so with the clip's sound on his line was left out. A
speaker is who goes when every word naming them appears in who goes.

* H3 Prompt Writer: a swap with the clip's sound and no words typed speaks as the video does

With nothing in quotes, it said the new person keeps the lips closed and
says nothing, even when the clip is full of speech, and the soundscape
was the place's steady sound. Now speech in the clip means the new person
speaks as in the video, and the soundscape is the clip's own sound. With no
speech heard and no words typed, it says nothing about the lips.

* Document two-person swaps and off-screen dialogue
2026-11-05 15:58:53 -06:00
ausboss 93f64d07d7 H3 Prompt Writer: swap lines keep their words, speaker, delivery and time (#275)
* Add Load Audio node: wave, trim, preview and max length

Load a sound file and keep only the part you want. The node shows the
whole file as a wave. Drag the IN and OUT handles (or type the times),
press play to hear just that part, and set Max length to the longest
sound the next step takes: anything past it turns red and is cut off,
so you see what comes out before you run. Max length can be wired.

Only the picked part is decoded. Outputs the audio and its seconds.
Help page, README, changelog, Chinese names, tests and the API snapshot
are included.

* Load Audio: open smaller and go down to 280 wide

* Load Audio: shorter wave, length moves off the wave next to OUT

* Add the Pika H3 Flex example workflow

* H3 Prompt Writer: a swap puts each person picture in one person's place

* H3 Prompt Writer: keep quoted words in a swap and read who goes out of a longer line

A swap dropped every typed line once it had read who goes, so words in
quotes never reached H3 and the new person's lips were guessed. Those
lines now stay as the new person's words, landing on the lip movement of
the video, and a voice with a swap no longer says nobody speaks.

"Elon is @1, he replaces the person at the counter" went whole into the
description of who goes. The words after replaces (or takes the place of,
instead of, ...) are now who goes, and a name given to @1 is left out.

* H3 Prompt Writer: swap lines go to the right speaker

Names given with a comma ("Altman is @1, the man on the left. Dario is
@2, ...") no longer run into each other, and a later "Dario says" or
"He says" goes to that person. A thing that speaks, like the card
reader, says its words from off screen so nobody's lips move. "raps"
and a few other ways of speaking count as speech, so "and raps" stays
out of who goes.

* H3 Prompt Writer: keep how a swap line is said, and its exact time

"The card reader says in a flat robot voice" now names the card reader
and keeps "in a flat robot voice" as how it says the words. A time like
3.2s at the start of a line was read as a list number and lost its 3; it
now stays 3.2, a time typed inside a swap line counts too, and the first
words of a swap say when they start.

* H3 Prompt Writer: a person off screen gets their own voice

"A woman off screen says" went to the person on screen, as their voiceover,
and in a swap it landed on the swapped-in person. Now a person or a name
the line puts off screen (off screen, off camera, behind the camera, O.S.)
speaks from off screen as their own speaker, in a swap and outside one.
An unnamed voiceover, an @ or a he or she still stays the main person's.
Off-screen voices no longer get a 'stays silent with the lips closed' line.

* H3 Prompt Writer: a swap can keep the clip's clothes

A swap always dressed the new person in the picture's clothes. Typing
"keeps her outfit", "in the clip's clothes" or "keep the clothes from the
video" now takes only the face and hair from the picture and keeps the
clothes of whoever goes. "keeps her own clothes" still means the picture's.

* H3 Prompt Writer: a thing said to be off screen speaks for itself in every mode

"A card reader off screen says" got its own voice only in a swap. In copy
its moves and the other modes it became the person on screen's voiceover.
Anything a line puts off screen now speaks for itself; "a voice" and
"narrator" stay the main person's voiceover.

* Document two-person swaps and off-screen dialogue
2026-11-05 15:57:11 -06:00
ausboss b3a3d7a8ca Add frameless workflow tiles and branded Markdown guides (#284) 2026-11-05 15:55:47 -06:00
ausboss c37386c1d4 Seed: add a compact look, picked from the gear (#274) 2026-11-03 23:59:16 -06:00
ausboss 7cb0abaacf Add Load Audio node: wave, trim, preview and max length (#272) 2026-11-03 23:58:16 -06:00
ausboss ded731859c Integer and Float: a big look, like Text (#270)
Integer and Float get the same gear as Text, with a big look: one large centred number with its arrows, in a taller row. The Pika H3 Flex workflow uses it for Seconds.

The look is kept in the node's properties (ausboss_text_look: "big"), so saved values and what the node sends don't change. A row with its own height in a look now takes that height when the look changes. Docs and changelog updated.
2026-11-03 13:45:54 -06:00
ausboss 9ba82c45b4 H3 Prompt Writer: timeline, colored words, Sound and Music boxes
- Words light up as you type (@1, times, cuts, quotes, labels), with @
  autocomplete and a ? cheat sheet
- Timeline bar shows every picture a line names; drag a block to reorder,
  drag its edge to set its time, click an edge for a cut, click a block to
  jump to its line
- Sound and Music boxes (new optional inputs, appended) fill H3's
  overall_soundscape and non_diegetic_music
- Pictures and video as chips with their jobs; Length, Camera and Look stay
  plain rows so they can still be wired
- Help page and changelog updated; tests for the colors, autocomplete,
  timeline edits and the new inputs
2026-11-03 11:09:26 -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 ba8d2b8048 Merge pull request #268 from ausboss/docs/agent-guide
Add an agent guide and move contributor rules to CONTRIBUTING.md
2026-11-02 16:49:03 -06:00
ausboss 6b1b1cfabc Crop For Inpaint: scale crops evenly and default to multiple 32; Tone match skips see-through pixels 2026-11-02 16:02:53 -06:00
ausboss 17fb493a66 Merge remote-tracking branch 'origin/main' into feat/h3-prompt-writer 2026-11-02 14:20:06 -06:00
ausboss a61d3d4ee0 H3 Prompt Writer node with width and height outputs 2026-11-02 02:07:29 -06:00
ausboss 91b53162cc Add an agent guide to the nodes and move contributor rules to CONTRIBUTING.md 2026-11-01 20:52:18 -06:00
ausboss 21ca6e9f47 Stitch Inpaint: Paste onto puts a hand crop back on the whole picture
Image Crop + Rotate + Pad's stitcher now remembers the picture and the
crop's position. With Paste onto on original, Stitch Inpaint lays the
result on the whole picture, straight, resized or turned. The default
stays crop, so saved workflows run as before.
2026-11-01 01:24:49 -06:00
ausboss b5bce60c22 Workflow Switches: + Choice, and a guide for AI agents
Two named settings used to take about 20 clicks through a menu and
Settings. + Choice saves how a node is set under a name, and the second
one turns the card into a pill. What a choice changes is what it holds
differently from the other choices, so it needs no off side. A choice can
also hold the nodes only it needs, so a missing model in the branch nobody
picked no longer stops the run.

js/docs/agents/workflow_switches.md tells an AI agent how to write a card
into a workflow file. It sits under js/docs because that ships with the
pack. A test holds its examples to what the card really stores.
2026-10-31 21:01:07 -05:00
ausboss 39da7a3931 Workflow Switches: One at a time holds for new switches and the setting
A new switch read on beside the rows already on, and turning the setting
on left every row on. A new switch now gives way to the rows that were
there, and turning the setting on keeps one row on.

Fixes #256
2026-10-31 08:49:11 -05:00
ausboss 33ce662398 Image Folder: say what "start over" does
The README, help page and tooltip now say that the pictures go round
after the last one, and the CHANGELOG has the fix from #252.
2026-10-30 23:23:08 -05:00
ausboss ff6706a918 LaMa Inpaint opens only known model files; Frame Interpolate errors name no folders
A LaMa model file can run code when it opens, so the node checks the file's
SHA-256 first and opens only the two common builds of big-lama.pt. Frame
Interpolate's errors now name the file, and the folder goes to the console.
2026-10-30 18:09:45 -05:00
ausboss e4b9a08cec Release 2.20.4: Workflow Switches explain "empty"
The paste fix in 2.20.3 works when the paste happens, so a workflow pasted
and saved on an older version keeps its old numbers and still reads
"empty" after an update. The word's hover text now says what happened and
what to do: open the original file again, or add nodes from the switch's
menu. The help page says the same.
2026-10-30 13:17:56 -05:00
ausboss d0658ea8b2 Workflow Switches and Callout: follow the copies after a paste
Copy and paste give every pasted node and group a new id, and so do
duplicate, Alt + drag and dragging a saved workflow onto the canvas. A
Workflow Switches card remembers its parts by id, so a whole workflow
pasted into a new tab read "empty" on every row and nothing could be
switched on; pasted into another workflow it could switch unrelated nodes
that had the old numbers. A Callout's links to a node or group broke the
same way.

The frontend's paste (LGraphCanvas._deserializeItems) returns which new
node each old id became. js/shared/paste_ids.mjs hands that on after every
paste, and a pasted card or note points at the copies of what it names.
An id the paste did not copy is kept, so a card pasted on its own still
switches the original parts.
2026-10-29 11:05:44 -05:00
ausboss 13145ed881 Save Image: say a run is going, hold the last step, keep tiles off the picture
While the models load, an empty picture area says the run is going instead
of asking for a run. With steps on, the last step stays up until the saved
picture has loaded, so it no longer blinks out. Between a tiled upscale's
split and stitch (and for Ultimate SD Upscale) the step pictures are tiles:
the whole picture stays and the chip says "upscaling in tiles".
2026-10-27 08:51:40 -05:00
ausboss 1faca35331 Merge branch 'main' of https://github.com/ausboss/ComfyUI-AusBoss into fix/touch-other-picture-message
# Conflicts:
#	CHANGELOG.md
2026-10-26 19:31:42 -05:00
ausboss 8837c75553 Keep see-through parts in Crop/Stitch Inpaint and Image Compare
Stitch Inpaint takes an RGB patch over an RGBA picture and keeps the
picture's own alpha, instead of stopping on a channel mismatch. The halo
fix spreads colours only.

Image Compare keeps alpha in a preview that has see-through parts and
flags it, so the panel shows them over a checkerboard (Slide, A/B and
Erase). The Erase mix lays the top picture over the other, the saved PNG
is RGBA, and the PSD carries each layer's transparency plus a merged
alpha, its flat colours stored over white as Photoshop does. A see-through
B is resized premultiplied. Align measures over gray and warps all four
channels. Solid pictures give byte-identical files.

Refs #232
2026-10-26 18:40:49 -05:00
ausboss 69fbceb0a1 Mask by Touch: say when the picks were made on another picture
When the picture coming into the node changed after picking, the run
stopped with "nothing is picked yet" while the picks still showed on the
node. It now says the picks were made on another picture. If nothing set
to empty mask still lets the run go on.
2026-10-26 18:05:42 -05:00
ausboss 6af50147fc Step preview: the caption is the step count alone; Step Preview shows the finished picture once it is saved 2026-10-25 15:35:17 -05:00
ausboss c54ee8984f Step preview: Stop takes clicks on Save Image; the step picture fills its box; help notes from real runs 2026-10-25 15:35:06 -05: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 9aefc53134 LoRA Loader: say why a Civitai lookup failed
The button still reads Civitai lookup failed, and a message now gives the
reason. A browser that cannot reach civitai.com at all names the usual
causes: a firewall, a VPN, or ComfyUI started with --disable-api-nodes.
2026-10-25 13:00:09 -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 da98850591 LoRA Loader: hand Civitai info to the LoRA Previews add-on
After Fetch Civitai info saves its file, LoRA Loader sends a browser
event. The separate LoRA Previews add-on answers it by saving the LoRA's
preview picture, and the card and hover show it without a reload. The
info card links to the add-on when a LoRA has Civitai info but no picture.
2026-10-24 16:55:24 -05:00
ausboss 812a22c070 LoRA Loader: groups get their own switch; Workflow Switches can own a group
Turning a group off stops its LoRAs and keeps each row's own on/off for when
the group comes back on. A switch saved with a group on and off now moves only
the group, shows one lock on the group's header, and leaves the rows inside to
the person. Renaming the group keeps the switch; clicking the lock takes the
group back.
2026-10-24 15:18:36 -05:00
ausboss 0afae99b30 LoRA Loader: Shift-click ticks a run in the picker
Shift-click a tick box or name ticks every file from the last one ticked.
Ctrl+Enter ticks the highlighted file and Shift+Enter ticks the run up to it.
2026-10-24 14:58:33 -05:00
ausboss 840f0003dd LoRA Loader: fix picker arrows and drag-out, add stack menu
- The picker's arrow keys no longer stick when the list opens under a
  pointer that has not moved: only a real pointer move takes the
  highlight.
- A group's only LoRA can be dragged out, and a group's first row
  dropped above its own header lands there instead of at the bottom.
  Just below a group's last row is now always outside the group.
- Right-click on the space around the rows opens a stack menu (add,
  group the selection, fold or open all groups, delete all) instead of
  the browser's Copy / Select all; the group menu also ends with
  Delete all.
2026-10-24 14:22:27 -05:00
ausboss 7469c5869e LoRA Loader: tick several files to add, and group rows
The + LoRA list gets a tick box beside each file. Ticked files (also by
Ctrl/Shift-click or Ctrl/Shift+Enter) are added together from a bar at
the bottom; ticks survive a search, and files already in the stack read
"in stack".

Rows can be grouped: Ctrl/Shift-click to select, right-click to group,
move to a group or take out. A group header has a switch for all its
rows, a fold arrow that shortens the node, a double-click rename, and a
grip to drag the whole group. Rows drag in and out by their grip. The
group name is stored on each row, so the stack still runs top to bottom
and groups travel with templates and undo; folded groups are a node
property.
2026-10-24 14:03:06 -05:00
ausboss 8062c35f70 Merge main into feat/compare-image-b-output
# Conflicts:
#	CHANGELOG.md
2026-10-21 14:35:56 -05:00
ausboss b6012c48fb Mask by Touch and Image Folder: hidden values take no link
A text link held over Mask by Touch snapped to its hidden `touches`
input, drawn at the top edge of its settings card, and letting go wired
the text in place of the picks. Image Folder's hidden `pictures` did the
same once Folder was wired. The frontend gives every widget an input
socket unless it is marked socketless, and a link dropped on a node
lands on its first free input of the link's type, hidden ones included.

The card's `socketless` option, which only made a combo, now also makes
a one-line text widget for a STRING (markSocketless moves to
widget_card_math.mjs so it can be tested). Mask by Touch's card lists
touches and ask, Image Folder's lists pictures. The backend inputs do
not change: saved values still load by position and the API prompt
still carries them. An older workflow brings the empty slots back on
load and the card drops them again, as it already did for Seam.
2026-10-21 14:32:58 -05:00
ausboss cc5617db04 Merge main into feat/compare-image-b-output 2026-10-21 14:26:12 -05:00
ausboss 5b8cad57d7 Loaders: take files ComfyUI made, as core Load Image does
Image Crop + Rotate + Pad, Load Image + Pad and Load Video refused a
picture named the way ComfyUI names a generated file
("photo.png [output]", "[temp]") with "The selected source is outside
ComfyUI's input folder." Core Load Image takes those names.

resolve_input_path now reads the name the same way the video nodes'
Outputs list already does (resolve_server_file): the tag picks the
input, output or temp folder, and the rest is a name below it. A whole
path, "~", "." and "..", and a network path are refused from the text
alone; a link that leads out of the folder is refused once resolved.
Both functions share that code. A whole path inside the input folder,
accepted before, is now refused too, as the security rule asks.

Load Video's player and the shared upstream preview stripped the tag
and asked /view for the input folder; they now keep the folder.

Tests cover input, [input], [output] and [temp] names through the
resolver and through ComfyUI's own validation next to core Load Image,
and the refused escapes. Help pages, SECURITY.md and CHANGELOG say so.
2026-10-21 14:21:55 -05:00
ausboss 2b34005150 Image Compare A/B: pass on image_b too
The node gets a second output, image_b: the B batch, untouched, the
way image_a already passes through. image_a stays the first output, so
saved workflows keep their wires. The slider, its resting side, Erase
and Save are unchanged.

Help page, tooltips, README line and CHANGELOG say so; the node API
snapshot gains the one new output.
2026-10-21 13:47:48 -05:00
ausboss 8d94da719e Layout Boxes: boxes can be turned, to replace words at a slant
A round knob above the chosen box turns it (Shift: 5 degree steps); a Turn
field under the canvas types the angle and a double-click levels it. The
mask follows the turned box exactly, bboxes and elements keep the straight
box around it, and a turned text box adds how it is tilted to its
description. A box that is not turned saves and outputs exactly as before.
2026-10-19 19:00:42 -05:00
ausboss dca5ded302 Layout Boxes: easier to place boxes on a picture
The arrow keys move a box one pixel (Shift: ten), and the grid starts off
when a picture is wired in. Handles, tags and outlines keep one size on the
screen at any zoom, and over a picture the boxes are see-through. Each box's
tag says whether it is text or an object, a chip per box picks the box to
edit, and the type buttons read as that box's own setting. A gear sets the
grid size. With a picture shown, the canvas keeps the picture's own shape
even when width and height are wired.
2026-10-19 16:38:02 -05:00
ausboss 3379df7e7f Layout Boxes: a mask output, to change only what is inside the boxes
The mask is white inside every box and black elsewhere, at the size of the
picture on background (or the canvas without one). Draw a box over the words
on a sign, wire the mask into an inpaint chain, and only the words change.
It comes after the other three outputs, so saved workflows keep their wires.
2026-10-19 14:31:02 -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 a10064393b Workflow Switches: a switch keeps the strength you give a LoRA row
A switch that turns LoRA Loader rows on and off compared and wrote each
row's strength as well as whether it is on. A row turned down to 0.6 by
hand read "changed" (a pill went amber, "only partly on"), and the next
click set its model strength back to the saved one and left its CLIP
strength behind.

A LoRA row pair now carries whether the row is on, and a strength (model
or CLIP) only where the switch's saved on and off differ. pairNow compares
only what the pair carries and pairValue writes only that, so the strength
and triggers someone set stay, and the card reads on or off. A switch
saved with one strength for on and another for off still sets it, now
with the CLIP strength too. How switches are saved does not change.
2026-10-18 19:45:09 -05:00
ausboss b4f78cf06e Merge branch 'main' into feat/compare-align 2026-10-18 20:39:25 +00:00