DOT Tox Updater
The DOT Tox Updater handles authentication and distribution of LOPs operator .tox files from the DOTsimulate registry. Sign in once with your DOTsimulate account and the operator will track which operators you have installed, flag anything with a newer version available, and let you download updates or new operators without leaving TouchDesigner.
Key Features
Section titled “Key Features”- Browser-based OAuth 2.1 PKCE sign-in — no passwords are stored inside TouchDesigner
- OS-native credential storage: Windows DPAPI encrypted file, macOS Keychain — credentials are machine-locked and cannot be transferred to another computer
- Automatic update check on load (throttled to once every 24 hours)
- Operator menu shows installed version alongside registry version, with a
*prefix on any entry that has an update waiting - One-click bulk download of all pending updates via Download All Updates
- Show in Folder opens the download directory in Finder or Explorer for the selected operator
Requirements
Section titled “Requirements”- An active DOTsimulate account with a valid subscription
- An internet connection to reach
context-mcp.dotsimulate.com(authentication) anddownloads.lopstudio.dev(registry and downloads) - A LOPs installation with a configured basefolder — operators are downloaded to the
operators/subfolder of that basefolder
Input/Output
Section titled “Input/Output”Inputs
Section titled “Inputs”None. The operator communicates externally over HTTP using your DOTsimulate credentials.
Outputs
Section titled “Outputs”None. Downloaded .tox files are written directly to your LOPs operators folder on disk. The Tox Updater page shows read-only status fields reflecting authentication state, subscription status, and available update counts.
Usage Examples
Section titled “Usage Examples”Signing In
Section titled “Signing In”- Place a DOT Tox Updater operator in your network.
- On the Tox Updater page, pulse Sign In.
- Your default browser opens to the DOTsimulate sign-in page. Complete sign-in there.
- On success the browser shows a confirmation page — return to TouchDesigner.
- The Auth Status field updates to
Authenticatedand your account email appears in the User field.
Checking for Updates
Section titled “Checking for Updates”- After signing in, pulse Check for Updates.
- The Operator menu populates with every available operator. Entries show the version in the registry and a checkmark if you are already on the latest version. Any operator with a newer version than what is installed on disk is prefixed with
*and shows the version transition, for example:*token_count (1.0.0 → 1.1.0). - The Available Updates field shows the total count of operators with updates ready to download.
Downloading a Single Operator
Section titled “Downloading a Single Operator”- Use the Operator menu to select the operator you want.
- Pulse Download Selected.
- The
.toxfile is saved to your LOPs operators folder. Check the Status field or the Logger for progress messages.
Downloading All Updates at Once
Section titled “Downloading All Updates at Once”- After running Check for Updates, pulse Download All Updates.
- All operators flagged with
*are downloaded in parallel. Progress is shown in the Status field as each download completes.
Locating the Downloaded File
Section titled “Locating the Downloaded File”- Select an operator from the Operator menu.
- Pulse Show in Folder.
- Finder or Explorer opens to the folder containing the downloaded
.tox, with the file selected if it exists on disk.
Signing Out
Section titled “Signing Out”Pulse Sign Out to clear your stored credentials from the OS keychain. The Auth Status field returns to Not signed in. You can sign in again at any time.
Best Practices
Section titled “Best Practices”- Run Check for Updates before a session where you intend to use new operators. The operator auto-checks every 24 hours, but a manual check pulls the freshest registry data immediately.
- After downloading updates, reload or replace the affected operators in your TouchDesigner project to pick up the new
.toxfiles. - If you work on multiple machines, sign in separately on each — credentials are machine-locked by design and cannot be shared between computers.
Troubleshooting
Section titled “Troubleshooting”Sign In button does nothing after pulsing
A previous authentication attempt may still be in progress. Check the Auth Status field. If it shows Waiting for browser... but the browser never opened, reload the operator or restart TouchDesigner and try again.
“Please sign in first” appears when checking or downloading
The Auth Status field will show Not signed in or Session expired. Pulse Sign In to re-authenticate, then retry.
“Subscription required” error when downloading
Your account’s subscription is not active. The Subscription field will show Inactive. Check your subscription status at the DOTsimulate website.
The Operator menu shows “Check for updates first” after launch If the operator has never run a registry check on this machine, the menu starts empty. Pulse Check for Updates to populate it. If a previous check was run, the cached list loads automatically on startup within a few seconds.
“No LOPs basefolder configured” error The download path is read from your ChatTD configuration. If that path is not set, the operator cannot determine where to save files. Configure the basefolder in ChatInstaller and try downloading again.
Download completes but operator does not update in TouchDesigner
Downloaded .tox files are written to disk but do not hot-reload into running projects. After downloading, replace or reimport the affected operators in your network manually.
Parameters
Section titled “Parameters”Tox Updater
Section titled “Tox Updater”op('tox_updater').par.Status Str Current status of the operator
- Default:
"" (Empty String)
op('tox_updater').par.Lopsversion Str Installed LOPs version and update status
- Default:
"" (Empty String)
op('tox_updater').par.Signin Pulse Open browser to sign in with your DOTsimulate account
- Default:
False
op('tox_updater').par.Signout Pulse Sign out and clear stored credentials
- Default:
False
op('tox_updater').par.Authstatus Str Current authentication status
- Default:
"" (Empty String)
op('tox_updater').par.Username Str Signed in user email
- Default:
"" (Empty String)
op('tox_updater').par.Subscription Str Subscription status
- Default:
"" (Empty String)
op('tox_updater').par.Checkupdates Pulse Check the registry for available operators and updates
- Default:
False
op('tox_updater').par.Availableupdates Str Number of operators with updates available
- Default:
"" (Empty String)
op('tox_updater').par.Updatesonly Toggle Filter operator list to only show operators with available updates
- Default:
False
op('tox_updater').par.Downloadop Pulse Download the selected operator
- Default:
False
op('tox_updater').par.Showinfolder Pulse Open the download folder for the selected operator
- Default:
False
op('tox_updater').par.Downloadall Pulse Download all available operator updates
- Default:
False
op('tox_updater').par.Downloadlops Pulse Download the latest LOPs distribution package
- Default:
False
op('tox_updater').par.Downloadproject Pulse Download the selected project file
- Default:
False
Changelog
Section titled “Changelog”v0.3.12026-03-27
- Prefer par.Version for LOPs version, fall back to par.Txversion for older installs
v0.3.02026-03-27
- Add LOPs version display from par.Txversion - Add distribution update detection from registry - Add Download LOPs Update button - Add Projects section with project menu and download - Add Updates Only toggle to filter operator menu - Rename Registry section to Updates - Add distribution install type to path_resolver
v0.2.02026-03-13
- -add show in folder
- Add _get_installed_versions() with 3-tier priority: live opfam, manifest.json, filesystem - Wire _process_registry and _load_from_cache to use _get_installed_versions - Remove duplicate download log from Downloadop
- Update OAuth callback HTML styling to match brand theme - Dark background with subtle purple tint - Monospace typography throughout - Sharp corners (8px radius) - Purple accent for success, orange for errors
- Add 24h auto-check for updates with race condition prevention - Add registry cache persistence to disk - Add on_complete callback to Checkupdates() - Add on_authenticated callback to Signin() - Load cache on init for instant GetOpInfo() availability - Add timestamp tracking for last update check (DPAPI/Keychain)
- Add GetOpInfo() public API for operator info with has_update flag - Add DownloadOperatorAsync() public API with callbacks for async downloads
- Remove Callback Server and Debug parameter sections - Remove public API bloat (DownloadTox, GetOperatorInfo, etc.) - Privatize OnOAuthCallback and GetAuthStatus - Keep minimal public API: UI pulses + IsAuthenticated
- Add random port selection for OAuth callback server - Check port availability before binding - Auto-stop server after successful authentication - Prevents port conflicts with multiple tox_updater instances
- Add DownloadOperatorAsync with callback support
- Add public API for external operator queries
- Add 0.1.0 changelog
- Initial release v0.1.0
v0.1.02025-01-29
Initial Release
Authentication
- OAuth 2.1 PKCE flow - Browser-based authentication with no client secrets required
- Secure token storage - Uses OS-native credential storage (Windows DPAPI, macOS Keychain)
- Machine-locked credentials - Tokens cannot be copied between computers or users
- Session management - Sign in, sign out, and automatic session expiry handling
- Subscription validation - Checks user subscription status for download access
Registry & Downloads
- Registry integration - Fetches available operators from dotsimulate download server
- Update detection - Compares installed versions against registry to identify available updates
- Operator menu - Populated dropdown with all available operators and update indicators
- Single download - Download individual selected operators
- Bulk download - Download all available updates with one click
- Smart path resolution - Automatically resolves correct install location based on install_type
Callback Server
- WebServer DAT integration - Built-in callback server on configurable port (default 31337)
- State verification - CSRF protection via OAuth state parameter
Technical
- Zero pip dependencies - Authentication uses only stdlib (urllib, ctypes, subprocess, hashlib)
- TDAsyncIO integration - Non-blocking registry fetches and downloads when available
- DotLOPUtils base class - Standardized parameter management and logging
- Platform abstraction - Unified API with platform-specific secure storage backends