StringScheduleHelper
One Text Box That Splits Into a Prompt Plus Its Step Schedule
- base_prompt
- schedule
- has_schedule
If you've ever done prompt scheduling - the "this prompt for the first stretch of steps, that one for the rest" trick that AnimateDiff and a lot of SDXL/Flux scheduling nodes live on - you know the actual annoyance. It's not the scheduling. It's that your base prompt lives in one widget and the step-keyed schedule lives in another, and the two drift out of sync every time you edit. StringScheduleHelper is davcha's fix: one multiline box, and the node splits the lines for you.
What it is
It's a small node in comfyui_davcha, dchatel's "Some personal QoL and experimental nodes" pack (the author posts on r/StableDiffusion as Occsan). The pack is exactly what it says on the tin - a grab-bag of QoL helpers and experiments, some of which the author has offered to spin out into standalone repos because, in his own words, you shouldn't have to "deal with the experimental crap" to get the useful ones. StringScheduleHelper is one of the calm ones.
Feed it a text field and it buckets each line. Lines that start with a number and a colon become schedule entries; everything else becomes the base prompt:
a cozy living room, warm afternoon light
10: a black cat asleep on the sofa
20: the same room at night, moonlight through the window
How it works
The mechanism is one regex per line, (\d+):(.+). A numbered line gets rewritten into step-keyed form - "10": "a black cat asleep on the sofa" - and all of them get joined with commas and newlines into the schedule output. The non-numbered lines get newline-joined into base_prompt. has_schedule is true whenever at least one numbered line existed; if none did, schedule degrades to "0": "" so a downstream scheduling node still receives a valid-but-empty string and you can branch on has_schedule to bypass it entirely.
That "0": "...", "10": "..." shape is the classic step-schedule convention in this ecosystem - AnimateDiff prompt schedules look exactly like it, where the key means "from this step onward." So the intended wiring is straightforward: base_prompt goes into your normal CLIP text encode, and schedule (plus has_schedule) goes into whatever scheduling node your workflow already uses.
The fields that matter
The fields that matter:
text(required, multiline) - your whole prompt-plus-schedule in one box. It's flagged withdynamicPrompts, the same flag the stock CLIPTextEncode uses, so{a|b}and seed syntax still expand before the split.base_prompt(STRING) - the non-scheduled lines, newline-joined.schedule(STRING) - the step-keyed schedule.has_schedule(BOOLEAN) - whether any schedule lines were found.
Installing it
Install is the usual dance. ComfyUI Manager → search comfyui_davcha, or clone it:
cd ComfyUI/custom_nodes
git clone https://github.com/dchatel/comfyui_davcha
Then restart ComfyUI. No model files, no heavy downloads - the README is literally one sentence. One gotcha worth knowing before you pull the whole pack for this node: requirements.txt only lists webp and rapidfuzz, but the module imports llama_cpp and scipy at the top level with no guard. If the entire pack fails to register after a fresh install, that's why - install llama-cpp-python and scipy and restart. If you already run LLM or video packs you probably have both.
Troubleshooting
Two parsing traps while you're in there. First, any line starting with digits followed by a colon gets treated as a schedule entry, even by accident - 2024: the year of... will be silently yanked out of your base prompt. Second, blank lines vanish; the regex needs at least one character per line. And remember the keys are step numbers, not sigmas or percentages - if the node you're feeding expects 0.0–1.0 timing, this output isn't the same unit.
It's not going to change your life. It's a text-splitting convenience, the rare QoL node that does one thing, has one input, and ships no config panel. But if you're the sort of person who keeps a prompt and its schedule together in one file, it's exactly the node you'd wish you'd had before you met it.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| text | STRING | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| base_prompt | STRING | — |
| schedule | STRING | — |
| has_schedule | BOOLEAN | — |