Nodes/ꘇ Genereti/ꘇ mod.timeline
ComfyUI Node

ꘇ mod.timeline

The dock that turns a ComfyUI graph into a performance

By languel·Created about a month ago·Updated 3 days ago· 1
ꘇ mod.timeline
    • description

    Here's the odd node in this batch: mod.timeline takes no inputs at all and has one STRING output that just tells you to go open the dock. It's a handle, not a processor. Drop it in a workflow and you've declared "this patch has a score" - the timeline panel then edits the workflow's performance document, which is where tempo, meter, automation clips and takes live.

    If that sounds like a lot of ceremony for a node with no wires, it's because it is. But Genereti's whole pitch (languel/genereti, Liuboto, MIT, super-alpha) is that ComfyUI's queue is a snapshot engine, and a performance needs continuous time plus automation. The timeline is the authoring surface for that second clock, and this node is how you get to it from inside a graph.

    What it does, exactly

    Its single output, description, is a plain STRING carrying the sentence "Open the ꘇ Timeline bottom panel to edit the workflow performance document. The browser saves it in workflow extra.generetiPerformance." That's a genuinely honest description of the node: it exists so the dock is reachable and so the workflow visibly owns a performance document.

    The document itself is the interesting part. It's versioned, stored at extra.generetiPerformance in the workflow JSON, and it holds the things you'd expect from a sequencer: transport state, tempo and meter, loop handles, numeric automation tracks, clips and takes, global scale/tuning, and JSON import/export. Saving your normal Comfy workflow saves the score with it. Timeline edits have their own bounded undo/redo, separate from Comfy's graph history - a small mercy.

    Using it

    Press Alt+Shift+T to toggle the native bottom panel (that's a Comfy keybinding, editable in the Keybinding panel). Alt+Space play/pauses project time outside text fields. The node itself opens the same dock, or a draggable floating view - handy when the bottom panel is fighting your graph for vertical space.

    From there, the workflow that actually earns its keep: select a node, pick a numeric parameter in the dock, hit + to create a clip or ● to record a take while playing. Recording uses unwrapped monotonic elapsed time, so a take that crosses a loop boundary doesn't fold back on itself, and the final value is held to the stop point. Clips take key times and values with linear or step interpolation; you can drag, trim, and Alt-drag an edge to stretch.

    One real limitation to know up front: this pass records one selected numeric parameter per take. Text, graph construction and pointer demos are the lesson recorder's job. If you're expecting to capture a whole performance, that's not what this does yet.

    The seek policy is the thing nobody reads and everybody should

    Seeking pauses playback, bumps a discontinuity epoch, resets linked TOP feedback and history, and cancels scheduled notes. A loop wrap resets history too. The point is to avoid stale feedback images and a burst of every note it "missed" while you scrubbed. Musically that's the right call; it does mean that scrubbing is not a rehearsal - you won't hear audition audio, and stateful p5/Three.js simulations aren't reconstructed.

    Sequence deadlines schedule on Web Audio about 120 ms ahead with a 25 ms timer, and late steps get skipped rather than fired in a heap. So after a browser stall your pattern resumes in time instead of playing catch-up.

    Install

    Manager → search "Genereti" → install ꘇ Genereti → restart ComfyUI → refresh the browser page. Manual:

    git clone https://github.com/languel/genereti.git custom_nodes/genereti
    ./.venv/bin/python -m pip install -r custom_nodes/genereti/requirements.txt
    

    Only comfyui-frontend-package>=1.53.6 is pinned. Requires ComfyUI 0.38.2+, Python 3.11+, a modern browser. The dock needs the browser bundles that ship with the pack, so a hard refresh after installing is not optional. The bundled ꘇ-Performance-Timeline workflow is the intended first stop, and its six-step lesson covers shared time, expressions, explicit audio start, recording and seeking.

    Gotchas

    Restart, then refresh, in that order. A browser refresh alone can't reload changed Python, and a Comfy restart without refreshing leaves you on stale frontend bundles. If the timeline tab is missing or the panel looks wrong, that's the first thing to redo.

    Hidden does not mean stopped. Hiding the dock keeps playback running - the clock is derived from a monotonic anchor so a stalled redraw doesn't eat elapsed time. If you wanted silence, stop the transport.

    Queue does not replay your automation. Queuing captures one frozen snapshot of project time and automation per prompt; it won't step through a clip in real time. The timeline is for the live browser, and Queue is a checkpoint.

    CategoryGenereti / Performance

    Inputs (0)

    No inputs

    Outputs (1)

    NameTypeDescription
    descriptionSTRING—