ComfyUI Node

Sonder Editor

A timeline video editor that lives inside one ComfyUI node

By SonderSaid·Created about a month ago·Updated 12 days ago· 30
Sonder Editor
    • project
    • rendered_frames
    • guide_images
    • guide_idx
    • guide_strengths
    • prompt
    • frame_count
    • fps
    • width
    • height
    • audio
    • mask_start_time
    • mask_end_time
    project
    project_nameMy Project
    fps24.000
    width1280
    height720
    scene_id
    selection_start0
    selection_end0
    pre_context_frames0
    post_context_frames0
    mask_pre_offset0
    mask_post_offset0
    take_placement_modetrimmed
    take_placement_linkedtrue
    take_placement_mutedfalse
    render_cache_max_bytes0
    render_queue_activetrue
    take_fit_modepad_edge
    take_crop_positioncenter

    Sonder Editor is the node people mean when they talk about "the ComfyUI timeline editor." Instead of babysitting one KSampler for a single clip, you stage the whole shot - clips, audio, guide frames, prompt sections - on a multi-lane timeline, select the range you want to generate, and hand that range to whatever workflow you've wired downstream. It's the same shape of idea as LTX Director, except it doesn't care which model you feed it; the author's own framing is blunt about the division of labor: Sonder doesn't generate anything, it stages the shot.

    That's the part to internalize before anything else. This node is not a video model and it is not a sampler. It is a staging surface plus a project/asset manager wrapped in a single graph node, and the generation quality you get out is 100% your workflow. The bundled LTX 2.3 example workflow is the showcase because LTX is fast and complete, but a user in the launch thread has already run it with IC-LoRA motion transfer and a face LoRA on top of a normal LTX graph - Sonder just passes the frame data through.

    How it works

    Open the node and a fullscreen editor loads: import media into a project-scoped asset gallery, drag clips onto lanes, trim and split, drop diamond-shaped guide frames onto their own lane, cut prompt sections, set an in/out selection. Every project lives as local files under ComfyUI/output/sonder-projects/. When you queue a render, the editor snapshots the selected window and the node emits everything your downstream graph needs: composited frames, guide images with their frame indices and strengths, the prompt text, frame count, resolution, audio, and the mask start/end times that tell a temporal inpainting node where generation is allowed to touch.

    The context-frame inputs (pre_context_frames, post_context_frames) are the secret sauce for continuity: frames before and after your selection are included in the render but not denoised, so a regen blends into what's already on the timeline. The mask_pre_offset/mask_post_offset pair then trims that context out of the denoise window. This is exactly the mechanism that makes "regenerate just this beat" possible without the cut jumping.

    Inputs and outputs that matter

    You only set four widgets when creating a project: project (pick an existing one or "+ Create New"), project_name, fps, and width/height. Everything else is editor UI state. The render_queue_active toggle is worth knowing - off means "render the live selection without consuming queued jobs."

    The outputs you'll actually wire, in rough order of importance:

    • project - the object that every other Sonder bridge and save node consumes.
    • rendered_frames - the composited video (all visible clips layered with opacity).
    • guide_images + guide_idx + guide_strengths - reference frames for LTX-style guiders.
    • prompt, frame_count, fps, width, height, audio - the current selection's generation context.
    • mask_start_time / mask_end_time - wire into a temporal mask node to keep context frames ungenerated.

    Installing it

    ComfyUI Manager, search Sonder Editor, install, restart. Or:

    cd ComfyUI/custom_nodes
    git clone https://github.com/SonderSaid/ComfyUI-Sonder-Editor.git
    cd ComfyUI-Sonder-Editor
    pip install -r requirements.txt
    

    Its requirements are light (numpy, Pillow, opencv-python-headless, imageio, imageio-ffmpeg, scipy, aiohttp). Notably, torch is deliberately not in there - the pack won't clobber your CUDA build, and if you need torchaudio for audio you install a matching build yourself. A system ffmpeg on your PATH is recommended for the widest format support. Restart ComfyUI and the pack registers itself plus its web UI.

    Common issues

    • ffmpeg not found on export/decode - install ffmpeg system-wide and restart. The bundled imageio-ffmpeg binary is only a fallback.
    • cv2 import errors - this pack uses opencv-python-headless; if another custom node pulled in full opencv-python, the two conflict. Keep exactly one OpenCV variant installed (headless).
    • GPU "stopped working" after install - something reinstalled torch with a mismatched wheel. Don't let an auto-resolve do that; reinstall the torch build matching your CUDA.
    • Missing nodes on an old ComfyUI - Sonder Switch, Cluster, and Metadata Collector Nodes 2.0 use the V3 node API and only load on recent builds. The rest of the pack still works.

    One more thing: projects can embed your full workflow metadata when saving (see Sonder Save Video), so turn that off before sharing files if your graph is private - and don't expose a ComfyUI instance running this pack to untrusted networks. The editor is real software, early (v0.1.x), but the author is actively fixing what people hit. It's the node to reach for when you're tired of stitching one clip at a time.

    CategorySonder

    Inputs (19)

    NameTypeDefaultDescription
    projectCOMBOSelect an existing project or '+ Create New'.
    project_nameSTRINGMy ProjectName for new project. Only used with '+ Create New'.
    fpsFLOAT24.0001–120Frame rate. Only used when creating a new project.
    widthINT128064–4096Video width. Only used when creating a new project.
    heightINT72064–4096Video height. Only used when creating a new project.
    scene_idoptSTRINGActive scene ID (set by editor UI).
    selection_startoptINT00–999999Start frame of timeline selection (set by editor UI).
    selection_endoptINT00–999999End frame of timeline selection (set by editor UI).
    pre_context_framesoptINT00–256Context frames BEFORE selection. Included in render but not denoised (use mask outputs). Clamped to available frames.
    post_context_framesoptINT00–256Context frames AFTER selection. Included in render but not denoised (use mask outputs). Clamped to available frames.
    mask_pre_offsetoptINT00–256Extra pre-context frames to exclude from denoise mask start. Clamped to actual pre-context.
    mask_post_offsetoptINT00–256Extra post-context frames to include in denoise mask end. Clamped to actual post-context.
    take_placement_modeoptSTRINGtrimmedTake placement mode for non-queued renders. Set by editor settings.
    take_placement_linkedoptBOOLEANtrueWhether take video/audio siblings are linked when placed on the timeline.
    take_placement_mutedoptBOOLEANfalseWhether newly placed takes enter the timeline muted.
    render_cache_max_bytesoptINT0-1–9007199254740991Project render-cache budget in bytes. 0 disables caching; -1 is unlimited.
    render_queue_activeoptBOOLEANtrueWhen enabled, queue jobs drive editor execution. Disable to render the live selection without consuming queue jobs.
    take_fit_modeoptSTRINGpad_edgeFit mode stamped on newly placed takes (set by editor settings).
    take_crop_positionoptSTRINGcenterCrop anchor stamped on newly placed takes (set by editor settings).

    Outputs (13)

    NameTypeDescription
    projectSONDER_PROJECTThe project object. Connect to Sonder Save Video.
    rendered_framesIMAGEComposited video frames from the timeline (all visible clips layered with opacity).
    guide_imagesIMAGEGuide frame images as an IMAGE batch tensor. Connect to LTX guiders.
    guide_idxSTRINGComma-separated frame indices for each guide image (e.g., '0,96').
    guide_strengthsSTRINGComma-separated guide strengths aligned with guide_idx.
    promptSTRINGThe prompt text for the selected timeline section.
    frame_countINTNumber of frames in the selected section.
    fpsFLOATProject FPS.
    widthINTProject width in pixels.
    heightINTProject height in pixels.
    audioAUDIOAudio for the selected section (if any).
    mask_start_timeFLOATSeconds offset within output where generation starts. Wire to temporal mask start_time.
    mask_end_timeFLOATSeconds offset within output where generation ends. Wire to temporal mask end_time.