The manual.

Everything the app does, in the order you'll meet it. The app also explains itself — a first-run tour, one-time tips, and F1 for every shortcut — so this page is for reading ahead, linking someone to a feature, or understanding what a button really does before a show.

Getting started

Install from the download page and open the app — there's no import step. The Recent tab merges TouchDesigner's own recent-files list with the launcher's history, so your projects are already there. A first-run tour drives the app while it narrates, then a short setup wizard covers theme, .toe file association, the companion TOX, and tray behavior. Both rerun anytime from Help.

Select a project and the launcher reads the exact TD build it was saved with — straight from the file, via Derivative's toeexpand — and highlights the matching install. If that build isn't on the machine, a Download button fetches the exact installer from Derivative and runs it for you. With the file association set, double-clicking a .toe anywhere routes through the launcher with a 5-second auto-launch countdown; any keypress or click cancels it.

When a double-clicked project needs a build you don't have, the launcher asks once what it should do about it — and remembers the answer under Settings → Opening a project from Finder/Explorer: open with the latest build, the closest one, a specific build you pin, or always stop and let you pick. Only the auto-launch path uses it; picking a version yourself in the app is untouched.

The app keeps itself current: a quiet update check a few seconds after startup, plus About → Check for updates. The companion TOX has its own release channel, so a new TOX reaches you without an app update — and vice versa.

macOS: builds aren't notarized yet, so after copying to Applications clear the quarantine flag once — xattr -cr "/Applications/TDX Launcher Ultra.app". Launches and in-app updates are unaffected after that.

The tabs

TabWhat it holds
RecentMerged TD + launcher recents. Gallery of project cards with hover-playing previews, tags, the versions drawer, and the version panel on the right. Everything launches from here.
CurrentTouchDesigner sessions running right now — including ones opened outside the launcher, found by process scan. An inspector, not a launcher: see Running sessions.
TemplatesStarter .toe files in your own order (Ctrl/⌘+↑/↓ reorders). Each position gets a shortcut — Ctrl/⌘+1…9 launches that template from anywhere in the app — and the tab has one default TD version (Latest follows your newest install).
PaletteTouchDesigner's factory palette for the selected build, your Documents/Derivative/Palette, plus any folders you add. Drag a .tox straight into a TD network. The pinned Toolbox sits on top.
FNSToolsStore, installer and global configurator for the FNSTools toolkit — tick the tools a project should have and install them straight into it. Free, no session required to download. See FNSTools.
PatreonBrowse .tox components from creators you support and load one into a running session. Needs your Patreon session cookie (Settings → Patreon explains where it lives and why a cookie — Patreon's official API can't list post attachments).

Tab / Shift+Tab cycle the tabs, or Alt/⌥+1…6 jumps to one. The whole app is keyboard-drivable — F1 lists everything.

Each tab keeps its own search. The toolbar's search box filters the list you are looking at and nothing else — a query typed on Palette stays on Palette, and a tab holding an active filter is marked in the tab bar so a stale query never reads as an empty tab. The Current tab also carries a badge with the number of sessions running right now.

Quick launch

The launcher window itself is one keystroke away from anywhere — the main global hotkey (default Ctrl/⌘+Shift+D) brings it up over whatever you're doing, TD fullscreen included. For the times you'd rather type a name than browse, press the Quick Launch hotkey (default Alt/⌥+Shift+D) and a small search overlay appears over everything. One input, everything reachable:

ResultMatched onEnterAlso
Projectname, path, tagsLaunch the head with its detected buildCtrl+Enter → TouchPlayer
Running sessionname, pathFocus its window
Component (.tox)name, category, creatorPlace into the running sessiondrag the row straight into a TD network
TemplatenameNew project from it
CommandverbRun it> filters to commands only
Tool commandlabel, help textRun it in the session that offers it? filters to tool commands only

An empty query shows running sessions, recent projects and the app commands; typing fuzzy-matches across everything, field-aware — a name hit outranks a category hit outranks a path hit. Executed queries are remembered: Alt+↑ / Alt+↓ cycle back through what you ran before, shell style, and typing anything starts a fresh draft again.

Filter tokens

  • > — commands only. Verb-first, per session: Focus, Save, Snapshot, Relaunch, Kill — plus the app's own actions and New default project. Destructive commands arm on the first Enter — the row turns red and a second Enter fires; any other key disarms. Nothing destructive on a single keypress, ever.
  • ?tool commands only: the actions components inside your running sessions have published.
  • = (leading) — components only. Bare = browses the whole library grouped by where things live; =midi searches just components.
  • /x — filter by place: a palette folder, Toolbox category, Patreon creator, or /templates. Combines with = and search words.
  • #x — filter by project tag. Running sessions keep their project's tags, so #show surfaces a live show too.

All five prefix characters are customizable in Settings → Hotkeys — the overlay's placeholder and hints follow whatever you pick. Three global hotkeys are configurable independently: the main window, Quick Launch, and the main window jumped to the Palette tab. The first two are bound by default; the Palette one is opt-in.

Tool commands

Components in a running project can publish their own actions to the palette — "Set BPM", "Record 2 seconds", "Toggle the strobe" — and the launcher runs them over the companion bus. They ride the normal command list and own the ? prefix, carry a TOOL badge, and show the tool's own one-line help under the label. Nothing to set up: a session carrying a tool that registers commands contributes them the moment it is running.

A command can declare arguments. They render as ghost chips after the label and fill in as values arrive — either through a short prompt flow (typed values in the input, menus and toggles as pick rows) or inline, by typing them after the name: ? rec 2 runs the recorder with seconds=2 and fires immediately when every other argument has a default. The tool validates values before its own code sees them, so a bad number or a missing required argument refuses the run rather than half-doing it.

When several sessions offer the same command they merge into one row with a session-count badge. The run goes to the session the palette was summoned over — whichever TouchDesigner window you were last in — and when that is ambiguous you pick the session from a list ( opens that picker on any tool command). The same tool loaded in three projects is three targets, not three rows.

Command favourites

Pin commands to make them float to the top of every list. Pin them from:

  • Quick-launch overlay — the on any command row (or Ctrl+D / ⌘+D after selecting a row)
  • Settings → Quick Launch — a list of every command with checkboxes for favourite status
  • Palette Commands tab (in TouchDesigner with the companion v0.21.0+) — the on hover

Favourites sort first in the quick-launch and the Palette Commands tab, and rank higher in typed queries — so the second time you need something is muscle memory. The list travels with settings export/import, so your favourites move to a new machine with you.

Writing a tool? Publishing commands is a decorator on the method and one announce() call from your component's init — the full contract is docs/fns-command-registry.md in the TDXLPP repository. Commands from the FNSTools toolkit show up here automatically.

Try the overlay in the browser demo →

Project versions

TouchDesigner projects accumulate copies of themselves: incremental saves (Project.2.toe, Project.3.toe, …), backups in Backup/, and CrashAutoSave.*.toe after a crash. The Recent tab folds all of them into one family card per project with a ⑂ N badge. Launch on the card always fires the head (Project.toe) — never a guessed variant; if you last opened a different copy, the card says so. A chip appears when a crash autosave newer than the head exists.

Grouping is deterministic — filesystem conventions only, nothing stored — and toggles with View → Group project versions (V). Click the badge for the drawer:

ActionEffect
LaunchLaunch that exact file, TD build detected from it
SelectPut it in the picker to inspect or pick a version
DuplicateCopy any row into a fresh Name.N.toe — the same numbering TD's incremental save uses, so it folds straight into the family
Restore…Make a copy the new head. The current head is preserved first as the next free increment — nothing is overwritten or deleted
RecycleTick copies (never the head) and move them to the OS trash; the footer shows how much space the copies hold

Restore is the "I kept working from Backup/Project.30.toe" fix: promote the backup, and the family has one unambiguous head again. Duplicate as new version on any project's context menu starts a family from a single-file project.

Running sessions

The Current tab shows what a running project is — TD version, PID, launched here or opened externally, uptime — rather than a version picker, since the version is already decided.

ActionEffect
FocusBring the TD window to the front
ExploreReveal the .toe in the file manager
WatchHand the session to the Heartbeat watchdog
Relaunch…Confirm dialog — pick the TD version there, optionally killing the current process first
KillTerminate the TD process (with confirmation)

Accidental-kill insurance: a session the launcher started that ends — killed or crashed — stays as a dimmed ended row. One click relaunches it with the build it last ran, no confirm needed (its process is already gone); Dismiss removes the row. Stale rows live for the current launcher run only.

Project media & sidecar

Each project card can carry an icon, a hero still, and a hover-playing preview clip. The gallery reads them from a media folder beside the .toe — first match wins:

  1. media_dir from the sidecar, if set
  2. preview/ — what the companion TOX writes
  3. {stem}_media/, {stem}.media/, media/, gallery/, _media/

Supported: png jpg jpeg webp gif bmp · mp4 webm mov m4v avi. Select the project and thumbnails appear under the version header — Browse for fullscreen, Folder to open it in the file manager. Clips stream only while hovered.

The sidecar (MyProject.tdxlu.json)

Everything the launcher knows about a project lives in one plain-JSON file next to the .toe — no database, travels with the project:

{ "version": 1, "tags": ["show/live", "client/acme"], "title": "Optional display title", "description": "Short blurb", "hero": "preview/hero.png", "media_dir": "preview", "media": [ { "path": "extra/cover.png", "kind": "image", "caption": "Cover" } ], "gpu": { "monitor": 1 }, "windows": { "apply_on_load": true, "items": [ { "path": "/perform", "display": 1, "justify_to": "specifydisplay", "size": "fill", "open": true } ] } }

Folder contents merge with explicit media entries; omit hero and the first folder image is used. You can edit the file by hand — or author it from inside TouchDesigner: the companion's Media page edits the project's title, description, tags and gallery hero, saved to the sidecar. Use Preview As Hero captures a still and assigns it in one click. Launcher-managed fields are never touched.

gpu and windows are written by the Displays & GPU controls. Every write to this file — from the launcher, from the companion, by hand — merges: keys one side does not recognise pass through untouched, so the two can never clobber each other.

Media browser

Every movie, image, audio and geometry file a running project references, in one list. It ships as the FNS_MediaBrowser package from the FNSTools store: install it and the launcher shows it as a side panel on the Current tab, while the same panel lives inside the package itself — a complete tool with no launcher running. Selecting a reference shows a live preview of the referencing operator and what the file actually is: resolution, duration, fps, and whether it carries audio — read from what the operator already decoded, not guessed from the filename.

  • Replace — point any reference at a different file. Nothing is copied and nothing is saved; it's the reference that changes.
  • Missing files — a missing-only filter shows every reference whose file is gone. Per-row Replace fixes one; Locate missing… fixes them in bulk — point at the folder the files really live in (a moved drive, a restored backup) and every reference whose filename is found there is relinked in one go.
  • Unused — media files sitting in the project folder that no operator references: the dead weight a backup or a Collect would ship without telling you.
  • Sync timeline — stretch the timeline to exactly fit a clip and lock its playback to it. Clips running on their own Time COMP offer the choice of local or global timeline.

Nothing in the media browser saves the project behind your back — relinks land in the live session, and you decide when to save.

Companion TOX

The launcher can only start TouchDesigner. TDXLauncherUtility.tox is a small component that lives in your project and listens on a local TCP bus — it's what lets the launcher talk to a session that's already running. It's fully self-contained: detected and driven over its own connection, nothing else to install.

Getting it into a project

It ships inside the installer. On first run it's copied into your Palette and pinned in the Toolbox as Launcher Utility. Any project needs it dragged into the root network once — the Companion bar on the Current tab offers a drag handle when a session doesn't have it. To stop repeating the drag, put the TOX in TouchDesigner's startup file (Edit → Preferences → General) — then everything you build from scratch has it from the first save.

What it unlocks

ActionWhat happens
SaveSave the .toe in place, from the launcher or the phone
SnapshotCapture preview/preview.png plus the project icon — the gallery picks both up automatically
RecordRecord a hover-preview clip (preview/preview.mp4, up to 30 s). Paths are stored relative, so moving the project doesn't orphan them
AutosaveArm a save timer inside the session — needs the free FNS_Autosave package, see Autosave
Collect…Consolidate external media into the project — needs the FNS_Collect package, see Collect
Load tox / From URL / From packageDrop components into the live network editor from disk, GitHub, any URL, or a package index — see Components from anywhere
Media / SidecarThe media browser (from the FNS_MediaBrowser package) and sidecar authoring pages, usable inside TD with no launcher running
HeartbeatThe crash watchdog listens for its TCP pulses Pro
Tool commandsActions published by components in the session, runnable from the quick-launch palette

When a running session carries an older companion than the launcher holds, the Companion bar offers a one-click in-place update — parameter values you've set survive the reload. The TOX also has its own release channel, so updates reach you without waiting for an app release.

Using Embody/Envoy? Projects built with that optional toolkit for AI-assisted TouchDesigner development carry a .mcp.json — the launcher detects it and shows an MCP panel with the Envoy bridge's status and port, and can use it as a last-resort transport for companion actions if the bus is ever down. Without it, nothing changes — the companion never needs it.

Palette tabs in TouchDesigner

With the companion (v0.21.0+) loaded, TouchDesigner's own Palette Browser (Alt+L) grows two extra tabs next to the stock palette: TDXLU and Patreon. The tabs are served by the launcher on a localhost control server and powered by a Web Render TOP inside a small generic registry (FNS_PaletteRegistry) that any FunctionStore tool can publish a panel into.

The TDXLU tab

Your Toolbox and the FNSTools shelf, plus a Commands sub-tab listing every command your tools announced to the session's FNS_CommandRegistry — the same list the quick-launch ? prefix shows. Each component row has a button that places it straight into the current Network Editor pane; URL tools and FNS packages not yet on disk show a and download into the cache on first use.

When the launcher carries a newer companion than the session runs, the tab shows a one-click Update button — parameter values you've set survive the reload.

The Patreon tab

Browse .tox components from the creators you support (or merely follow) and load one into the selected running session. A Hide locked toggle filters out posts you don't have access to — it's remembered per session. The creator crumb bar is sticky so the way back never scrolls away. The Patreon login stays in the launcher; TD never sees the cookie.

How it works

The launcher serves the page on its localhost control server and hands the URL to each session over the companion bus. The tab strip belongs to FNS_PaletteRegistry — a small, reusable registry that any FNS tool can contribute a native panel to. The two launcher tabs share one Chromium (CEF) process and swap pages via a route parameter; the stock palette is untouched, and TD's native drag still works on the first tab. The browser only runs while one of the launcher's tabs is showing, so there's no performance cost when you're not using them.

Pin selected COMP

Select a COMP in the session's network editor, optionally pick a Toolbox category, and click Pin selected COMP on the Toolbox sub-tab. The launcher's companion saves it as a .tox into your TouchDesigner palette (a TDXLU Toolbox folder, visible in TD's own palette), and pins it as a local Toolbox tool. The same file is never pinned twice, and existing files are never overwritten — a file that already exists in the folder is left untouched.

Session bar

Above the footer, a row of one-shot controls. Left side: Save (writes the .toe in place), Snapshot (captures preview/preview.png and the project icon), Record (records preview/preview.mp4, up to 30s), and an Autosave chip showing the current state (e.g. "Autosave 10m" or "Autosave off") and toggling it. Right side: an optional health readout (fps, cook time in ms, dropped frames, GPU memory used/total) when the launcher's Settings → Performance monitor is on — the health line turns amber when dropped frames climb.

Session sub-tab

The session’s tools, each with a live one-line summary, each opening full-height inside the tab with a Session › <tool> crumb to return to the overview:

  • Collect & Save — Scan the project's external media files, untick what to leave behind, and collect with live progress.
  • Media — Show missing media references; re-root the relative paths that a folder move broke.
  • Git Pro — Current branch, change count, a message field, and Commit all (saves the project first, by default).
  • Backup Pro — Display what a backup to your configured folder would copy, and Back up now with a click.
  • Phone Remote — The link as a QR code to scan right off the palette, a one-click toggle to enable, and the list of COMPs your phone's Control page exposes; tap to add more via the network browser.
  • Windows — The session's OS windows exactly as the launcher lists them (main window, torn-off panes named by content, Perform window) — focus, minimize, restore each, bring all forward, or save/apply/clear the project's window layout.

Commands: arguments and inline run

Commands can declare keyword arguments. They render as ghost chips after the label and can be filled through a short prompt flow — or typed inline. For example, if a recorder command declares seconds, typing rec 2 in the search field fills it and fires immediately when the rest is covered by defaults. The registry validates values by declared style before the tool's method is called, so a bad number or a missing required argument refuses the run with a named error rather than half-doing it.

In the Commands sub-tab, the favourite star appears on hover over any command; pinned favourites stay visible. Favourites rank first in the list and carry a ★ Favourites group at the top.

Turn it off

Disable the feature in Settings → Companion → Palette tabs in TouchDesigner, or per-session on the companion's Palette parameter page (which also holds Install / Remove / Reload / Open Palette Browser buttons). Without a running launcher the tabs show a hint instead of content. The feature is part of the paid tier, like the other companion features.

Design record: Read the technical architecture and implementation details in docs/palette-tabs.md in the project repository.

Autosave

TouchDesigner has no autosave. FNS_Autosave adds one: a timer that runs inside the session and saves the project for you. It is a free package in the FNSTools store — install it and the launcher grows an Autosave button on the Current tab's Companion bar (off until you turn it on, showing the interval while it runs). The timer itself is the package’s, so it keeps saving with the launcher closed.

Set the interval in minutes and pick what a save means:

Save modeWhat it writes
TouchDesigner SaveThe same save TD's own menu does, so it follows your Increment Filename when Saving and Copy to Backup Folder preferences — with increment on, a new numbered .toe each time
Overwrite the open .toeAlways writes back to the file you're working in, whatever those preferences say

Two skips keep it out of a show's way — only save when something changed and skip while the project is in Perform Mode — plus a Save now that ignores both. A save stalls the frame while the .toe is written, so the interval is yours to pick; the dialog shows when the last save landed, or why the last scheduled one was skipped.

The settings live on the companion's own Autosave parameter page, so the whole feature works from inside TouchDesigner with no launcher running. Needs companion 0.10.0 or newer — the Companion bar offers the in-place update if the session is on an older one.

Collect

The "gather everything before the gig" button. Collect scans the running project for external audio, movie, image and geometry references, copies the files into {project}/collected/<category>/, relinks every reference relative, then saves.

  • Dry-run first — the scan plan is a checklist grouped by media type. Untick a row to leave that file and its references alone, or toggle a whole type (video / audio / image / geometry / other) at once.
  • Expression refs — a reference like app.samplesFolder+'/Map/Banana.tif' is collected by freezing the evaluated file into a constant relative path. Opt out per run, or globally with the Freeze Expression Refs toggle.
  • Never touched — references already inside the project folder, bind/export-driven parameters, and Embody-managed files. Originals are never moved or deleted.

Collect ships as the FNS_Collect package from the FNSTools store. It works entirely inside TouchDesigner — its own panel UI carries Scan, Collect & Save, the freeze toggle, and the clickable scan plan, with no launcher needed — and when TDXLU is running it announces the same actions into the Current view. Pair it with the media browser's Unused scan to see what you'd be shipping that nothing references.

FNSTools

The FNSTools tab is a store, an installer and a settings editor for the FNSTools toolkit — the same catalog as tools.functionstore.xyz/get, without leaving the launcher. It's part of the free tier.

Launcher capabilities

Some packages announce their commands to the running session, and TDXLU renders them where they belong — in the Current view and its right-click menu. A handful get purpose-built UI rather than a plain button: FNS_Autosave (free) arms the autosave timer, FNS_Collect drives the Collect checklist, FNS_MediaBrowser is the media browser, and FNS_Remote serves the phone, multi-touch included.

Each is a complete TouchDesigner tool in its own right — it runs from inside TD with the launcher closed, and its panels are its own. Installing one alongside TDXLU simply lights up the session view as well; the launcher itself ships none of these features, so an install is what adds them, and an uninstall is what takes them away.

Store

The current release rendered by category, each package with its description, version and docs link. What the target session already has is pre-checked, with installed ✓ and 1.1.0 → 1.2.0 update badges; a dot marks what's already mirrored on this machine. Tick the tools the project should have, then:

ActionWhat happens
InstallDownloads what's missing (sha256-verified), then drives the toolkit's own installer inside the running session over the companion bus. No toolkit in the project yet? The one-drop bootstrap goes in first
Download onlyStocks the local store without touching any session — no TouchDesigner needed at all. The store is machine-wide, so TD's own installer reads it later
Copy Textport scriptThe one-line paste for a machine or session the launcher can't reach
Refresh storeMirror the whole release locally, for working offline
The selection is the project's tool set. Installing makes the project match what you ticked — so anything you untick is removed. The confirm step spells out both the adds and the removals before you commit to it.

Settings

The toolkit's global, per-tool configuration, edited from the launcher:

  • With a session running — the launcher talks to the toolkit's own settings service, so you get real parameter metadata: menus, ranges, validated writes that TouchDesigner persists itself. Parameters driven by a bind or an expression are shown but stay read-only.
  • With nothing running — the config file is edited directly (atomically, with a .bak kept). Tools pick up their section the next time they load.

On the Palette tab

The Palette tab grows an FNSTools shelf next to the Toolbox: every package as a standalone component, grouped by category. ◆ means it's on this machine — drag it into a network or place it into a session with ; ◇ downloads on click; ◑ flags a store copy that's gone stale.

Tools installed this way can also publish actions to the quick-launch palette — see Tool commands. Settings → FNSTools sets the release bucket URL, in case you run a mirror or a staging bucket instead of the official one.

Phone Remote

One tap on the header's 📱 Phone button enables LAN access and shows a QR — scan it and the remote opens on your phone (same Wi-Fi, token-gated). Add it to the home screen once and it installs as a standalone app; the pairing survives restarts.

  • Every session is a tab — live or ended. The open tab shows the session's facts, a heartbeat chip when the watchdog is armed, a live perf readout (fps / cook / drops / GPU / CPU / RAM), and Focus / Save / Snapshot / Record / Relaunch / Kill. Ended sessions relaunch with one tap; + Launch opens any recent project, so the phone is a remote of the whole launcher.
  • Hold-to-confirm — destructive taps (Kill, and live-session Relaunch) arm on press-and-hold with a filling bar and a haptic buzz; release early to cancel.
  • Live parameters — the exposed controls with their parameter pages as tabs, search, −/+ nudge steppers on integers, and a ★ pin that floats your key faders to the top (remembered per project). Expose more COMPs from the phone itself via a lazy network-tree browser.
  • Client link — a second pairing code for operators and clients: only the controls you authored, no session actions, no launching, no browsing. Enforced by the server — every other API route is refused for that token — not merely hidden in the page. Regenerate invalidates both links at once.
  • Yours to run — Settings holds the port (changing it rebinds a running server live), the LAN toggle, and Stop server.

Try the remote in the browser demo →

Phone multi-touch

The phone is also a multi-touch surface for the network — served by the FNS_Remote package from the FNSTools store, which hosts the page from inside TouchDesigner and therefore works with the launcher closed. Install it, drop it into a project, turn Phone Touch on, and every finger arrives as CHOP channels — several phones at once:

OutputChannels / rows
null_toucht<N>x, t<N>y, t<N>force, t<N>active per touch slot, plus touchcount and clients
table_clientsOne row per connected phone: address, screen size, user agent

Y is flipped by default so 0 is the bottom of the phone screen — matching TD's bottom-up UV convention. Positions are 0–1 unless Normalize is off. Three buttons build the receiving operators for you (Select CHOP, Select DAT, or one receiver COMP holding both), all referencing the op.FNS_REMOTE global shortcut so they keep resolving wherever you drag them. Touch only, by design — motion sensors would drag TLS certificates into a live rig; multi-touch works over plain HTTP everywhere.

Toolbox Pro

A favorites shelf pinned at the top of the Palette tab, in categories you define. It lives in the launcher config, so it's the same set no matter which palette folders are scanned. A tool is one of:

KindSourceBehavior
LocalAny .tox path on diskDrag straight into TD; flagged (missing) if the file vanishes
URL / GitHubDirect .tox URL or owner/repo[#Asset.tox]Fetched into the cache on pin; ⟳ re-fetches, so a GitHub tool tracks its latest release
Packagepip spec for the configured indexInstall into a running project via From package…

Pin with + Tool, from any palette .tox, or just drop a file onto the Toolbox — onto a category row to pin it there. Tools carry an optional label and notes. A Load .tox into bar names the running session with the companion and sends the selected component into its network editor; every row also gets a quick hover action doing the same.

Components from anywhere

From URL…

  • Any direct .tox URL on any host — object storage, CDN, LAN address; presigned query strings are fine.
  • owner/repo or a GitHub URL resolves the latest release asset; add #Asset.tox to pick a specific one.
  • Downloads are cached keyed by URL + filename; redirects followed (10 hops), 512 MiB cap. The URL must contain the .tox in its path — share links that hide the filename aren't resolved yet.

From package…

Browses a configurable package index (defaults to PyPI with a tdp- name filter — clear it for a small curated index) or takes a custom uv / git+https spec, installs with uv pip install into the project's .venv, resolves the package's ToxFile, and loads it. Requires uv on PATH and a .venv next to the .toe — the Companion bar shows env status and Ensure env sets one up via TDPyEnvManager.

Both dialogs remember successful adds and offer them back as clickable Recent entries.

Git & backup Pro

Git panel

Changes and history, diffs, stage/commit, branch, pull/push — with a GitHub PAT in Settings for private remotes. Creating a repo seeds a TouchDesigner-aware .gitignore, so Backup/, increments and crash autosaves stay out of the first commit.

Backup panel

Project folder ↔ USB or any synced folder, with include/exclude globs and a max file size. Backup, restore, sync — no deletes, ever. Or connect Google Drive, Dropbox, OneDrive or Box directly: a one-time rclone download, sign in via your browser, then the service is a backup destination.

Heartbeat watchdog Pro

A tray watchdog for installations: the companion sends TCP pulses, the launcher listens. On a stall it can relaunch the project automatically and send an SMTP email alert — same on relaunch, so you know the show restarted before anyone calls. Multi-project: watch several sessions at once. Arm it from the session's Watch action or the Heartbeat panel; the phone remote shows the armed state, last pulse and restart count.

Settings & shortcuts

  • Settings, paged — ten categories in a sidebar with a search box that finds a setting by the name of its control. Every "open Settings" button in the app lands on the section it means.
  • Rebindable keys — tab switching, search, launching the startup file, the view toggles, folder reveal and the README keys are all editable, each with Reset. Template slots stay fixed on Ctrl/⌘+1…9 — one binding per slot.
  • Three global hotkeys — the main window, Quick Launch, and the main window on the Palette tab; each with its own combo and on/off toggle.
  • Tray & login — close-to-tray, quit-after-launch, start at login (minimized to the tray).
  • Opening from Finder/Explorer — what to launch a double-clicked .toe with when its exact TD build isn't installed: latest, closest, a pinned build, or always ask.
  • FNSTools — the release bucket the FNSTools store reads from.
  • Settings export/import — carry the whole configuration to another machine.

Displays & GPU Pro

For machines driving a show off more than one graphics card. Two separate things, often confused: GPU affinity binds a TouchDesigner process to one card, and window placement puts that process's windows on the displays attached to it. You want both — a window straying onto another GPU's desktop copies pixels between cards, which is the cost affinity exists to avoid.

GPU affinity — set at launch

Right-click a project → GPU affinity → pick a monitor. The launcher passes TouchDesigner's own flag when it starts the process (-gpuformonitor, or -gpubusid for an exact card set by hand in the sidecar). Windows only, TouchDesigner 2022.20000 and up — the menu does not appear otherwise, nor on a machine with a single display.

It applies on the next launch: a process can only be bound at start. TouchDesigner counts monitors left→right, bottom→top — not the order Windows lists them — so confirm a binding took in the Monitors DAT's affinity column.

Window placement — set in the session

TouchDesigner has no command-line option for which display a window opens on; placement lives in Window COMP parameters. So the companion TOX does it from inside the running session — reading and writing display, justification, offset, size, borders and always-on-top, and opening or closing a window.

Save the current arrangement into the sidecar and the companion restores it shortly after the project loads, once TouchDesigner's own startup Window Placement has run. A layout can be kept on file without being restored (apply_on_load: false). Placement parameters driven by an expression are never overwritten — they are reported back as locked instead. Saves cover project-level windows only: a loaded palette contributes dozens of internal popup windows that nobody wants in a sidecar.

Free & Pro

The free tier is a finished launcher, not a demo: launching with build detection, versions, tags, the quick-launch palette, the palette browser, session control, companion basics (save, snapshot, record), the Phone Remote, window management and the performance readout, loading components from disk, URLs and packages, and the FNSTools store and installer — including the launcher capabilities its packages add to the Current view. Pro adds Toolbox, Patreon import, git, backup, the heartbeat watchdog, and multi-GPU display control.

Unlock with any paid Patreon tier or a license key (pay once, lifetime updates, up to three computers) — or start the 14-day Pro trial from inside the app, no account, no card. Cancelling never locks the app; you drop back to the free tier. The full split →