Nodes/FizzNodes/String Schedule πŸ“…πŸ…•πŸ…
ComfyUI Node Runs on cloud

String Schedule πŸ“…πŸ…•πŸ…

Scheduled prompts as text, for when you don't want the conditioning yet

By FizzleDorfΒ·Created 3 years agoΒ·Updated 2 years agoΒ· 479
String Schedule πŸ“…πŸ…•πŸ…
    • POS
    • NEG
    β—„text"0" :"", "11" :"", "23" :"", "35" :"", "47" :"", "59" :"", "71" :"", "83" :"", "95" :"", "107" :"", "119" :"" β–Ί
    β—„max_frames120β–Ί
    β—„current_frame0β–Ί
    β—„print_outputfalseβ–Ί
    β—„pre_textβ€”β–Ί
    β—„app_textβ€”β–Ί
    β—„pw_a0.0β–Ί
    β—„pw_b0.0β–Ί
    β—„pw_c0.0β–Ί
    β—„pw_d0.0β–Ί

    String Schedule is Prompt Schedule's quieter twin. Same keyframe text, same --neg splitting, same interpolation engine - but instead of CLIP-encoding the prompts into CONDITIONING, it hands you the evaluated prompt as a string, at the current frame. Two string outputs, POS and NEG, and no clip input at all. That single difference is the whole point: it computes which prompt should be active right now and gives it to you, so you can do whatever you like with it downstream.

    When you'd actually use this

    Plenty of workflows don't need conditioning out of a scheduler. A few that do this instead:

    • Feeding a LoRA stacker or another node that takes prompt text - you schedule which LoRA is active per frame, and String Schedule tells the stacker which one to apply at frame N.
    • Driving a different text encoder - if you're encoding with a node that isn't CLIP, you want the string, not the conditioning.
    • Displaying or logging - wire POS to a Show Text node and you can watch your prompt animate, which is a great way to verify a schedule before spending a render on it.
    • Tokenization-level control - encoding later means you can transform the string (substitute, append, batch) before it ever becomes latent conditioning.

    Because it shares the exact engine, everything from Prompt Schedule carries over: math in prompts via numexpr (t for the frame, pw_a–pw_d as injectable floats), pre_text/app_text wrappers, and current_frame rolling over modulo max_frames so loops stay clean.

    The inputs that matter

    Only a handful. text is your schedule (same "frame" : "prompt" JSON shape, --neg splits the negative). max_frames sets the length, current_frame is the position - and unlike the conditioning nodes, here it's a plain number input you can also just type, which makes String Schedule the easiest node in the pack to test-drive a schedule with. print_output dumps the active prompt to the console. That's basically it.

    Install and gotchas

    It ships in the FizzNodes pack, so the install is one line away in ComfyUI Manager - search FizzNodes. Manual install is the usual clone plus requirements:

    cd ComfyUI/custom_nodes
    git clone https://github.com/FizzleDorf/ComfyUI_FizzNodes
    cd ComfyUI_FizzNodes && pip install -r requirements.txt
    

    Just numpy, pandas, and numexpr - no models. Restart ComfyUI, find it under FizzNodes πŸ“…πŸ…•πŸ… β†’ ScheduleNodes.

    The gotchas are the family ones: malformed schedule JSON (watch the trailing comma) and the fact that the string is evaluated at a single frame - if you don't feed current_frame from a per-frame source, you'll get the same prompt every frame, which is easy to mistake for a broken schedule. If you're new, run it through a Show Text node with a changing current_frame and watch the output; within a minute you'll understand the whole scheduling model this pack is built on.

    CategoryFizzNodes πŸ“…πŸ…•πŸ…/ScheduleNodes

    Inputs (10)

    NameTypeDefaultDescription
    textSTRING"0" :"", "11" :"", "23" :"", "35" :"", "47" :"", "59" :"", "71" :"", "83" :"", "95" :"", "107" :"", "119" :"" β€”
    max_framesINT1201–999999β€”
    current_frameINT00–999999β€”
    print_outputBOOLEANfalseβ€”
    pre_textoptSTRINGβ€”
    app_textoptSTRINGβ€”
    pw_aoptFLOAT0.0-9999–9999β€”
    pw_boptFLOAT0.0-9999–9999β€”
    pw_coptFLOAT0.0-9999–9999β€”
    pw_doptFLOAT0.0-9999–9999β€”

    Outputs (2)

    NameTypeDescription
    POSSTRINGβ€”
    NEGSTRINGβ€”