Working in TDXCollab
TDXCollab feels like sharing one project. It is not: each of you runs your own TouchDesigner, with your own copy of the Collab Zone, and TDXCollab carries your edits from one copy to the others. Most surprises in a session come from forgetting that. This guide is the way of thinking that keeps the copies in step; the docs say what each control does.
Six ideas
- Two copies, not one project. Every partner has their own project, files, devices and TouchDesigner build. A path syncs; the file it names does not. Read →
- Only what is shown is watched. TDXCollab looks at the networks your network editors show. A change somewhere nobody looks is not sent, unless you mark it Always Sync. Read →
- Edits travel, actions do not. A changed parameter, wire or operator reaches everyone. A key press, a click on a panel and a tool's own state stay on the side where they happened. Read →
- Every machine cooks for itself. Pixels, samples and geometry are never sent: each side computes them, and code in the zone runs on every computer. Read →
- One thing, one person at a time. Two people on the same parameter end with whichever the host handled last, and Ctrl+Z undoes your side's last change, whoever made it. Read →
- Copies drift, and the host decides. When copies end up different, TDXCollab says so, and the host picks whose version everyone takes. Nothing replaced is lost. Read →
Before you read on
Have two TouchDesigners connected first: the Quick start does that in a few minutes. The checklist at the end is this guide in a dozen lines.
Two TouchDesigners, two copies
There is no shared project in a TDXCollab session. Each of you has a project open in your own TouchDesigner, on your own computer, with a Collab Zone in it. When you change something in your zone, TDXCollab sends that change, and your partners' TouchDesigners make the same change to their copies. Everything outside the zone is yours alone.
What that means
- Your copy is a real copy. It cooks on your GPU, saves into your
.toe, and keeps working when the session ends. Your partner's is the same, on their side. - The copies only stay alike if they started alike. Live edits keep two equal copies equal; they do not make two different ones equal. Start from the same copy: join as a copy of the host's zone, or send one with Sync Zone (Starting from the same copy).
- What happened while you were apart is not replayed. Edits made while disconnected are not sent later.
Files stay on each computer
A file parameter syncs as the path you typed. The file itself never travels: a movie, an image, a
.tox, a font, a Python module on disk, a DAT synced to a file. On your partner's computer that
path names their file, or nothing.
- Use paths relative to the project folder, and give every project folder the same files: a
shared folder, a synced drive, or the same git repository.
movies/intro.movworks on every machine that has it;C:/Users/you/Desktop/intro.movworks on one. - External .tox paths are kept local by default, because a
.toxmay exist on one machine only. If everyone has the same files, switch External .tox to Sync in the TDXCollab window (Kept local by default). - A DAT synced to a file holds what the file on each computer says, so two copies can differ without anyone editing anything.
- Fonts are each machine's own. A Text TOP set to a font your partner lacks renders in another face on their side.
Each machine is its own
- Devices: cameras, audio interfaces, MIDI, DMX, serial and the other hardware operators keep every parameter local by default. Each machine picks its own device.
- TouchDesigner itself: its build, preferences, plugins, Python paths and licence. A Non-Commercial licence caps TOPs at 1280 by 1280, a plugin only you have makes an operator type your partner's TouchDesigner does not know, and a newer build may have operators an older one lacks. TDXCollab leaves out what the other side cannot make and says so.
- Use the same TDXCollab release and the same TouchDesigner build on every side. A partner on another one is let in but warned about (Versions).
References that leave the zone
An expression, bind or export that points outside the zone (parent() above it, a sibling of the
zone, an absolute path, a shortcut to something elsewhere) is synced as written. On each side it
then means that side's own operator there, or nothing. Keep references inside the zone, and bring
what the zone needs into it.
Keeping something to yourself
Not everything should be shared: a path only your machine has, your own devices, a tool that needs your palette. Keep Local and local tools is how each side keeps what is its own.
Only what is shown is watched
TDXCollab does not scan your whole project every frame. It watches the networks your network editors show, so its cost grows with what you are looking at, not with the size of the project. The price is a simple rule: a change in a network nobody is looking at is not seen, and so not sent.
What is watched
- The networks your network editors show inside the zone, focused or not: the operators in them, their parameters, flags, wires and DAT text. With split panes, the first four networks shown at once completely (Split panes).
- The Collab Zone COMP's own parameters, wherever your editor is.
- Animation COMPs, edited in the Animation Editor, wherever your panes are.
- The project's FPS and timeline.
- Whatever you mark Always Sync, wherever your editors are.
A network is watched one level deep: the operators you see. A parameter on a COMP inside one of those operators belongs to the network inside it, which you are not showing.
What slips past
These change the zone without a network editor showing the change:
- A component's own UI. A palette tool, a widget, a container with controls: its knobs are parameters on a COMP inside it. You turn them from its viewer, its panel or its parameter dialog while your editor shows the network around it, so nothing is watching.
- A floating parameter window of an operator in a network you have since left.
- Scripts, Execute DATs, expressions and tools that change an operator in a network nobody shows.
- Creates and deletes inside an always-synced COMP while no editor shows that COMP.
The copies then differ without anyone noticing, until both of you open that network and the drift check reports it.
Always Sync
For anything you change from somewhere other than its own network, drop it on the TDXCollab chip and choose Always Sync: an operator, a COMP and what is directly inside it, or one parameter. It is then sent wherever your editors are, and the drift check compares it too (Always Sync).
The everyday case: before you play a component from its panel or viewer, mark it Always Sync.
The check follows the same rule
The drift check also compares only what both of you view. No warning means the networks you both looked at match, not the whole zone. A warning right after you both enter a network can be about a difference made long before (What the check sees). Sync Zone is the one thing that covers the whole zone, seen or not.
The habit
Work with the network open. When you change something you cannot see in a network editor, ask whether it is marked Always Sync.
Edits travel, actions do not
TDXCollab sends what changed in the network: what an operator is, its parameters, wires, flags and text. It does not send what you did to get there, and it does not send what the network computes. Ask of anything you do: did it change the network, or did it only happen on my side?
| Travels | Stays on your side |
|---|---|
| A parameter you type, drag or pick from a menu | The key you pressed, and what a hotkey tool does besides editing the network |
| Operators, wires, flags, colours, comments, moves | Your cursor, selection and view (shown to partners, not taken over unless they choose Sync options) |
| Text and Table DAT text | A Field's text, a List's or Table's selection, a panel's scroll |
A Button's or Slider's value (value0) | Where a Slider's handle sits: it does not move when value0 arrives |
| Pulses | Undo history |
| Play, pause and the current frame | TOP pixels, CHOP samples, SOP geometry, audio |
Keyboard
Typing into a parameter or a DAT's editor is an edit and syncs. So does any TouchDesigner shortcut that changes the network: creating, deleting, aligning, wiring. A hotkey that runs a tool runs only on the side where the key was pressed: what the tool then changes in a network you show is sent like any edit, and nothing else it does (its own state, its UI, other networks) reaches your partners.
Ctrl+Z is yours too: see Two people, one thing.
Mouse and panels
Dragging nodes, wires and parameter values is editing. Clicking in a panel is not, unless the
panel keeps what you did in a parameter: a Button's and a Slider's value live in value0, which
syncs; a Field's text, a List's selection and a panel's scroll live in the panel and are not sent.
What a panel changes in other operators is sent if those operators are watched, which, for a
component's own controls, usually means Always Sync.
Your pointer, selection and the part of the network you see are presence: your partners see them drawn over their network editor, and take them over only if they switch on Synced Panes, Sync Selection or Sync Pan and Zoom (Following each other).
Tools that edit the network
A tool that adds operators or changes parameters in a network you show is synced like your own
edits, its hidden helpers too. To keep a tool to yourself, tag it TDXCollab:ignore before it lands
in the zone (Local tools).
Every machine cooks for itself
Nothing a network produces is sent: no pixels, no samples, no geometry, no audio. Each side cooks its own copy, so the same network gives the same result as far as the inputs are the same. They often are not.
What differs between machines
- Inputs from outside: cameras, microphones, MIDI, streams, files: each machine's own.
- Time: the timeline's play, pause and frame sync, but each machine runs on its own clock and drops its own frames. Anything driven by the clock or by real time drifts a little apart.
- The machine: GPU, fonts, licence limits, plugins.
- Frozen data: a locked TOP, CHOP or SOP keeps the data it froze on your side. The Lock flag syncs, its contents do not. A locked Text or Table DAT's text does.
Outputs stay outputs
A value that is an output (a parameter bound to a CHOP channel or to a component's attribute) is left to each side to compute: TDXCollab syncs the source and lets the output follow.
Code runs on every computer
Python in the zone (Execute DATs, callbacks, expressions, extensions) runs in every partner's TouchDesigner, because every partner has the zone. Think about where its effects land:
- What reacts to the network runs everywhere. A pulse is sent, so what it triggers happens on every side. An expression or a callback that follows a parameter follows it on every copy.
- What reacts to you runs where you are. A key, a click on a panel, your MIDI controller: their callbacks fire on your side only, and only what they change in the watched network travels.
- Effects outside TouchDesigner multiply. A script in the zone that sends OSC, writes a file, calls a web address or drives DMX does it once per computer in the session.
- A DAT a running network writes into gets its own content on each side, and shows as a difference. Keep it outside the zone, or mark it Not checked (Differences nobody made).
This is also why Full Edit is a matter of trust: Python a partner puts into the zone runs in your TouchDesigner (Roles).
Two people, one thing
An edit takes a moment to arrive: a few frames on one machine, roughly 0.1 to 0.3 seconds across the internet. Within that moment two people can change the same thing without seeing each other's change yet. TDXCollab settles it, but the easiest conflict is the one you avoid.
The last one the host handled wins
Two people changing the same parameter, DAT text, colour, flag or position at the same moment both end with the change the host handled last. With Pars Read-Only on (the default), a parameter a partner is dragging turns read-only on your side until a second after their last change, so you do not overwrite each other mid-drag (Edits at the same moment).
The same operator
Operators are matched by their path. Two people renaming, deleting or creating the same operator within that moment can end with different networks. After it, the second person works on the already-changed operator and nothing diverges. The drift check reports it; Resolve Drift sets it straight (Same operator, same moment).
Undo is yours
Ctrl+Z undoes your side's last change, which may be one a partner made, and the result is sent on like any edit. Undo history is not shared. Before pressing it, check that the last change on your side is the one you mean, or undo by hand.
Taking turns
- Split the work. One person per operator, or per part of the zone, avoids nearly every conflict. Say what you are about to take on.
- See where everyone is. Partner cursors, selections and the activity list show who is where, and what they touched last (Seeing each other).
- Point instead of describing. Ping Here marks a spot for everyone; Summon Everyone Here brings every partner's network editor to yours (Ping and Summon).
- Give a role, not a rule. A partner who should only play with values gets Adjust Parameters; a watcher gets Observe. What their role does not cover stays on their side (Roles).
- Talk. A voice call beside the session settles in a second what no setting can.
When the copies drift
Two copies that should be equal and are not have drifted. It happens in every long session, and it is not a failure: TDXCollab checks for it, says so, and puts the copies back together with one choice. What helps is knowing why it happens.
Why copies drift
- Edits while you were apart: made while disconnected, never sent later.
- Changes nobody watched: a component's own UI, a script or a tool working in a network nobody shows (Only what is shown is watched).
- The same operator at the same moment (Two people, one thing).
- Differences nobody made: a DAT a running network writes into, a DAT synced to a file, a path that names a different file on each computer (Two TouchDesigners, two copies).
- A role's edits: what a partner changes outside their role stays on their side, and their copy differs until they take the host's.
How you find out
Each side fingerprints the operators it views, a few each frame, and the host compares every partner's copy with its own. A change of the last 3 seconds is not counted, as it can still be on its way. A difference that lasts is reported on both sides, in the status bar and the log, naming the operators and what differs in each.
- The host gets a pop-up once per new difference (with Ask on Drift on).
- A partner's chip turns orange and their Status says their copy differs from the host's.
Only what both of you view is compared: no pop-up means what you both looked at matches.
Bringing them back
The host decides. Its choice, first, is just the operators that differ, with their wires and docked operators; nothing else in the network changes. Then whole copies: the host's own, or a partner's, which replaces everyone else's zone. A partner can always take the host's version into their own zone (When copies differ).
- Resolve Drift opens the choice again at any time.
- Sync Zone sends one whole zone to everyone, seen or not (Sync Zone).
- Resync on Connect and joining as a copy of the host's zone start a reconnect or a join from the same copy.
Right after joining, taking the host's whole copy is quickest.
Nothing is lost
A zone that is replaced is kept beside the new one, switched off, named after what replaced it. Snapshot Zone keeps one by hand before a risky change. Restore brings it back, on your side only (Kept zones). Save your project before a session anyway: kept zones live in the project you have open.
Differences you want
What may differ on purpose, a scratch COMP or a parameter a local script keeps changing, mark Not checked: it still syncs, but never shows as drift and is never repaired (Not checked). What should never be shared at all is Keep Local.
Habits for a session
This guide as a checklist. Each line links to the part that says why.
Before
- Save your project. Several actions replace a whole zone (Nothing is lost).
- Same TDXCollab release, same TouchDesigner build on every side (Each machine is its own).
- Same files, relative paths. Media,
.toxfiles and modules in the project folder, the same folder on every machine (Files stay on each computer). - Start from the same copy: join as a copy of the host's zone, or Sync Zone first (Two copies).
- Mark components with a UI Always Sync before anyone plays them from their panel (Always Sync).
- Tag your own tools
TDXCollab:ignorebefore they land in the zone (Tools that edit the network). - Give roles, and Full Edit only to people you trust: their Python runs on your computer (Code runs on every computer).
- Testing something new? Switch Log Session on on every side.
During
- Work with the network open. What no network editor shows is not sent (Only what is shown is watched).
- One person per operator, and say what you take on (Taking turns).
- Ping and Summon instead of describing where something is.
- Check before Ctrl+Z: it undoes your side's last change, whoever made it (Undo is yours).
- Mind scripts with effects outside TouchDesigner: they run once per computer (Code runs on every computer).
- Watch the chip. Orange means your copies differ: the host chooses, a partner takes the host's (Bringing them back).
- Snapshot before a risky change.
After
- Leave in step: resolve any drift before you switch Active off.
- The host saves. The host never saves by itself; a Full Edit partner can ask it to (Saving the host's project).
- Delete kept zones you no longer need: they hold memory, GPU textures included.
- Something odd? Report a Problem on the chip, or send the session logs (Known issues).
That's the mindset. Now go make something together!