OpenVideo Studio

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.

Windows Linux macOS Wan 2.2 LTX-Video Curated nodes CUDA 12.8 / 12.1 / 11.8 AMD DirectML CPU fallback MIT licensed

What it does

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.

Local by default

The launcher binds to 127.0.0.1. Nothing leaves your machine unless you explicitly bind to all interfaces.

Non-destructive

If your virtual environment is in use, the installer lists the scoped blockers and stops — process termination is strictly opt-in.

Pinned model source

Model downloads resolve through an immutable upstream revision recorded in a versioned manifest, with explicit overrides.

Resumable downloads

Large PyTorch and model downloads use bounded retries, resume support, and partial-file staging.

Dry-run first

The Unix installer prints its full command plan without cloning, installing, or downloading anything.

Privacy-gated repo

The validation suite rejects tracked files that contain personal paths, machine names, tokens, or account metadata.

Requirements

ComponentRequirement
Operating systemWindows 10/11, current Linux, or macOS
Python3.10 recommended (3.10+ supported by the test suite)
GitRequired for ComfyUI and Manager clone/update
curlRequired by the Windows model downloader (bundled with Windows 10/11)
ffmpegRequired for normal video workflows
GPUNVIDIA CUDA GPU recommended; AMD GPUs supported on Windows via DirectML (selectable at install and launch); CPU supported but slow
DiskSubstantial free space for PyTorch, ComfyUI, models, and outputs

Quick start

Windows (PowerShell)

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.

AMD GPUs on Windows (DirectML)

.\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.

Linux

chmod +x install.sh
CUDA=cu128 MODELS=5b WITH_MANAGER=true START=false ./install.sh

macOS or any machine without an NVIDIA GPU

CUDA=cpu MODELS=5b START=false ./install.sh

Validate the plan before installing (network-free)

./install.sh --cuda=cu128 --models=5b --start=false --dry-run=true

Start ComfyUI

# 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
Network exposure. --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.

Launcher deep dive

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 / variablePurpose
--host / CUSTOM_WAN_COMFYUI_HOSTBind address (default 127.0.0.1)
--port / CUSTOM_WAN_COMFYUI_PORTTCP port, validated inclusive 1–65535 (default 8188)
--listen-allBind 0.0.0.0 (crosses the host network boundary)
--device / CUSTOM_WAN_COMFYUI_DEVICEauto, cpu, gpu, rocm, or directml
--pathProject root containing the ComfyUI/ checkout
CUSTOM_WAN_COMFYUI_CHECKOUTOverride the checkout location (absolute, or relative to the project root)
CUSTOM_WAN_COMFYUI_ARGSExtra 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.

Installer options

Windows — install.ps1

OptionValuesDefaultPurpose
-Cudacu128, cu121, cu118, directml, cpucu128PyTorch backend (directml = AMD/Intel GPUs on Windows)
-Models5b, 14b, i2v, ltx, ltx2, all5bModel selection
-WithManagerswitchoffInstall/update ComfyUI Manager
-SkipNodesswitchoffSkip the curated custom-node stack
-StartswitchoffStart ComfyUI after a successful install
-Port1–655358188ComfyUI port
-ListenAllswitchoffBind to 0.0.0.0
-PyVersionlauncher version3.10Windows Python launcher selection
-HfTokentokenHF_TOKEN envOptional gated-model access (sent to curl via stdin, never on the command line)
-ModelRepositoryowner/repositorymanifest valueModel delivery source override
-ModelRevisionbranch, tag, commitmanifest pinModel source revision override
-ReuseVenvswitchoffKeep the existing venv; package updates only
-LockedVenvActionFail, StopFailLocked-environment policy (see Security)

Linux / macOS — install.shwan2_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.

VariableArgumentDefaultPurpose
CUDA--cudacu121cu128, cu121, cu118, or cpu
MODELS--models5b5b, 14b, i2v, ltx, or all
WITH_MANAGER--with-managertrueInstall ComfyUI Manager
SKIP_NODES--skip-nodesfalseSkip the curated custom-node stack
START--starttrueStart ComfyUI when done
PORT--port8188Validated inclusive 1–65535
LISTEN_ALL--listen-allfalseBind 0.0.0.0
BASE_PATH--pathrepo directoryInstall root; ComfyUI goes in BASE_PATH/ComfyUI
REUSE_VENV--reuse-venvfalseKeep the existing venv
DRY_RUN--dry-runfalsePrint the command plan; no network or filesystem changes
EXTRA_REQUIREMENTS--extra-requirementsunsetExplicit, reviewed extra requirements file (never implicit)
HF_TOKENunsetOptional gated-model access token
CUSTOM_WAN_MODEL_REPOSITORY--model-repositorymanifest valueModel source override (owner/repository form enforced)
CUSTOM_WAN_MODEL_REVISION--model-revisionmanifest pinBranch, 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.

Model selections and provenance

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.

SelectionDiffusion modelsVAEText 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.safetensors
wan2.2_t2v_low_noise_14B_fp8_scaled.safetensors
wan_2.1_vae.safetensors
i2v wan2.2_i2v_high_noise_14B_fp8_scaled.safetensors
wan2.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
allEvery artifact above

Download behavior

Licensing. The project's MIT license covers its own code and documentation only — it grants no rights to model weights, encoders, VAEs, ComfyUI, or generated media. Review the upstream model card and terms before use or redistribution; the project intentionally records a delivery source, not an endorsement.

Curated node stack

"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).

NodeUpstreamPurpose
ComfyUI-LTXVideoLightricksLTX-Video 0.9.x nodes — optional for LTX-2, whose pipeline ships in ComfyUI core
ComfyUI-VideoHelperSuiteKosinkadinkVideo load, combine, and export helpers used by most video workflows
ComfyUI-KJNodeskijaiUtility nodes commonly required by Wan and LTX example workflows
Pinning policy. Node revisions are immutable commits, updated only through reviewed pull requests — the same discipline applied to model revisions. Custom nodes are third-party code executing with your user's permissions; the pin tells you exactly which code that is. Pair the LTX nodes with the ltx (or all) model selection to download the pinned LTX-Video checkpoint and text encoder.

Architecture

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.

Installation flow

ValidateArguments, paths, port range, model manifest schema, and repository/revision formats are checked before anything runs.
Select the compute backend (Windows)An explicit -Cuda always wins; otherwise display adapters are inspected — both NVIDIA and AMD prompts for a choice, an AMD-only machine selects DirectML automatically.
Lock preflight (Windows)Processes using ComfyUI\.venv are detected; the default policy reports them and stops instead of killing anything.
Clone or update ComfyUIShallow clone on first run; fast-forward pull afterward. Tracked local edits are preserved in a named Git stash before updating.
Create or reuse the venvA fresh environment by default; the interpreter's sys.prefix is verified before any package changes.
Install PyTorch + requirementsBackend-matched torch index, ComfyUI requirements, optional Manager, and audio/ONNX support packages — with retry, resume, and a mandatory pip check gate.
Download modelsSelected artifacts from the pinned manifest revision, resumable, into validated destinations.
Verify and startPython/torch state is printed with CUDA or DirectML availability; ComfyUI starts on loopback only if requested.

Security and privacy model

Loopback by default

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.

Scoped process control

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.

Guarded deletion

Virtual-environment removal rejects filesystem roots, directories not named .venv, unexpected parents, and reparse points.

Secret handling

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.

Pinned supply chain

Model source and revision are versioned configuration. Overrides are validated (owner/repository form, no traversal), and generated local requirement snapshots are never installed implicitly.

Repo hygiene gates

Validation rejects tracked binary shortcuts, token-bearing URLs, temporary media hosts, personal paths, and machine-identifying values before they can ship.

Trust boundaries to keep in mind

Repository layout

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

Optional utilities

Everything in scripts/ is opt-in maintenance tooling — none of it runs during a normal installation.

ScriptPurpose
fix_custom_nodes.ps1Upgrade the Hugging Face stack and patch custom nodes still importing the removed cached_download API
remove_failed_custom_nodes.ps1Remove a supplied list of failed custom-node directories (supports -WhatIf)
fix_speech_stack.ps1Pin a known-good dependency set for speech/TTS custom nodes
download_qwen.pySnapshot an auxiliary vision-language model into ComfyUI/models/LLM
convert_lora_checkpoint.pyExtract LoRA tensors from a PyTorch checkpoint into safetensors
Export-FolderStructure.ps1Export a tree-style inventory of model files for documentation
sanitize_workflows.pyCheck or scrub exported workflow JSON of personal and account metadata

Validation — local-first by design

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:

Tests resolve any Python 3.10+ interpreter automatically (py -3.10py -3python3python), 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.

Troubleshooting

Access to .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.

Large PyTorch download fails

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.

CUDA is unavailable

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())"

Memory errors: os error 1455 or hostbuf_file_reader_read

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.

The AMD GPU is not being used

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.

Contributing and community

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.