Manual Feature From Pipe β‘π ‘π π £π
Hand-keyframe a curve that shares a pipe's timeline
- feature_pipe
- FEATURE
This is the "shares a timeline" version of manual feature keyframing. Instead of setting its own frame rate, frame count, and resolution, it reads those from an upstream FEATURE_PIPE - so you get exactly the same keyframe-a-curve-by-hand behavior as ManualFeatureNode, but sized to match whatever pipe you feed it.
Why you'd reach for it over the standalone node
If you're only building one manual curve, there's no benefit here - just use ManualFeatureNode and skip the extra node. This one earns its place when you've got several manual curves that all need to describe the same underlying sequence. Build a single ManualFeaturePipe with your project's frame rate, frame count, and resolution, then wire that same pipe into two, three, four ManualFeatureFromPipe nodes - one per curve you want to hand-keyframe. Change the frame count once at the pipe and every curve derived from it stays in sync, instead of you manually updating the same numbers across a handful of separate nodes and inevitably letting one drift out of sync with the others.
The inputs that matter
feature_pipe(required,FEATURE_PIPE) - supplies the frame rate, count, and resolution this curve is built against. Comes fromManualFeaturePipe.frame_numbers(default"0,10,20") - comma-separated keyframe positions.values(default"0.0,0.5,1.0") - the value at each keyframe, matched by position toframe_numbers.last_value(default 1) - what the curve holds at after your last explicit keyframe.interpolation_method(none/linear/ease_in/ease_out) - how the curve moves between keyframes;nonesteps,linearramps straight, the ease modes soften the start or end of each segment.
Output is a single FEATURE - feed it into LocationTransform, preview it with InstantFloatPreview, or wire it into whatever else in the pack consumes a Flex Feature.
Same interpolation and keyframe fields as ManualFeatureNode, deliberately - the two nodes are meant to produce identical curve behavior. The only real difference is where the timeline dimensions come from: typed directly on ManualFeatureNode, or inherited from a shared FEATURE_PIPE here. Pick based on whether you've got one curve to define or several that need to stay in lockstep.
How to install it
The pack's README came back empty for install specifics, so the standard path applies:
ComfyUI Manager: search "RyanOnTheInside", install, restart.
Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/ryanontheinside/ComfyUI_RyanOnTheInside
Restart ComfyUI afterward.
Troubleshooting
Keep frame_numbers and values the same length - a mismatch is the most common way this node produces a curve that doesn't line up with what you intended. If the curve seems capped shorter than you expected, check the frame_count on the upstream ManualFeaturePipe, not this node - since this node inherits its timeline from the pipe, editing frame_numbers here won't extend the sequence past what the pipe defines. And if you're only using one of these off a given pipe, it's worth asking whether you need the pipe at all - for a single curve, ManualFeatureNode does the same thing with one less node in the graph.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| feature_pipe | FEATURE_PIPE | Input feature pipe | |
| frame_numbers | STRING | 0,10,20 | Comma-separated list of frame numbers (e.g., "0,10,20") |
| values | STRING | 0.0,0.5,1.0 | Comma-separated list of values (e.g., "0.0,0.5,1.0") |
| last_value | FLOAT | 1.00 | Value for the last frame (default: 1.0) |
| interpolation_method | COMBO | none | Method for interpolating between values ('none', 'linear', 'ease_in', 'ease_out') |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| FEATURE | FEATURE | β |