Skip to content

Scope Controller

v0.2.0New

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.

  • One-Click Startup: Pulse Run Pipeline to 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
  • Daydream Scope Server: Must be installed locally. Set Install Path on the Settings page to the directory containing pyproject.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 uv package manager must be available in your system PATH to launch the server subprocess

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.

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

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.

  1. On the Settings page, enter the path to your Scope installation in Install Path (or let it auto-detect)
  2. Set Host and Port if not using defaults (localhost:8000)
  3. On the Pipeline page, select a pipeline from the Pipeline menu
  4. Pulse Run Pipeline — the operator will launch the server, connect, download models if needed, load the pipeline, and start streaming automatically
  5. Watch the Status field for progress updates through each step
  6. Add a Syphon Spout In TOP to your network and set it to receive from {Name}out (e.g., “scope1out”)
  1. On the Settings page, toggle Launch Server to On (or start Scope externally)
  2. Toggle Active to On — the operator connects and begins status polling
  3. On the Pipeline page, select a pipeline from the Pipeline menu
  4. Check Models status — if “not downloaded”, pulse Download Models and wait
  5. Pulse Load Pipeline and wait for the Pipeline status to show “loaded”
  6. Pulse Start Stream to begin WebRTC streaming
  7. On the Parameters page, enter a Prompt and adjust Weight
  1. Set up a Spout Out TOP in your TouchDesigner network
  2. On the Pipeline page, set the Name parameter so that {Name}in matches your Spout Out TOP’s sender name (e.g., if your Spout Out sends as “scope1in”, set Name to “scope1”)
  3. Set Mode to “Video-to-Video” on the Parameters page
  4. Start the stream — Scope will process your TD video output through the selected pipeline
  1. While streaming, go to the Parameters page
  2. Adjust Prompt, Weight, or any pipeline-specific dynamic parameter (seed, denoising steps, noise scale, resolution, etc.)
  3. Changes are sent to Scope in real-time via the WebRTC data channel (rate-limited to ~10Hz to avoid flooding)
  4. Toggle Auto Push Params to On for automatic sync, or pulse Push Params manually

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.

  • 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 Pipeline button 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 Name on the Pipeline page to avoid Spout sender collisions
  • “disconnected” server status: Verify the Scope server is running and the Host/Port on the Settings page are correct. Toggle Active off 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 Pipeline status shows “streaming”). The Spout sender only registers while actively streaming. Look for {Name}out in your Syphon Spout In TOP
  • Video-to-Video not working: Ensure your Spout Out TOP’s sender name matches {Name}in exactly. The Spout I/O names are locked in when the stream starts — if you change Name, stop and restart the stream
  • “Models not downloaded”: Pulse Download Models on 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 Stream to reconnect. If the server crashed, use Run Pipeline to 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 Path is correct and that uv is 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 (Active is On) and have selected a pipeline. Pulse Refresh Schemas to re-fetch pipeline definitions
Prompt Header
Prompt (Prompt) op('scope_controller').par.Prompt Str

Text prompt for generation

Default:
"" (Empty String)
Weight (Promptweight) op('scope_controller').par.Promptweight Float

Weight for prompt blending

Default:
0.0
Range:
0 to 2
Slider Range:
0 to 2
Mode (Mode) op('scope_controller').par.Mode StrMenu

Generation mode

Default:
"" (Empty String)
Menu Options:
  • Text-to-Video (text)
  • Video-to-Video (video)
Controls Header
Auto Push Params (Autopush) op('scope_controller').par.Autopush Toggle

Automatically push parameter changes to server

Default:
False
Push Params (Pushparams) op('scope_controller').par.Pushparams Pulse

Push current parameter values to server

Default:
False
Run Pipeline (Runpipeline) op('scope_controller').par.Runpipeline Pulse

One-click: launch server, connect, load pipeline, start stream

Default:
False
Status (Autorunstatus) op('scope_controller').par.Autorunstatus Str
Default:
"" (Empty String)
Pipeline Header
Pipeline (Pipeline) op('scope_controller').par.Pipeline StrMenu
Default:
"" (Empty String)
Menu Options:
  • StreamDiffusionV2 (20GB) (streamdiffusionv2)
  • LongLive (20GB) (longlive)
  • Krea Realtime Video (32GB) (krea-realtime-video)
  • RewardForcing (20GB) (reward-forcing)
  • MemFlow (20GB) (memflow)
  • Passthrough (passthrough)
  • Video Depth Anything (1GB) (video-depth-anything)
  • Controller Visualizer (controller-viz)
  • RIFE (rife)
  • Scribble (scribble)
  • Grayscale (gray)
  • Optical Flow (optical-flow)
Load Pipeline (Loadpipeline) op('scope_controller').par.Loadpipeline Pulse

Load selected pipeline on server

Default:
False
Unload Pipeline (Unloadpipeline) op('scope_controller').par.Unloadpipeline Pulse

Unload current pipeline

Default:
False
Loaded (Loadedpipeline) op('scope_controller').par.Loadedpipeline Str
Default:
"" (Empty String)
Refresh Schemas (Refreshschemas) op('scope_controller').par.Refreshschemas Pulse

Re-fetch available pipeline schemas from server

Default:
False
Download Models (Downloadmodels) op('scope_controller').par.Downloadmodels Pulse

Download models for selected pipeline

Default:
False
Models (Modelsstatus) op('scope_controller').par.Modelsstatus Str
Default:
"" (Empty String)
Stream Header
Start Stream (Startstream) op('scope_controller').par.Startstream Pulse

Start WebRTC stream (connects to server, begins generation)

Default:
False
Stop Stream (Stopstream) op('scope_controller').par.Stopstream Pulse

Stop WebRTC stream

Default:
False
Spout Header
Name (Spoutname) 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)
Server (Serverstatus) op('scope_controller').par.Serverstatus Str
Default:
"" (Empty String)
Pipeline (Pipelinestatus) op('scope_controller').par.Pipelinestatus Str
Default:
"" (Empty String)
Version (Serverversion) op('scope_controller').par.Serverversion Str
Default:
"" (Empty String)
Connection Header
Active (Active) op('scope_controller').par.Active Toggle

Enable connection and status polling

Default:
False
Host (Serverhost) op('scope_controller').par.Serverhost Str

Scope server hostname or IP

Default:
"" (Empty String)
Port (Serverport) op('scope_controller').par.Serverport Int

Scope server port

Default:
0
Range:
1 to 65535
Slider Range:
1 to 65535
Poll Interval (s) (Pollinterval) 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
Connect (Connect) op('scope_controller').par.Connect Pulse

Connect to server and fetch pipeline list

Default:
False
Server Header
Launch Server (Launchserver) op('scope_controller').par.Launchserver Toggle

Launch Scope server as subprocess

Default:
False
Install Path (Serverpath) op('scope_controller').par.Serverpath Str

Path to Scope installation directory (where pyproject.toml lives)

Default:
"" (Empty String)
Extra Args (Serverargs) op('scope_controller').par.Serverargs Str

Additional CLI arguments for the server (e.g. --reload)

Default:
"" (Empty String)
Restart Server (Restartserver) op('scope_controller').par.Restartserver Pulse

Restart the Scope server (clears all sessions)

Default:
False
Hardware Header
VRAM (GB) (Vramgb) op('scope_controller').par.Vramgb Str
Default:
"" (Empty String)
Spout Available (Spoutavailable) op('scope_controller').par.Spoutavailable Str
Default:
"" (Empty String)
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