Scope Controller
Overview
Section titled “Overview”The Scope Controller operator connects TouchDesigner to a Daydream Scope server for real-time AI video generation. It manages the full lifecycle — server launch, pipeline loading, model downloads, WebRTC streaming, and live parameter sync — all from the parameter panel. Video I/O flows through Spout for zero-latency frame sharing between TouchDesigner and Scope.
Key Features
Section titled “Key Features”- One-Click Startup: Pulse
Run Pipelineto automatically launch the server, connect, download models, load a pipeline, and start streaming - 12+ Pipelines: StreamDiffusionV2, Krea Realtime Video, RewardForcing, MemFlow, LongLive, Video Depth Anything, RIFE, and more
- Two Generation Modes: Text-to-Video (prompt-driven) and Video-to-Video (Spout input from TD)
- Live Parameter Sync: Change prompt, seed, denoising steps, or noise scale and see results update in real-time via WebRTC data channel
- Dynamic Parameters: Each pipeline exposes its own set of parameters (resolution, seed, denoising schedule, etc.) that appear automatically on the Parameters page when a pipeline is selected
- Spout Bidirectional: Send video from TD to Scope (Video-to-Video mode) and receive generated output back, both via Spout
- Auto-Detect Install Path: The operator probes common locations for the Scope installation and remembers the path across sessions
Requirements
Section titled “Requirements”- Daydream Scope Server: Must be installed locally. Set
Install Pathon the Settings page to the directory containingpyproject.toml. The operator will also auto-detect common install locations on first placement - GPU: Pipelines require varying amounts of VRAM (1GB—32GB depending on pipeline). VRAM usage is shown on the Settings page once connected
- Spout: Windows only. Spout must be available for video I/O (status shown on the Settings page under Hardware)
- uv: The
uvpackage manager must be available in your system PATH to launch the server subprocess
Input/Output
Section titled “Input/Output”Inputs
Section titled “Inputs”The operator accepts one wired input but video input for Video-to-Video mode is received via Spout, not through the wired connection. Connect a Spout Out TOP in your TD network to send frames — the operator’s Name parameter on the Pipeline page controls the Spout sender/receiver naming.
Outputs
Section titled “Outputs”The operator has two outputs. Video output from Scope is received via a built-in Spout In TOP. Add a Syphon Spout In TOP to your network or wire from the operator’s output to view the generated video. The Spout sender name follows the pattern {Name}out, where Name is the base name set on the Pipeline page (defaults to the operator’s node name).
Spout Naming Convention
Section titled “Spout Naming Convention”The Name parameter on the Pipeline page sets a base name for bidirectional Spout I/O:
- TouchDesigner to Scope: TD broadcasts as
{Name}in— Scope reads this as its input source - Scope to TouchDesigner: Scope broadcasts as
{Name}out— TD reads this via the built-in Spout In TOP
For example, if Name is set to “scope1”, TD sends on “scope1in” and receives on “scope1out”. These names are configured once when the stream starts via the WebRTC offer.
Usage Examples
Section titled “Usage Examples”Quick Start with Run Pipeline
Section titled “Quick Start with Run Pipeline”- On the Settings page, enter the path to your Scope installation in
Install Path(or let it auto-detect) - Set
HostandPortif not using defaults (localhost:8000) - On the Pipeline page, select a pipeline from the
Pipelinemenu - Pulse
Run Pipeline— the operator will launch the server, connect, download models if needed, load the pipeline, and start streaming automatically - Watch the
Statusfield for progress updates through each step - Add a
Syphon Spout InTOP to your network and set it to receive from{Name}out(e.g., “scope1out”)
Manual Step-by-Step Setup
Section titled “Manual Step-by-Step Setup”- On the Settings page, toggle
Launch Serverto On (or start Scope externally) - Toggle
Activeto On — the operator connects and begins status polling - On the Pipeline page, select a pipeline from the
Pipelinemenu - Check
Modelsstatus — if “not downloaded”, pulseDownload Modelsand wait - Pulse
Load Pipelineand wait for thePipelinestatus to show “loaded” - Pulse
Start Streamto begin WebRTC streaming - On the Parameters page, enter a
Promptand adjustWeight
Video-to-Video Mode
Section titled “Video-to-Video Mode”- Set up a
Spout OutTOP in your TouchDesigner network - On the Pipeline page, set the
Nameparameter so that{Name}inmatches your Spout Out TOP’s sender name (e.g., if your Spout Out sends as “scope1in”, setNameto “scope1”) - Set
Modeto “Video-to-Video” on the Parameters page - Start the stream — Scope will process your TD video output through the selected pipeline
Live Parameter Tweaking
Section titled “Live Parameter Tweaking”- While streaming, go to the Parameters page
- Adjust
Prompt,Weight, or any pipeline-specific dynamic parameter (seed, denoising steps, noise scale, resolution, etc.) - Changes are sent to Scope in real-time via the WebRTC data channel (rate-limited to ~10Hz to avoid flooding)
- Toggle
Auto Push Paramsto On for automatic sync, or pulsePush Paramsmanually
Dynamic Pipeline Parameters
Section titled “Dynamic Pipeline Parameters”When you select a pipeline, the operator fetches its JSON schema from the server and dynamically creates TouchDesigner parameters on the Parameters page. These parameters vary per pipeline and can include:
- Resolution (width, height)
- Seed and noise scale
- Denoising steps (as comma-separated values)
- LoRA weights and model-specific settings
- Boolean toggles for pipeline features
Parameters are categorized as either “load params” (applied when the pipeline loads) or “runtime params” (pushed live via the data channel while streaming). When not streaming, pulsing Push Params reloads the pipeline with the current load parameters.
Best Practices
Section titled “Best Practices”- Start with Passthrough: Use the “Passthrough” pipeline (no VRAM required) to verify your Spout setup works before loading a heavy model
- Check VRAM: Pipeline VRAM requirements are shown in the pipeline menu labels (e.g., “StreamDiffusionV2 (20GB)”). Check your available VRAM on the Settings page before loading
- Use Run Pipeline: The one-click
Run Pipelinebutton handles the entire startup sequence including retries and error recovery — prefer it over manual steps - Prompt Weight: Start with a weight of 1.0 and adjust down toward 0.0 for subtler effects, or up toward 2.0 for stronger prompt influence
- Unique Spout Names: If running multiple Scope Controller instances, give each a unique
Nameon the Pipeline page to avoid Spout sender collisions
Troubleshooting
Section titled “Troubleshooting”- “disconnected” server status: Verify the Scope server is running and the
Host/Porton the Settings page are correct. ToggleActiveoff and on to retry - Pipeline load timeout: Some pipelines take time to load large models. Check the Scope server console for progress. Ensure you have enough VRAM for the selected pipeline
- No Spout output: Verify the stream is active (check
Pipelinestatus shows “streaming”). The Spout sender only registers while actively streaming. Look for{Name}outin your Syphon Spout In TOP - Video-to-Video not working: Ensure your Spout Out TOP’s sender name matches
{Name}inexactly. The Spout I/O names are locked in when the stream starts — if you changeName, stop and restart the stream - “Models not downloaded”: Pulse
Download Modelson the Pipeline page and wait for the download to complete. Large models (20GB+) may take several minutes - Stream stops unexpectedly: Check the Scope server console for errors. Pulse
Start Streamto reconnect. If the server crashed, useRun Pipelineto restart everything - Auto-run fails at “Waiting for server”: The server may take 10—15 seconds to start. If it times out, check that
Install Pathis correct and thatuvis available in your system PATH - Dynamic parameters missing: If the Parameters page only shows Prompt, Weight, and Mode, ensure you are connected to the server (
Activeis On) and have selected a pipeline. PulseRefresh Schemasto re-fetch pipeline definitions
Parameters
Section titled “Parameters”Parameters
Section titled “Parameters”op('scope_controller').par.Prompt Str Text prompt for generation
- Default:
"" (Empty String)
op('scope_controller').par.Promptweight Float Weight for prompt blending
- Default:
0.0- Range:
- 0 to 2
- Slider Range:
- 0 to 2
op('scope_controller').par.Autopush Toggle Automatically push parameter changes to server
- Default:
False
op('scope_controller').par.Pushparams Pulse Push current parameter values to server
- Default:
False
Pipeline
Section titled “Pipeline”op('scope_controller').par.Runpipeline Pulse One-click: launch server, connect, load pipeline, start stream
- Default:
False
op('scope_controller').par.Autorunstatus Str - Default:
"" (Empty String)
op('scope_controller').par.Loadpipeline Pulse Load selected pipeline on server
- Default:
False
op('scope_controller').par.Unloadpipeline Pulse Unload current pipeline
- Default:
False
op('scope_controller').par.Loadedpipeline Str - Default:
"" (Empty String)
op('scope_controller').par.Refreshschemas Pulse Re-fetch available pipeline schemas from server
- Default:
False
op('scope_controller').par.Downloadmodels Pulse Download models for selected pipeline
- Default:
False
op('scope_controller').par.Modelsstatus Str - Default:
"" (Empty String)
op('scope_controller').par.Startstream Pulse Start WebRTC stream (connects to server, begins generation)
- Default:
False
op('scope_controller').par.Stopstream Pulse Stop WebRTC stream
- Default:
False
op('scope_controller').par.Spoutname Str Base name for Spout I/O. TD broadcasts as {name}in (Scope reads), Scope broadcasts as {name}out (TD reads). Active only while streaming.
- Default:
"" (Empty String)
Settings
Section titled “Settings”op('scope_controller').par.Serverstatus Str - Default:
"" (Empty String)
op('scope_controller').par.Pipelinestatus Str - Default:
"" (Empty String)
op('scope_controller').par.Serverversion Str - Default:
"" (Empty String)
op('scope_controller').par.Active Toggle Enable connection and status polling
- Default:
False
op('scope_controller').par.Serverhost Str Scope server hostname or IP
- Default:
"" (Empty String)
op('scope_controller').par.Serverport Int Scope server port
- Default:
0- Range:
- 1 to 65535
- Slider Range:
- 1 to 65535
op('scope_controller').par.Pollinterval Float Status polling interval in seconds
- Default:
0.0- Range:
- 0.5 to 30
- Slider Range:
- 0.5 to 30
op('scope_controller').par.Connect Pulse Connect to server and fetch pipeline list
- Default:
False
op('scope_controller').par.Launchserver Toggle Launch Scope server as subprocess
- Default:
False
op('scope_controller').par.Serverpath Str Path to Scope installation directory (where pyproject.toml lives)
- Default:
"" (Empty String)
op('scope_controller').par.Serverargs Str Additional CLI arguments for the server (e.g. --reload)
- Default:
"" (Empty String)
op('scope_controller').par.Restartserver Pulse Restart the Scope server (clears all sessions)
- Default:
False
op('scope_controller').par.Vramgb Str - Default:
"" (Empty String)
op('scope_controller').par.Spoutavailable Str - Default:
"" (Empty String)
Changelog
Section titled “Changelog”v0.2.02026-03-26
- Simplify Spout params: collapse 3 params into single Spoutname with derived {name}in/{name}out naming - Deactivate Spout TOPs until streaming starts to prevent sender name collisions - Auto-detect Scope install path on first placement with ChatTD config persistence - Add onParServerpath and onParSpoutname callbacks - Remove BOM
- refactor polling from run()-based reschedule chain to single persistent TDAsyncIO coroutine - split _fetch_status into _fetch_status_sync (executor) and _apply_status_result (main thread) - remove _poll_tick and _reschedule_poll - add _poll_task_id for task tracking and cancellation
v0.1.12026-02-24
- Add one-click Run Pipeline auto-run state machine (check path, launch server, activate, fetch pipelines, check/download models, load pipeline, start stream) - Add Runpipeline pulse and Autorunstatus read-only par - Reorganize parameter pages: move Prompt/Mode to dedicated Parameters page - Always send prompts to server (remove conditional skip) - Send all dynamic pipeline params at runtime (remove is_load_param filter) - Add execute DAT for server subprocess cleanup on TD exit - Rename PARAM_PAGE to match new Parameters page
- Add operator source files - Add requirements.txt
- Initial scope_controller structure
- Initial commit