LoRA Loader (Scheduled)
Make a LoRA fade in or out mid-generation
- model
- positive
- negative
- model
- positive
- negative
- schedule_out
- schedule_inv
A LoRA at a flat strength for every step is a blunt instrument. A structure LoRA is most useful early, when composition is being decided; a detail LoRA earns its keep late, once the image has settled. This node lets a LoRA's strength change over the course of generation instead of sitting at one number the whole time - and it works with any LoRA, not just ones from this pack.
What it is and why you'd reach for it
This is the standalone utility node in ShootTheSound/comfyUI-Realtime-Lora - same strength-scheduling engine as the pack's V2 analyzer/loader nodes, but on its own, so you can apply it to a LoRA for an architecture the pack doesn't have a dedicated selective loader for, or just when you don't need block-level control and only want the fade behavior.
The classic use is crossfading two LoRAs: a structure LoRA that's strong at the start and fades out, handing off to a detail LoRA that fades in as it finishes. You could approximate this by hand with multiple KSampler (Advanced) stages and manual strength changes between them, but that's fragile and hard to iterate on. This node makes it one dropdown plus a formula.
How it works
The schedule is a step:strength list, comma-separated, where the step values are 0-1 fractions of the generation rather than raw step counts - 0:0, 1:1 means off at the start and full strength by the end, linearly interpolated in between. 0:1, 0.5:1, 0.6:0, 1:0 holds full strength for the first half, then cuts off. There are 40+ named presets covering fades, ease curves, bell curves (peak in the middle), the "structure LoRA" and "detail LoRA" shaped curves by name, step functions, pulses, and inverted versions of all of them - so hand-writing the syntax is rarely necessary.
The crossfade trick: connect one loader's schedule_inv output (the mathematical inverse of its own schedule - 1 minus the strength at every keyframe) into a second Scheduled LoRA Loader's schedule_in input. Set loader A to "Linear Out (1→0)" and loader B automatically receives the complementary "0:0, 1:1" fade-in, so A fades out exactly as B fades in without you hand-syncing two curves.
Inputs and outputs that matter
- model / positive / negative - a normal LoRA loader's pipeline inputs, all three patched (conditioning gets touched because the schedule is implemented as generation hooks, not a static patch).
- lora_name, strength - the LoRA and its baseline strength before the schedule modifies it.
- schedule_preset - pick from 40+ named curves, or leave on Custom to type your own into strength_schedule.
- lora_path_opt (optional) - a direct path input that overrides the dropdown, the usual pattern for chaining off one of the pack's trainer nodes.
- schedule_in (optional) - receive a schedule from an upstream node (typically another Scheduled LoRA Loader's
schedule_inv) instead of setting your own. - Outputs: model, positive, negative (patched, wire to your sampler), schedule_out (the active schedule string, for chaining to a downstream node), schedule_inv (the inverted schedule - 1 minus strength at each keyframe - built for the crossfade pattern above).
Installing it
ComfyUI Manager: search "Realtime LoRA Trainer." Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/ShootTheSound/comfyUI-Realtime-Lora
Restart ComfyUI. Works immediately, no training backend or model download needed - this is a pure loader/patcher node.
Troubleshooting
Schedule seems ignored, strength stays flat. Make sure schedule_preset isn't left on a fixed value like "Constant 1.0" by accident, and that strength_schedule (if you're hand-writing one) uses step:strength pairs with steps as 0-1 fractions, not raw step numbers - 0,10:1 is not the same as 0:0,1:1.
Crossfade isn't syncing between two LoRAs. Confirm schedule_inv from the first loader is actually wired into schedule_in on the second, and that the second loader's own schedule_preset isn't overriding the incoming schedule - an explicitly set preset on the receiving node takes precedence over what's piped in.
lora_name is empty. Only LoRAs already in your loras folder show up; use lora_path_opt for one you just trained or that lives elsewhere.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| positive | CONDITIONING | Positive conditioning from CLIP encode | |
| negative | CONDITIONING | Negative conditioning from CLIP encode | |
| lora_name | COMBO | LoRA file to load | |
| strength | FLOAT | 1.00-10–10 | LoRA strength (ignored when using schedule) |
| schedule_preset | COMBO | Custom | Select a preset schedule (populates the text field) |
| strength_schedule | STRING | Strength schedule: 0:.2,.5:.8,1:1.0 (step:strength pairs) | |
| lora_path_optopt | STRING | Optional: override the LoRA dropdown with a file path (e.g. from a LoRA-manager / lora-stack node that outputs a path). | |
| schedule_inopt | STRING | Schedule input from another node (overrides preset/text field) |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| model | MODEL | Model with LoRA applied. |
| positive | CONDITIONING | Positive conditioning (with hooks if using schedule). |
| negative | CONDITIONING | Negative conditioning (with hooks if using schedule). |
| schedule_out | STRING | Active schedule string (for chaining to other loaders). |
| schedule_inv | STRING | Inverted schedule (1 - strength at each keyframe, for complementary LoRAs). |