ComfyUI Node Runs on cloud

Spline Editor

Draw a curve, get a schedule (or a motion path) out of it

By kijai·Created 3 years ago·Updated a day ago· 2,908
Spline Editor
  • bg_image
  • mask
  • coord_str
  • float
  • count
  • normalized_str
points_store
coordinates
mask_width512
mask_height512
points_to_sample16
sampling_methodtime
interpolationcardinal
tension0.50
repeat_output1
float_output_typelist
min_value0.00
max_value1.00

Some things are just easier to draw than to type. A weight schedule that ramps up, holds, then eases down; a path an object should travel along; a mask that grows over time - you could express those as a list of numbers, but it's miserable. SplineEditor gives you a canvas, you draw a curve on it, and it spits out that curve as a schedule of floats, a set of coordinates, or a mask batch you can feed into the rest of your graph.

Heads up before you build a pipeline around it: the node's own description says WORK IN PROGRESS, warns of bugs, and tells you not to count on stability. That's the author being honest, not modest - treat it as a powerful sketchpad, not a load-bearing beam.

Why you'd reach for it

This is the tool people use to hand-animate values over a video. The community has built whole spinoff spline editors specifically to "offset/pause/drive curves with a friendly UI" for driving motion and control in video workflows - the ones where you move an object along a path or shape how a control signal evolves across frames. The KJNodes original is where that idea lives: it's the graphical front end for schedules and coordinate paths that would otherwise be a wall of numbers.

Concretely, it feeds three kinds of consumer well: mask batches for anything that eats masks, float lists for IPAdapter weight scheduling, and pandas series for Fizz-style Batch Value Schedule nodes. It plugs straight into the sliding-context-window video world where you're shaping how conditioning changes over a long clip.

How you actually use it

You draw. Shift+click adds a control point at the end, Ctrl+click subdivides between two points, right-click a point deletes it (you can't delete the start/end). Right-click the canvas for a menu to add extra splines or single points. Drop in a bg_image to trace over a reference frame.

The important mental model: the control points you draw are not the output. The node samples the finished curve into however many points you ask for, so the interpolation type genuinely changes the numbers you get out.

The inputs and outputs that matter

The knobs you'll actually touch:

  • points_to_sample (INT, default 16) - how many samples to read off the curve. For a schedule, match this to your frame count.
  • sampling_method (time / path / controlpoints / speed) - time for schedules, path for motion coordinates, controlpoints to return just your points.
  • interpolation (cardinal, monotone, basis, linear, bezier, step-before/after, polar…) - the curve shape between points. This decides the feel of the ramp.
  • tension (FLOAT, default 0.5) - how tight the spline hugs its points.
  • min_value / max_value (optional, default 0 / 1) - remap the output range to whatever your target expects.
  • float_output_type (list / pandas series / tensor) - match this to the node consuming it.

Plus mask_width/mask_height for the mask output, repeat_output to tile the result, and the points_store/coordinates strings that persist your drawing.

Outputs: mask (MASK), coord_str (STRING, the path coordinates), float (FLOAT, the schedule), count (INT), and normalized_str (STRING). Wire whichever one your downstream node wants.

How to install it

ComfyUI Manager: search KJNodes for ComfyUI, install, restart. Manually:

cd ComfyUI/custom_nodes
git clone https://github.com/kijai/ComfyUI-KJNodes
pip install -r ComfyUI-KJNodes/requirements.txt

Restart and it's under KJNodes/weights. No model downloads.

Common issues & troubleshooting

Output length doesn't match my frames. points_to_sample sets the count, independent of how many control points you drew. Set it to your frame count (and check repeat_output isn't multiplying it).

The values look jagged or overshoot. That's your interpolation. cardinal can overshoot past your points; switch to monotone if you need the curve to stay within the values you drew, or linear for dead-simple straight segments.

Wrong type downstream. IPAdapter weights want a float list; a Fizz Batch Value Schedule wants a pandas series. Set float_output_type to match, or you'll get a type error at the connection.

It broke after an update. It's flagged WORK IN PROGRESS, so occasional breakage is on the table. Keep a fallback (a plain value schedule node) for anything you can't afford to have wobble, and don't wire a production job's fate to it.

CategoryKJNodes/weights

Inputs (13)

NameTypeDefaultDescription
points_storeSTRING
coordinatesSTRING
mask_widthINT5128–4096
mask_heightINT5128–4096
points_to_sampleINT162–1000
sampling_methodCOMBOtime4 options: path, time, controlpoints, speed
interpolationCOMBOcardinal9 options: cardinal, monotone, basis, linear, step-before, step-after, +3
tensionFLOAT0.500–1
repeat_outputINT11–4096
float_output_typeCOMBOlist3 options: list, pandas series, tensor
min_valueoptFLOAT0.00-10000–10000
max_valueoptFLOAT1.00-10000–10000
bg_imageoptIMAGE

Outputs (5)

NameTypeDescription
maskMASK
coord_strSTRING
floatFLOAT
countINT
normalized_strSTRING