Gives the monitor a clickable history of where a generation has been, at real decoded
quality rather than the 1/8-scale latent previews live_preview streams.
A node collecting image_1..image_N cannot do this. ComfyUI executes a node only once ALL
its inputs resolve, so a hub node emits nothing until the final stage finishes - exactly
when the information stops being useful. Same barrier documented in save_lineage.py, and
the reason RMSaveLineage cannot serve this purpose either.
So this patches the funnel instead: comfy.sd.VAE.decode and .decode_tiled. Every decoded
image passes through one of the two, including images from custom nodes calling
vae.decode directly, so existing workflows gain stage history with nothing wired. Accepted
cost: it captures every decode, including ones inside detailers and upscalers, and stages
cannot be hand-named.
Unlike live previews this queues rather than single-slots - a preview frame is disposable
because a newer one is moments away, but every stage is a distinct event and losing one
leaves a hole in the history. Bounded at 12 pending, dropping oldest.
Capture is guarded at the wrapper as well as inside _capture. A test that threw from
_capture proved the safety property was only incidental: the wrapper had no guard of its
own, so one future edit moving a line outside _capture would have broken every generation
in every workflow.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012uM7Ru1JYn48n6c5Rzwd99
The Viewer depended on ComfyUI-Moser for two things the clean build no longer had:
live sampler previews (POSTed to /api/comfy-live/frame) and the auto-retry toggle. Both
now live here, so the Viewer needs exactly one pack installed.
Viewer endpoints are unchanged. Auto-retry registers /api/rm-autoretry/* as canonical
and keeps /api/moser-autoretry/* as an alias so no Viewer change is needed yet; both
prefixes share state. Route registration is per-path so a co-installed ComfyUI-Moser
owning the moser-* paths cannot prevent the rm-* ones from registering, and the live
preview hook checks both _rm_patched and _moser_patched so the two never double-send.
Dropped auto_retry runtime pip install of websocket-client: this venv is uv-managed and
has no pip, so the fallback could never succeed and hid the real cause. Declared in
requirements.txt instead.
MOSER_* environment variables still work as a fallback for the live preview settings.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012uM7Ru1JYn48n6c5Rzwd99
Both replace a single node we were pulling an entire pack in for.
RMAddLabel matches KJNodes AddLabel widget-for-widget, with two fixes: left/right now
work at any aspect ratio (the original rotated on the width/channel axes and returned a
[B,C,H,W] tensor that could only concatenate when the image was square), and fonts are
read from the system font directory as well as the pack, so a clean install has 361
usable fonts instead of none.
RMImageComparer is a self-contained reimplementation of rgthree Image Comparer. The
Python half subclasses PreviewImage; the slider is drawn on the node canvas in
js/rm_image_comparer.js rather than through rgthree base-node and widget framework.
The batch index widget is added in JS, not Python, so stepping through a batch does not
invalidate the cache and re-run the graph.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012uM7Ru1JYn48n6c5Rzwd99
Combines up to 5 images into a single batch, auto-resizing mismatched
dimensions to match the first image.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Standalone replacement for pysssss MathExpression — supports expressions
with variables (a, b, c), arithmetic, comparisons, and built-in functions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New nodes: Face Detailer, Mask Combine, Multi Detect Crop, Progress Reporter
Updated: Styles Full, Styles Pipe, Video Combine, styles data
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Features:
- RM Styles Full/Pipe: Load prompts from JSON with random/increment/decrement modes
- RM Power Lora Loader: Advanced LoRA loading with random weight support
- RM Lora Apply: Apply multiple LoRAs with weight ranges
- Image fallback, mask gate, latent nodes, and more
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>