Skip to main content
From nothing to a rendered proxy episode. Windows first (the development machine); the Linux/macOS differences are called out where they exist. The commands are written with Windows paths: on Linux/macOS use forward slashes, and python3 where python is missing. What you end up with: the seriesmith command and its editor (a page seriesmith serve opens in your browser), comfy-api-proxy in front of your ComfyUI, seriesmith’s node pack in ComfyUI, and one episode folder holding a series config, a script, and everything seriesmith generated from them.
  1. Requirements
  2. seriesmith, the proxy and the node pack
  3. Workflows
  4. Models
  5. First run
  6. Troubleshooting
The format of what you write is docs/AUTHORING.md; the backends (Comfy Cloud, deployments, Router) are docs/SETUP.md; what seriesmith does with it all is the README.

1. Requirements

  • Python 3.10 or later. pip install -e . in the repo installs seriesmith and what it needs (comfy-sdk, aiohttp, Pillow, numpy); a virtualenv is a good idea. The build and check themselves need nothing beyond the standard library.
  • ffmpeg and ffprobe on PATH. Assemble, master and publish cut with them; the waveform peaks, the audio import, align and the Recording window need them too. On Windows, winget install Gyan.FFmpeg; on Linux/macOS, your package manager (apt install ffmpeg, brew install ffmpeg).
  • Somewhere to render, one or both:
    • your own ComfyUI (a recent local ComfyUI; seriesmith is developed against 0.38 — the MiniMax H3, Krea 2 and SeedVR2 nodes are recent core additions), with the model files of the targets you use (section 4) and a GPU that can hold them. seriesmith has only been run on an NVIDIA RTX 5090 (32 GB) under Windows; the default H3 stack (an int8 diffusion model and a 32B text encoder in nvfp4) wants a recent NVIDIA card. seriesmith expects it at http://127.0.0.1:8188.
    • Comfy’s cloud: a Comfy API key (platform.comfy.org) for Comfy Cloud, your deployments and the hosted models through Comfy Router (docs/SETUP.md). A hosted model (Seedance, Kling, Veo, Nano Banana, …) needs no GPU and no model files; paid use is billed to the key’s account.
  • Third-party node packs for some targets — see the table below.

Third-party node packs

Everything else the targets’ workflows use ships with core ComfyUI or with seriesmith’s own pack (section 2). seriesmith targets names a missing node class under the target that needs it. Install them with ComfyUI-Manager or by cloning into custom_nodes, then restart ComfyUI. A deployment or Comfy Cloud needs the same packs there.

Optional, and what each one unlocks

Which Python gets faster-whisper. align runs as a subprocess, and seriesmith picks its interpreter, best first:
  1. $SERIESMITH_ALIGN_PYTHON, if set to an interpreter path
  2. the Python seriesmith runs on
  3. python, then python3, as found on PATH
— the first of those that has both numpy and a Whisper. The editor’s Recording window names the interpreter it settled on and prints the exact pip install line for it; GET /seriesmith/align/ready reports the same.

2. seriesmith, the proxy and the node pack

seriesmith

Anywhere you like (C:\code\seriesmith and C:\AI\ComfyUI in this guide are only examples) — it does not have to live near ComfyUI.

comfy-api-proxy

seriesmith talks to every ComfyUI the same way, through Comfy’s API. Your own ComfyUI gets that API from comfy-api-proxy, a small server in front of it:
You rarely start it yourself: seriesmith serve, and every command that queues work on local, start it when it isn’t running and ComfyUI is (on port 8189, its state in %LOCALAPPDATA%\seriesmith\proxy). docs/SETUP.md has the details and the command to run it by hand.

The node pack

comfy_nodes/ is seriesmith’s side of ComfyUI: the shot loader and saver, the continuous: latent chain, the upscale loaders and saver, and the upscale and post compute nodes. Everything seriesmith sends a backend runs on these; they never read or write an episode folder (files go up with each job and come back as its outputs). Link the folder into custom_nodes, so pulling the repo updates what ComfyUI loads. Windows, in an ordinary (non-elevated) Command Prompt — mklink /J makes a directory junction and needs no administrator rights:
PowerShell has no mklink; use cmd /c mklink /J ... or New-Item -ItemType Junction. Linux/macOS:
Restart ComfyUI whenever a comfy_nodes/*.py file changes, since ComfyUI imports the node classes once at startup. The pack sits happily beside h3pipe’s, if you keep that for h3pipe.

The editor inside ComfyUI (optional)

The same pack also puts seriesmith’s editor inside ComfyUI: seriesmith Shots and seriesmith Refs in the sidebar, seriesmith Timeline in the bottom panel. It’s the same app as seriesmith serve, with the same project folders, settings and queue. For that, ComfyUI’s own Python needs the seriesmith package (and comfy-api-proxy, which it starts for the local backend). With the portable ComfyUI, from the seriesmith repo:
-e links it to the repo, so pulling updates it (restart ComfyUI after). Without it the nodes still load and the editor stays off (ComfyUI’s console says so). Inside ComfyUI, a bar on top of seriesmith Shots has Render on, the Jobs button and Settings, as the standalone page’s top bar does. The ComfyUI host keeps its own queue journal (queue-comfyui.json), so it and seriesmith serve can run at the same time.

Check it

Then seriesmith serve (add --root C:\Shows to name your project folders) and open http://127.0.0.1:8190. Set your project roots — the folders holding your episodes — in the Shots tab if you didn’t pass --root; every episode the editor touches has to live inside one of them. They are kept in seriesmith’s folder beside its settings file (%APPDATA%\seriesmith\default\seriesmith\config.json; ~/.config/seriesmith/... on Linux/macOS), else read from SERIESMITH_ROOTS (;-separated, : on Linux/macOS). On Windows the repo has two launchers, like ComfyUI’s: run_seriesmith.bat (this PC only) and run_seriesmith_ext.bat (other devices on your network too: it listens on every interface, --host 0.0.0.0, and prints the address to open on a laptop or phone). Double-click one, or make a desktop shortcut to it: it opens the editor in your browser (--auto-launch) once the server is up, as ComfyUI’s do. Each starts seriesmith again when the editor’s Settings → This server → Restart (or seriesmith stop --restart) asks it to, and closes when it is stopped (Stop, seriesmith stop, or Ctrl+C, without cmd’s “Terminate batch job” question). Stop and Restart are offered only on the PC that runs the server. The network one has no password: anyone on that network can open your project folders, import files from the PC, see the API key in Settings and queue paid runs, so use it on home Wi-Fi you trust and never port-forward it. Away from home, a private network between your own devices (Tailscale) is the safe way in: seriesmith serve --host <the PC's Tailscale address>.

The upscaler (optional)

Only for upscaling takes (seriesmith upscale, the editor’s Upscale, master); a render never needs it. It is for takes made on minimax_h3_ref2va. Takes made on ltx2 upscale with what LTX-2 already has (its own latent upsampler), so they need nothing from here. The pixel method upscales a take on any target with an upscale model instead. Put one or more in models/upscale_models/ — RealESRGAN_x2 (the default: exactly 2x, gentle on film grain) and RealESRGAN_x4 from the xinntao/Real-ESRGAN releases, or 4x-UltraSharp from OpenModelDB (check its licence: it may be non-commercial). ComfyUI-Manager’s Model Manager installs them too. They load with core ComfyUI nodes. On an NVIDIA RTX card, RTX Video Super Resolution can stand in for an upscale model (no model file): install Comfy-Org’s Nvidia RTX Nodes pack (ComfyUI-Manager: search “RTX”; it needs CUDA PyTorch cu130 or newer) and restart ComfyUI. Its nvidia-vfx wheel is on NVIDIA’s own index, and PyPI’s is a stub that fails to install, so if ComfyUI’s log says No module named 'nvvfx', install it into ComfyUI’s Python and restart again: python_embeded\python.exe -m pip install nvidia-vfx --extra-index-url https://pypi.nvidia.com. The Upscale dialog then lists “RTX Video Super Resolution” beside the models (rtx_vsr; rtx_vsr:HIGHBITRATE_ULTRA for its level tuned to clean sources).
  1. Clone LBH-123-AI/Comfyui_Minimax_h3_latent_Upscaler into custom_nodes:
    Not its “Plus” fork: that registers the same node without temporal chunking, and the re-sample then invents detail (sparkles on hair, marks on faces). Only one of the two can be installed.
  2. Put minimax_h3_latent_upscaler_3d_fp16.safetensors in models/latent_upscale_models/. Its Hugging Face repo, LBH-123-AI/Minimax_h3_latent_Upscaler, now publishes it as minimax_h3_latent_upscaler_3d_conv_v1_fp16.safetensors (the same file): download that and save it under the old name (section 4, For upscaling, has the link).
  3. Restart ComfyUI. seriesmith targets then prints upscale ready under minimax_h3_ref2va, or names what’s missing.
  4. For takes longer than 5.5 s, clone chanon/comfyui-obvpm-timeline into custom_nodes too. Its H3 Context Windowing node samples the re-sample in overlapping windows along time, so a long shot at 2x (2688×1536) fits a 32 GB card; without it such an upscale says it needs the pack instead of running out of memory. The series’ upscale recipe’s window changes the length (0: off).

3. Workflows

Every target names one ComfyUI workflow, by the name it expects among ComfyUI’s saved workflows (<ComfyUI>/user/default/workflows/): You usually need to do nothing. The lookup order is:
  1. --workflow <path> on the command line
  2. the target’s environment variable, if it points at a file
  3. the workflow of that name as saved in the running ComfyUI (fetched over its API, so it always matches your node versions)
  4. $COMFYUI_PATH\user\default\workflows\<name>
  5. the copy in this repo, targets/<kind>/<id>/workflow.json
Step 5 is why a fresh install renders without you saving anything. The repo copies are checked in and kept working. Saving a workflow in ComfyUI under the expected name is how you take over: from then on that graph is what renders, and it is a ComfyUI-native way to change the sampler, scheduler, or splice in a LoRA without touching Python. Keep the saved krea2_refs_t2i.json free of style LoRAs (experiment under another name) — the reference images have to follow the look your series config describes. Two targets bend the order slightly:
  • krea2 has one more fallback: finding no file at all, it uses a built-in Krea 2 turbo graph (seriesmith/targets/image/krea2/graph.py). --no-workflow forces that.
  • ltx2_voice (and any audio target) puts the repo copy ahead of $COMFYUI_PATH, because no saved canvas is likely to hold an audio-only LTX graph and one of that name would be somebody’s experiment. The running ComfyUI’s saved copy still wins.
The editor’s location tour isn’t a target: it runs seriesmith/workflows/h3_tour.json (H3 FL2VA from the plate) from the repo, and needs H3 FL2VA’s models and the PlagueKind pack. seriesmith render <episode> --only sh010 --dry-run writes the graph a shot would send, running nothing; seriesmith targets asks the running ComfyUI whether it knows every node each target uses — worth running once after a ComfyUI update.

4. Models

Put each file in the ComfyUI models folder named beside it, e.g. C:\AI\ComfyUI\ComfyUI\models\diffusion_models\. ComfyUI also accepts models\unet\ for diffusion_models and models\clip\ for text_encoders. Check before you download. With ComfyUI running:
prints one line per target — ready, degraded, not_ready or unknown — and under it every file it cannot find, with the folder it belongs in and the download link. --kind video, --kind image or --kind audio narrows it; --json prints data. In the editor, the model pickers and the Models window (the button beside each picker) show the same thing. A file you already have under another name usually still counts: seriesmith identifies models by family (names first, then the safetensors header), so a re-quantized or renamed copy of the same model is accepted and the take’s sidecar records what was actually used. Hosted models need no files. The Comfy Router targets (seedance_2_5, krea_2_router, nano_banana_pro, …) run on Router with your API key, so nothing below applies to them. Nodes count too. Some targets need node classes as well as files. Most are core ComfyUI (MiniMax H3 FL2VA’s MiniMaxH3AddGuide, the Wan 2.2 and LTX-2.5 video graphs); the rest come from the third-party packs in section 1. seriesmith targets lists a missing one as node <Class> (update ComfyUI, or install the node pack). The list below is generated from the targets themselves (python tools/make_models_md.py), so it cannot drift from what the code asks ComfyUI to load. No URL is guessed: a file whose download record has no trustworthy source is listed as having none.

The minimum set

The two default targets — minimax_h3_ref2va (the video model every shot renders on unless the script says otherwise) and krea2 (the image model that draws the character sheets, props and location plates) — need 7 required files: Plus, for those two targets: An accelerator is a turbo/distilled LoRA or checkpoint: without it the pass still renders, on its slower base preset (more steps, no LoRA), and the take’s sidecar says so. A required file missing skips the shot. An optional file only switches off the feature named beside it.

Everything, by model family

Every file any target names. seriesmith targets tells you which of these your ComfyUI is actually missing — you only need the families of the targets you use. LTX 2.5 (ltx2.5) Gemma 4 12B with the LTX 2.5 projection (ltx2.5-text-encoder) LTX 2.5 video VAE (ltx2.5-video-vae) LTX 2.5 audio VAE (ltx2.5-audio-vae) LTX 2.5 latent upscaler (ltx2.5-latent-upscaler) LTX 2.5 duration head (ltx2.5-duration-head) LTX 2.5 ingredients IC-LoRA (ltx2.5-ic-lora-ingredients) LTX 2.3 (ltx2.3) LTX 2.3 ingredients IC-LoRA (ltx2.3-ic-lora-ingredients) Gemma 3 12B (LTX 2.3’s text encoder) (gemma3-12b) MiniMax H3 FL2VA (minimax-h3-fl2va) MiniMax H3 FL2V turbo LoRA (minimax-h3-fl2v-turbo-lora) Qwen3-VL 32B (MiniMax H3’s text encoder) (qwen3vl-32b) MiniMax H3 video VAE (minimax-h3-video-vae) MiniMax H3 audio VAE (minimax-h3-audio-vae) MiniMax H3 Ref2VA (minimax-h3-ref2va) MiniMax H3 Ref2V turbo LoRA (minimax-h3-ref2v-turbo-lora) Wan 2.2 I2V 14B high-noise (wan2.2-i2v-14b-high) Wan 2.2 I2V 14B low-noise (wan2.2-i2v-14b-low) Wan 2.2 I2V lightx2v 4-step LoRA (wan2.2-i2v-lightx2v-lora) UMT5-XXL (Wan’s text encoder) (umt5-xxl) Wan 2.1 VAE (wan2.1-vae) Wan 2.2 TI2V 5B (wan2.2-ti2v-5b) Wan 2.2 VAE (wan2.2-vae) Wan 2.2 Fun VACE 14B high-noise (wan2.2-vace-14b-high) Wan 2.2 Fun VACE 14B low-noise (wan2.2-vace-14b-low) Wan 2.2 T2V lightx2v 4-step LoRA (wan2.2-t2v-lightx2v-lora) FLUX.2 Klein 9B (flux2-klein-9b) Qwen3 8B (FLUX.2 Klein 9B’s text encoder) (qwen3-8b) FLUX.2 VAE (flux2-vae) FLUX.3 Image Klein (flux3-klein) Qwen3-VL 4B (Krea 2’s and FLUX.3 Klein’s text encoder) (qwen3vl-4b) FLUX.3 Image Klein step-distilled (turbo) (flux3-klein-distilled) FLUX.1 Kontext dev (flux1-kontext-dev) CLIP-L (clip-l) T5-XXL (FLUX.1’s text encoder) (t5-xxl) FLUX.1 VAE (ae) (flux1-vae) FLUX.2 Klein 9B base (flux2-klein-9b-base) Krea 2 (krea2) Qwen-Image 2.1 (qwen-image-2.1) Qwen3-VL 8B (Qwen-Image 2.1’s text encoder) (qwen3vl-8b) Qwen-Image 2.1 VAE (qwen-image-2.1-vae) Qwen-Image-Edit Rapid AIO (qwen-rapid-aio) Z-Image Turbo (z-image-turbo) Qwen3 4B (Z-Image’s text encoder) (qwen3-4b)

For upscaling (optional)

Only to upscale takes (seriesmith upscale), never to render. H3’s MinimaxH3LatentUpscaler3D comes from the Comfyui_Minimax_h3_latent_Upscaler pack (LBH-123-AI) — not its “Plus” fork, which has the same node without temporal chunking; LTX’s LTXVLatentUpsampler is ComfyUI’s own. seriesmith targets says whether this ComfyUI can upscale.
  • ltx-2.3-spatial-upscaler-x2-1.1.safetensors → models/latent_upscale_models/ (LTXVLatentUpsampler, for ltx2_ingredients) — download (ComfyUI-Manager model list (model-list.json; ComfyUI’s blueprint Image to Video (LTX-2.3).json has the same URL). Only needed to upscale, never to render.)
  • minimax_h3_latent_upscaler_3d_fp16.safetensors → models/latent_upscale_models/ (MinimaxH3LatentUpscaler3D, for minimax_h3_fl2va, minimax_h3_ref2va) — download (the Hugging Face repo LBH-123-AI/Minimax_h3_latent_Upscaler, which now publishes it as minimax_h3_latent_upscaler_3d_conv_v1/minimax_h3_latent_upscaler_3d_conv_v1_fp16.safetensors (the same file: sha256 043e5a48e161…, checked 2026-10-09): save it under this name. Only needed to upscale, never to render.)
SeedVR2 (any take; ComfyUI’s own nodes, the models Apache 2.0): the VAE and at least one model.
  • seedvr2_ema_vae_fp16.safetensors → models/vae/ — download (ComfyUI templates utility_seedvr2_3b_int8_upscale_video.json / utility_seedvr2_7b_int8_upscale_image.json (properties.models))
  • seedvr2_7b_int8_convrot.safetensors → models/diffusion_models/ — download (ComfyUI templates utility_seedvr2_3b_int8_upscale_video.json / utility_seedvr2_7b_int8_upscale_image.json (properties.models))
  • seedvr2_3b_int8_convrot.safetensors → models/diffusion_models/ — download (ComfyUI templates utility_seedvr2_3b_int8_upscale_video.json / utility_seedvr2_7b_int8_upscale_image.json (properties.models))
  • ltx2: nothing extra. Its render already has a latent upsampler, and an upscale runs that second stage again on the take
  • wan22_i2v: an upscale model from models/upscale_models/ (RealESRGAN_x2.pth by default), then its own sampler
  • wan22_ti2v: an upscale model from models/upscale_models/ (RealESRGAN_x2.pth by default), then its own sampler
  • wan22_vace: an upscale model from models/upscale_models/ (RealESRGAN_x2.pth by default), then its own sampler

For the editor’s 360s and turned views (optional)

Three LoRAs the Refs tab uses, outside any target’s list above. Each goes in models/loras/. Only the button that uses one needs it; without it, that job fails on the missing file.

5. First run

An episode is one folder holding a series config and a script. Everything else in it is generated.
Two rules that save an hour of confusion:
  • The script should be named after its folder — ep01\ep01.md. Any other single .md in the folder is accepted, but two of them and nothing can tell which is the script.
  • series.json goes in the episode folder. seriesmith build and check insist on it; the editor falls back to a config in the parent folder.
You don’t have to type either file: seriesmith new Shows\MyShow\ep02 writes both, starting from the episode beside it (its cast, look and profiles) or from examples/starter/ when the show is new. New episode… in the editor’s project folders does the same.

Something to copy from

  • examples/starter/ — the smallest correct pair: one character, one prop, one location, three shots. It is what seriesmith new writes and what Your first episode in the authoring guide quotes, so it builds with no warnings as it stands.
  • examples/series_example.json and examples/script_example.md — a full three-sequence episode with props, a voice-only character and audio: windows. Note that it is written for a recorded dialogue mix (audio.mode: source_track), so its dialogue shots stay blocked until you supply audio/ep01_dialogue_mix.wav or change the mode.
  • tests/fixtures/kitchen_sink/ and tests/fixtures/mixed/ — small episodes that exercise most of the format, including shots retargeted onto other models.
  • docs/AUTHORING.md is the format itself: every field, the frame grids, the syllable budget, how to break a scene into shots.
  • To draft with an AI assistant, python tools/make_prompts.py packages that guide as a skill in build/skill/seriesmith-episode-script/ — copy the folder into .claude/skills/ for Claude Code, or upload the zip beside it on claude.ai. It carries the build, so the assistant can check a script with nothing installed.

A first episode

That writes the two files (the starter pair) and compiles them. Writing your own is the authoring guide’s job, not this one’s: docs/AUTHORING.md opens with Your first episode — the same pair, field by field. Come back here for the commands that render it.

The command line

Each command runs its jobs on a queue of its own and waits for them; --backend NAME sends them somewhere other than each target’s own (usually local).
Then the full-size pass, once the animatic reads right:
With the upscaler installed and the final pass rendering at 960×544 (docs/AUTHORING.md, Final resolution), the picked takes go to 2x once the cut is locked:
seriesmith all Shows\ep01 --proxy runs build → refs → render → assemble in one go. seriesmith master and publish make the finished episode, issues keeps review notes, and seriesmith on its own prints every command. What to expect along the way:
  • check prints the shot count, the runtime, and a pacing table — every dialogue shot with the syllables-per-second it forces on the performance. 0 crammed is what you want.
  • build writes shotlist\, refs_todo.md and refs_todo.json and prints the model, LoRA and step count each pass will use.
  • refs --list shows what is missing before it spends any GPU time; refs then draws each one, keeping every attempt as a take under refs\_takes\.
  • render --list is the dry run. Shots whose reference images are still missing show as blocked, and the report names the exact file each one wants — --allow-missing-refs renders them against flat grey stand-ins if you want to see the motion first.
  • assemble --proxy --check reports the cut (order, take, trims) and writes nothing.
--only sh020,sh030 narrows render, refs and upscale to a few shots; --redo makes a new take instead of reusing the one on disk. Every command has --help.

The same thing in the editor

docs/EDITOR.md is the guide to the editor itself — the order to do things in, every button, and the keyboard. The short version follows. Run seriesmith serve --root Shows and open http://127.0.0.1:8190:
  1. In the Shots tab, check the project roots hold Shows\ (or set them). The episode list fills in.
  2. Pick ep01 and the proxy pass.
  3. Build — the same build the command line runs, with its report in the panel.
  4. Open the Refs tab and generate the character sheet and the plate. Every candidate is a take; pick the one you want.
  5. Back in Shots, render — a shot, a selection or the episode. Each take is a job in the Jobs window (the queue button, top right), with its progress and log; takes appear as they finish, and the Viewer plays them and compares two side by side or under a wipe.
  6. The Timeline (bottom) is the cut: reorder, trim, pick a take per shot, Play all to watch it without rendering anything, then Export to assemble the one mp4.
Everything the editor does is a plain file in the episode folder — overrides.json, cut.json, the per-take sidecars — the same files seriesmith override, seriesmith pick and seriesmith cut write. You can move between the two freely.

6. Troubleshooting

!! can't tell which script to use in <folder>: ['draft.md', 'notes2.md'] The episode folder has more than one candidate .md. Name the script after the folder (ep01\ep01.md) or delete the spare. The editor’s failure mode is quieter: a folder it cannot resolve a script for simply never appears in the episode list. !! <folder>\series.json not found seriesmith build and check need the series config in the episode folder itself (the editor would fall back to the parent folder’s). Copy it in, or run seriesmith new to make one. The animatic renders at a size you did not ask for. With no proxy block in the series config, the proxy pass falls back to the target’s own proxy preset — 512×288 for MiniMax H3 — rather than a scaled-down copy of your final size. That is fine until your final size is not 16:9, at which point the proxy and the final have different aspect ratios and proxy placeholders in a final cut get scaled oddly. Add a proxy block (the Series settings form’s Size (proxy)): a new series gets 864×480; 896×512 is exactly 1344×768’s shape, both axes on H3’s /32 grid. Shots skipped with a missing-model message. Run seriesmith targets (add the episode folder to include its series config’s model choices). It names every missing file, the models folder it belongs in, and its download link. A missing required file skips the shot; a missing accelerator (a turbo LoRA) is not an error — the pass renders on its slower base preset and the take’s sidecar records that. ComfyUI at http://127.0.0.1:8188 didn't answer, or every target is unknown. ComfyUI is not running, or not on that port. Work on local needs it up, and the readiness checks ask it. comfyui_url in the settings (docs/SETUP.md) points seriesmith elsewhere. A job fails at once with comfy-api-proxy in its error, or seriesmith backends says local doesn’t answer. The proxy isn’t running and couldn’t be started: pip install comfy-api-proxy into the same Python as seriesmith, and check ComfyUI is up (the proxy is only started in front of a ComfyUI that answers). comfy-api-proxy status says whether it’s running. A job fails with a missing node class (SeriesmithShotLoader, SeriesmithSaveTake, …). seriesmith’s node pack isn’t in that ComfyUI, or ComfyUI wasn’t restarted since it was linked or updated. Link comfy_nodes\ into custom_nodes\ (section 2) and restart ComfyUI. A deployment or Comfy Cloud needs the pack too. You changed web/ and nothing changed in the browser. The editor is served from the committed pages, not from web/: seriesmith serve from seriesmith\server\static\, the editor inside ComfyUI from comfy_nodes\web\seriesmith-editor.js. Rebuild both:
then hard-reload the tab (Ctrl-Shift-R). npm run dev serves dev.html against a mock API for UI work without a server; it never opens a browser by itself. align says faster-whisper is missing, but you installed it. You installed it into a different interpreter from the one seriesmith picked. The Recording window names the interpreter it chose and prints the exact pip install line for it. To force one, set SERIESMITH_ALIGN_PYTHON to that interpreter’s full path in the environment seriesmith serve (or your shell) starts in, and restart it. No foley bed on dub_keep_foley shots. The saver node shells out to python -m demucs, so demucs has to be importable by the python first on ComfyUI’s PATH — not necessarily ComfyUI’s own interpreter. The take’s status line says demucs not installed - foley bed skipped. A workflow ComfyUI refuses. seriesmith converts a canvas workflow to API format itself. If your graph uses something the converter cannot express faithfully, save it with Workflow → Export (API) and point the target’s environment variable (section 3) at that file. Never hand-edit generated files. shotlist\, refs_todo.* and the per-take *.shotlist.json are outputs. Change the script, the series config or overrides.json and rebuild — seeds are derived from the episode, sequence and shot ids, so untouched shots re-render identically.