A ready-to-use, local-first ComfyUI distribution for AI video. One command installs everything — Wan 2.2 models, LTX-Video nodes, and a curated video toolchain — and nothing you create ever leaves your machine.
OpenVideo Studio bootstraps a complete, isolated AI video environment around a local ComfyUI checkout. One command clones or updates ComfyUI, builds a dedicated Python virtual environment, installs the PyTorch build that matches your GPU (or CPU), installs the curated custom-node stack (LTX-Video, VideoHelperSuite, KJNodes) at pinned commits, optionally adds ComfyUI Manager, and downloads the official ComfyUI-packaged Wan 2.2 model files from a pinned, reviewed source.
The launcher binds to 127.0.0.1. Nothing leaves your machine unless you explicitly bind to all interfaces.
If your virtual environment is in use, the installer lists the scoped blockers and stops — process termination is strictly opt-in.
Model downloads resolve through an immutable upstream revision recorded in a versioned manifest, with explicit overrides.
Large PyTorch and model downloads use bounded retries, resume support, and partial-file staging.
The Unix installer prints its full command plan without cloning, installing, or downloading anything.
The validation suite rejects tracked files that contain personal paths, machine names, tokens, or account metadata.
| Component | Requirement |
|---|---|
| Operating system | Windows 10/11, current Linux, or macOS |
| Python | 3.10 recommended (3.10+ supported by the test suite) |
| Git | Required for ComfyUI and Manager clone/update |
| curl | Required by the Windows model downloader (bundled with Windows 10/11) |
| ffmpeg | Required for normal video workflows |
| GPU | NVIDIA CUDA GPU recommended; AMD GPUs supported on Windows via DirectML (selectable at install and launch); CPU supported but slow |
| Disk | Substantial free space for PyTorch, ComfyUI, models, and outputs |
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\install.ps1 -Cuda cu128 -Models 5b -WithManager
The default lock policy is non-destructive: if an editor, type checker, or
ComfyUI process is using ComfyUI\.venv, the installer lists
only the scoped blockers and exits before changing Git or packages. To
authorize stopping those scoped process trees and rebuilding:
.\install.ps1 -Cuda cu128 -Models 5b -WithManager -LockedVenvAction Stop
Use -ReuseVenv for an incremental package update only when
the existing environment is healthy.
.\install.ps1 -Cuda directml -Models 5b -WithManager
When -Cuda is omitted, the installer inspects the display
adapters: a machine with both NVIDIA and AMD GPUs asks interactively which
one to use, and an AMD-only machine selects DirectML automatically. The
DirectML backend installs torch-directml and
onnxruntime-directml instead of the CUDA builds.
chmod +x install.sh
CUDA=cu128 MODELS=5b WITH_MANAGER=true START=false ./install.sh
CUDA=cpu MODELS=5b START=false ./install.sh
./install.sh --cuda=cu128 --models=5b --start=false --dry-run=true
# Windows
.\ComfyUI\.venv\Scripts\python.exe .\wan2_cli.py start --path . --port 8188
# Linux / macOS
./ComfyUI/.venv/bin/python ./wan2_cli.py start --path . --port 8188
Pick the GPU explicitly with --device gpu|directml|cpu, or
use the Windows npm shortcuts: npm run wstart:cuda,
npm run wstart:amd, npm run wstart:cpu
(npm run wstart auto-detects).
Then open http://127.0.0.1:8188 and verify the backend:
curl http://127.0.0.1:8188/system_stats
--listen-all binds to
0.0.0.0 and exposes ComfyUI to your local network. Never expose ComfyUI
directly to the public internet — use host firewall rules, an
authenticated reverse proxy, and TLS for any intentionally remote setup.
wan2_cli.py start runs ComfyUI from the managed checkout with
loopback binding and automatic device selection. Device resolution order
in auto mode: CUDA (or ROCm builds of torch) → DirectML (if
torch_directml is importable) → CPU. ROCm installs
additionally get --use-pytorch-cross-attention. CUDA and
DirectML cannot share one virtual environment, so the launcher keeps one
per backend: selecting a device the current environment does not provide
provisions a sibling venv on first use
(ComfyUI/.venv-directml or ComfyUI/.venv-cuda,
with the matching torch build plus ComfyUI and custom-node requirements)
and launches from it — later selections reuse it instantly. On Windows,
npm shortcuts select the device directly:
npm run wstart:cuda, npm run wstart:amd, and
npm run wstart:cpu (npm run wstart keeps
auto-detection).
| Flag / variable | Purpose |
|---|---|
--host / CUSTOM_WAN_COMFYUI_HOST | Bind address (default 127.0.0.1) |
--port / CUSTOM_WAN_COMFYUI_PORT | TCP port, validated inclusive 1–65535 (default 8188) |
--listen-all | Bind 0.0.0.0 (crosses the host network boundary) |
--device / CUSTOM_WAN_COMFYUI_DEVICE | auto, cpu, gpu, rocm, or directml |
--path | Project root containing the ComfyUI/ checkout |
CUSTOM_WAN_COMFYUI_CHECKOUT | Override the checkout location (absolute, or relative to the project root) |
CUSTOM_WAN_COMFYUI_ARGS | Extra arguments passed through to ComfyUI's main.py |
The launcher also scopes Hugging Face caches (HF_HOME,
HF_HUB_CACHE, TRANSFORMERS_CACHE) to a local
hf_cache/ directory under the project root, so model-hub
downloads stay inside the project tree.
install.ps1| Option | Values | Default | Purpose |
|---|---|---|---|
-Cuda | cu128, cu121, cu118, directml, cpu | cu128 | PyTorch backend (directml = AMD/Intel GPUs on Windows) |
-Models | 5b, 14b, i2v, ltx, ltx2, all | 5b | Model selection |
-WithManager | switch | off | Install/update ComfyUI Manager |
-SkipNodes | switch | off | Skip the curated custom-node stack |
-Start | switch | off | Start ComfyUI after a successful install |
-Port | 1–65535 | 8188 | ComfyUI port |
-ListenAll | switch | off | Bind to 0.0.0.0 |
-PyVersion | launcher version | 3.10 | Windows Python launcher selection |
-HfToken | token | HF_TOKEN env | Optional gated-model access (sent to curl via stdin, never on the command line) |
-ModelRepository | owner/repository | manifest value | Model delivery source override |
-ModelRevision | branch, tag, commit | manifest pin | Model source revision override |
-ReuseVenv | switch | off | Keep the existing venv; package updates only |
-LockedVenvAction | Fail, Stop | Fail | Locked-environment policy (see Security) |
install.sh → wan2_installer.py
Every setting is available both as an environment variable and as a
--name=value argument. The shell wrapper validates values,
then delegates to the cross-platform Python installer.
| Variable | Argument | Default | Purpose |
|---|---|---|---|
CUDA | --cuda | cu121 | cu128, cu121, cu118, or cpu |
MODELS | --models | 5b | 5b, 14b, i2v, ltx, or all |
WITH_MANAGER | --with-manager | true | Install ComfyUI Manager |
SKIP_NODES | --skip-nodes | false | Skip the curated custom-node stack |
START | --start | true | Start ComfyUI when done |
PORT | --port | 8188 | Validated inclusive 1–65535 |
LISTEN_ALL | --listen-all | false | Bind 0.0.0.0 |
BASE_PATH | --path | repo directory | Install root; ComfyUI goes in BASE_PATH/ComfyUI |
REUSE_VENV | --reuse-venv | false | Keep the existing venv |
DRY_RUN | --dry-run | false | Print the command plan; no network or filesystem changes |
EXTRA_REQUIREMENTS | --extra-requirements | unset | Explicit, reviewed extra requirements file (never implicit) |
HF_TOKEN | — | unset | Optional gated-model access token |
CUSTOM_WAN_MODEL_REPOSITORY | --model-repository | manifest value | Model source override (owner/repository form enforced) |
CUSTOM_WAN_MODEL_REVISION | --model-revision | manifest pin | Branch, tag, or immutable commit; traversal rejected |
wan2_installer.py also exposes models (refresh
model files only), start, and react (scaffold an
optional status-page frontend) subcommands; every subcommand honors
--dry-run.
Every model file resolves through an immutable commit and a sha256
checksum pinned in the versioned manifest
config/models.json: Wan 2.2 artifacts from
Comfy-Org/Wan_2.2_ComfyUI_Repackaged, the legacy LTX-Video
0.9.x checkpoint from Lightricks/LTX-Video with its
comfyanonymous/flux_text_encoders encoder, and the current
LTX-2.3 stack from Lightricks/LTX-2.3-fp8,
Lightricks/LTX-2.3, Comfy-Org/ltx-2.3, and
Comfy-Org/ltx-2. Both installers verify each download
against its manifest hash (and re-verify existing files), so Windows and
Unix installs stay byte-for-byte consistent and a truncated download can
never sit silently in the tree.
| Selection | Diffusion models | VAE | Text encoder |
|---|---|---|---|
5b |
wan2.2_ti2v_5B_fp16.safetensors |
wan2.2_vae.safetensors |
umt5_xxl_fp8_e4m3fn_scaled.safetensors (shared) |
14b |
wan2.2_t2v_high_noise_14B_fp8_scaled.safetensorswan2.2_t2v_low_noise_14B_fp8_scaled.safetensors |
wan_2.1_vae.safetensors |
|
i2v |
wan2.2_i2v_high_noise_14B_fp8_scaled.safetensorswan2.2_i2v_low_noise_14B_fp8_scaled.safetensors |
wan_2.1_vae.safetensors |
|
ltx |
ltxv-2b-0.9.8-distilled.safetensors (checkpoint, legacy 0.9.x) |
bundled in checkpoint | t5xxl_fp8_e4m3fn_scaled.safetensors |
ltx2 |
ltx-2.3-22b-dev-fp8.safetensors (checkpoint)ltx_2.3_22b_distilled_1.1_lora…bf16.safetensors (LoRA)ltx-2.3-spatial-upscaler-x2-1.1.safetensors (latent upscaler) |
bundled in checkpoint | gemma_3_12B_it_fp4_mixed.safetensors |
all | Every artifact above | ||
ComfyUI/models/ in checkpoints, diffusion_models, vae, and text_encoders — the only destinations the manifest is allowed to name..part staging files with bounded retries.HF_TOKEN enables gated assets. On Windows it is passed to curl through stdin so it never appears in a process command line or log.
"Ready to use" means the nodes your video workflows need are already
installed. Both installers consume the versioned manifest
config/nodes.json: each required custom node is cloned from
its upstream GitHub repository, checked out at a pinned commit,
and its requirements.txt is installed into the project
virtual environment. Skip the stack with -SkipNodes
(Windows) or --skip-nodes=true (Unix).
| Node | Upstream | Purpose |
|---|---|---|
ComfyUI-LTXVideo | Lightricks | LTX-Video 0.9.x nodes — optional for LTX-2, whose pipeline ships in ComfyUI core |
ComfyUI-VideoHelperSuite | Kosinkadink | Video load, combine, and export helpers used by most video workflows |
ComfyUI-KJNodes | kijai | Utility nodes commonly required by Wan and LTX example workflows |
ltx (or all) model
selection to download the pinned LTX-Video checkpoint and text encoder.
The repository is a bootstrap and launch layer around third-party ComfyUI
and Wan assets. There is no application backend, account system, media
store, telemetry service, or hosted inference API — runtime state lives
entirely under your local ComfyUI/ tree.
-Cuda always wins; otherwise display adapters are inspected — both NVIDIA and AMD prompts for a choice, an AMD-only machine selects DirectML automatically.ComfyUI\.venv are detected; the default policy reports them and stops instead of killing anything.sys.prefix is verified before any package changes.pip check gate.The launcher binds 127.0.0.1 unless you pass an explicit flag. Binding all interfaces is a deliberate, visible choice — and it is still not authentication.
Termination is opt-in and limited by normalized executable paths inside the exact venv, process identity, and a known supervisor ancestry check. Unrelated Python, editor, and terminal processes are never selected.
Virtual-environment removal rejects filesystem roots, directories not named .venv, unexpected parents, and reparse points.
HF_TOKEN stays in the process environment. The Windows downloader feeds it to curl via stdin so it never reaches a command line, a log, or a shell history file.
Model source and revision are versioned configuration. Overrides are validated (owner/repository form, no traversal), and generated local requirement snapshots are never installed implicitly.
Validation rejects tracked binary shortcuts, token-bearing URLs, temporary media hosts, personal paths, and machine-identifying values before they can ship.
openvideo-studio/
├── install.ps1 # Windows installer (hardened, lock-aware)
├── install.sh # Linux/macOS wrapper with validation + dry run
├── wan2_installer.py # Cross-platform installer implementation
├── wan2_cli.py # Local ComfyUI launcher (loopback by default)
├── wan2_cli_args.py # Shared argument validators (port, model source)
├── config/models.json # Versioned model source, revision pin, artifact map
├── config/nodes.json # Curated custom-node stack at pinned commits
├── scripts/Installer.Venv.psm1 # Scoped Windows lock detection and safe removal
├── scripts/sanitize_workflows.py # Workflow privacy gate (strips account metadata)
├── scripts/ # Optional maintenance and repair utilities
├── tests/ # Port-contract, lock-policy, and repo validation suites
├── docs/ # Architecture, installers, provenance, testing, releases
├── examples/ # Sanitized example ComfyUI workflows
├── site/ # This page (deployed by GitHub Actions)
└── ComfyUI/ # Local runtime tree; ignored by Git
Everything in scripts/ is opt-in maintenance tooling — none
of it runs during a normal installation.
| Script | Purpose |
|---|---|
fix_custom_nodes.ps1 | Upgrade the Hugging Face stack and patch custom nodes still importing the removed cached_download API |
remove_failed_custom_nodes.ps1 | Remove a supplied list of failed custom-node directories (supports -WhatIf) |
fix_speech_stack.ps1 | Pin a known-good dependency set for speech/TTS custom nodes |
download_qwen.py | Snapshot an auxiliary vision-language model into ComfyUI/models/LLM |
convert_lora_checkpoint.py | Extract LoRA tensors from a PyTorch checkpoint into safetensors |
Export-FolderStructure.ps1 | Export a tree-style inventory of model files for documentation |
sanitize_workflows.py | Check or scrub exported workflow JSON of personal and account metadata |
GitHub Actions in this repository does one thing: deploy this page. There is intentionally no hosted test pipeline — correctness, security, and privacy gates run locally, where a real Windows executable lock and a real filesystem can actually be exercised:
npm run check
That single command runs, in order:
Fail policy is non-destructive, the scoped Stop policy removes only its own process tree, and deletion guards hold — under PowerShell 7 and Windows PowerShell 5.1;ruff linting, Bash syntax checks, the network-free Unix installer dry run, and offline npm lockfile consistency.
Tests resolve any Python 3.10+ interpreter automatically
(py -3.10 → py -3 → python3 →
python), so the suite runs unmodified on Windows, Linux, and
macOS. On non-Windows systems the native lock test is skipped and reported
as skipped — never silently passed.
.venv\Scripts\python.exe is denied
This is normally a Windows executable-image lock, not a permissions
problem. Rerun with the default -LockedVenvAction Fail to see
the scoped process list, close those processes, or explicitly allow
scoped termination with -LockedVenvAction Stop. If an earlier
deletion was interrupted partway, rebuild rather than passing
-ReuseVenv.
Rerun with -ReuseVenv once the new venv and pip exist.
Network installs already use bounded command retries, pip connection
retries, resume attempts, and a longer socket timeout.
Confirm the NVIDIA driver supports the selected PyTorch CUDA build, then inspect the environment directly:
.\ComfyUI\.venv\Scripts\python.exe -c "import torch; print(torch.__version__, torch.version.cuda, torch.cuda.is_available())"
Both usually mean Windows ran out of physical or commit memory while
staging model weights. Escalate in order: free RAM first (WSL/Docker and
editor windows are common consumers) and prefer fp8/fp4 text-encoder
variants over fp16; then launch with
--disable-pinned-memory (via
CUSTOM_WAN_COMFYUI_ARGS) so transfers spill to the page
file; then add --disable-dynamic-vram — dynamic VRAM
streaming (comfy-aimdo) has had issues with quantized video models
independent of free RAM and is actively patched, so keep ComfyUI and
comfy-aimdo updated; on multi-GPU machines add
--cuda-device 0. A different error, "buffer length …
must be a multiple of element size", means a model file is
truncated — re-run the installer, which sha256-verifies and replaces
corrupt files.
With both NVIDIA and AMD cards installed, auto prefers CUDA.
Force the AMD path with npm run wstart:amd (or
--device directml); the first run provisions
ComfyUI\.venv-directml, which downloads several GB. Verify
the DirectML environment directly:
.\ComfyUI\.venv-directml\Scripts\python.exe -c "import torch_directml; print(torch_directml.is_available(), torch_directml.device_name(0))"
If a provisioning run was interrupted, delete
ComfyUI\.venv-directml and select the device again to
rebuild it.
Small, single-purpose pull requests are easiest to review. Keep
loopback-only binding and non-destructive lock handling as defaults, run
npm run check before submitting, and call out
review-sensitive changes (new download hosts, process termination, token
handling, model sources) explicitly.