đź’€Motion Config
The control room of S4Motion — where all the effectors actually render
- layer_image
- background_image
- rotation_effector
- position_effector
- scale_effector
- opacity_effector
- distortion_effector
- mask_effector
- shake_effector
- Output path
- Frame sequence
Every other motion node in the S4Motion pack is a dead end by itself - a đź’€Motion Position or đź’€Motion Rotation on its own does nothing. đź’€Motion Config is the node they all feed into, and the only one that actually produces output. Think of it as a tiny After Effects comp: you give it a layer, a background, a timeline, and it renders the frames.
Here's the core setup. layer_image is the thing that moves, background_image is what it sits on top of. time (seconds, 0.1–30) and fps (1–60) define the timeline - the node renders time × fps frames. loop makes the saved animation repeat, format picks webp (default) or apng for the file it writes, and preserve_alpha keeps RGBA channels in the output frames instead of flattening to RGB.
You can animate four things statically right on the node - rotation, position_x, position_y, scale, opacity - no effector needed. But that's the boring path. The interesting path is the seven optional inputs down the bottom: rotation_effector, position_effector, scale_effector, opacity_effector, distortion_effector, mask_effector, shake_effector. Each one takes the matching effector node's output, and the two combine: effector rotation values add to the static rotation, effector scale and opacity multiply theirs, and effector positions add to position_x/y. So an effector's "default" value of 0 (or 1) means "no change from the static base."
Each effector output is a callable object with a type tag, and the node validates the type on connection - wire a Position effector into the rotation_effector socket and you get a clear "effector type mismatch" error telling you exactly what to connect where. That validation is honestly the best part of this pack's UX.
Outputs
- Output path (STRING) - the absolute path of the webp/apng file it saved. Useful for passing into a preview or save node.
- Frame sequence (IMAGE) - every rendered frame, ready to wire into SaveAnimatedWEBP, a video saver, or back into another part of your graph.
The gotcha that bites everyone
The animation file is not saved to ComfyUI's usual output/ folder. It goes to custom_nodes/ComfyUI-S4Motion/output/ - inside the pack's own directory - with a random name like motion_12345678.webp. If you can't find your render, that's where it is. If you want the file somewhere sane, take the Frame sequence output and save it yourself.
Install
ComfyUI Manager → search "S4Motion" → install → restart, or:
cd ComfyUI/custom_nodes/
git clone https://github.com/S4MUEL-404/ComfyUI-S4Motion.git
pip install -r ComfyUI-S4Motion/requirements.txt
One more thing: the pack's requirements.txt lists scipy, scikit-image, and opencv-python as "optional," but đź’€Motion Position On Path imports them unconditionally at load time - if you want the whole pack to boot, install everything in the requirements file, not just the "core" three. And if you see a "đź’€Motion Config" node in a workflow you downloaded, you need this pack installed - there's no reddit discussion of it to lean on, so the examples/ folder in the repo is your best reference for wiring.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| layer_image | IMAGE | — | |
| background_image | IMAGE | — | |
| time | FLOAT | 2.00.1–30 | — |
| fps | INT | 151–60 | — |
| loop | BOOLEAN | false | — |
| format | COMBO | webp | 2 options: webp, apng |
| preserve_alpha | BOOLEAN | false | — |
| rotation | FLOAT | 0-360–360 | — |
| position_x | FLOAT | 0-4096–4096 | — |
| position_y | FLOAT | 0-4096–4096 | — |
| scale | FLOAT | 1.00.1–10 | — |
| opacity | FLOAT | 1.000–1 | — |
| rotation_effectoropt | S4_ROTATION_EFFECTOR | — | |
| position_effectoropt | S4_POSITION_EFFECTOR | — | |
| scale_effectoropt | S4_SCALE_EFFECTOR | — | |
| opacity_effectoropt | S4_OPACITY_EFFECTOR | — | |
| distortion_effectoropt | S4_DISTORTION_EFFECTOR | — | |
| mask_effectoropt | S4_MASK_EFFECTOR | — | |
| shake_effectoropt | S4_SHAKE_EFFECTOR | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| Output path | STRING | — |
| Frame sequence | IMAGE | — |