open source · MIT · TouchDesigner 2025+

create at the
speed of thought.

paste this into a TouchDesigner Textport to install — macOS or Windows

import requests, hashlib, tempfile, os; h = {'User-Agent': 'Embody-Install'}; mf = requests.get('https://github.com/dylanroscover/Embody/releases/latest/download/embody-release.json', headers=h, timeout=30).json(); b = requests.get('https://github.com/dylanroscover/Embody/releases/download/%s/%s' % (mf['tag'], mf['asset']), headers=h, timeout=120).content; assert hashlib.sha256(b).hexdigest() == mf['sha256'], 'checksum mismatch'; f = os.path.join(tempfile.gettempdir(), mf['asset']); open(f, 'wb').write(b); n = ui.panes.current; n = n if n.type == PaneType.NETWORKEDITOR else next(x for x in ui.panes if x.type == PaneType.NETWORKEDITOR); print('Embody', mf['version'], 'installed at', n.owner.loadTox(f).path)

v6.0.279 · same as tox drag and drop

Embody running inside TouchDesigner - the extension's manager panel.
The Embody manager panel — every operator externalized to readable text.

in practice

say it. watch it happen.

  • Build entire networks from a sentence"Build me a noise-driven particle system."
  • Try a different approach in seconds"Actually, make it react to audio instead."
  • Set any parameter"Set the noise frequency to match the audio input."
  • Write extensions"Create an extension class that manages scene transitions."
  • Debug errors"Why is my render chain producing a black output?"
  • Compare attempts"Show me what changed between this version and the last."

the format that makes it possible

meet TDN.

TDN exports any TouchDesigner network as a single human-readable YAML file — operators, parameters, connections, layout, annotations, DAT content — all of it, in text. Every change becomes a clean diff. Every version is a file your AI agent can read, your team can review, and git can meaningfully compare.

format: tdn
version: '2.0'
build: 8
generator: Embody/6.0.16
td_build: 099.2025.32820
exported_at: '2026-04-10T08:15:00Z'
network_path: /project1
type: containerCOMP
options:
  include_dat_content: true
operators:
- name: noise1
  type: noiseTOP
  parameters:
    amp: 0.8
    period: =absTime.frame * 0.1
  flags:
  - viewer
- name: level1
  type: levelTOP
  parameters:
    opacity: ~op('ctrl').par.Fade
  flags:
  - display
  - render
  position: [400, 0]
  inputs:
  - noise1
annotations:
- name: annot1
  mode: annotate
  title: noise pipeline
  position: [-100, -200]
  size: [700, 400]
  • non-default-only — only what you actually changed gets written.
  • type defaults hoisted — shared properties dedupe across operators.
  • expression shorthand=absTime.frame * 0.1 instead of verbose wrapper objects.
  • round-trip safe — export → edit → import yields the same network.
  • the substrate for the entire workflow — forward velocity AND lateral velocity depend on it.

diffable. Any text tool, any diff viewer, any AI agent can read it.

TDN is what makes the rest of this possible.

get started

three steps to flow.

  1. 01

    install

    Open a Textport (alt+t) and paste the one-liner. Prefer a file? Grab the .tox from GitHub Releases and drop it into your project.

  2. 02

    enable Envoy

    Connect your AI assistant to the session with one toggle.

  3. 03

    tag operators

    Double-tap lctrl on any operator to externalize it. Start building.

read the full Quickstart

Requires TouchDesigner 2025.33070 or later. Works on macOS and Windows.

why this exists

Everything is moving faster now. Everyone is shipping. We're entering the golden age of digital media, and TouchDesigner is positioned to become one of the leading platforms of content creation. Embody exists to help our community build faster and better than ever — open source, no strings attached, nothing SaaSy.

the collection

browse the Collection.

Transparent TDN networks you can inspect node-for-node, copy to your clipboard, and evolve in your own project.

textTOP example rendered result
typography+1

textTOP example

Recreated from one reference screenshot and the prompt: "recreate this imagein TouchDesigner, exactly the same layout." Rather than eyeball it, the reference was measured programmatically — per-row baselines, cap heights and ink extents — which revealed that each line is centered on a smoothly drifting point, not ragged-left as it appears. Those numbers became the table. Read left to right: table_lineup (name | code | centre) plus a Noise CHOP feed script_spec, which emits a Text TOP Specification DAT — a table where each row is one string with its own x/y — sizing each name via evalTextSize() so the superscripts land correctly. select_names / select_codes split that into two Text TOPs, because the spec DAT positions per row but ignores per-row font size. They composite into out1. Verified by capturing the render and re-measuring it against the source: line centres match within 0.6 px RMS. Noise CHOP Amplitude drives the stagger — at 0 it's the exact reference frame. All geometry is stored as canvas fractions, so it's resolution independent.

Kaleidoscope rendered result
compositing

Kaleidoscope

A reusable kaleidoscope compositor. Folds any TOP (or its built-in animated source) into an N-fold mirrored mandala that rotates, twists, breathes, and tumbles. Drop it onto any visual via the External source mode.

Mandelbulb March rendered result
raymarching-sdf

Mandelbulb March

A raymarched 3D Mandelbulb fractal rendered entirely in one GLSL TOP. The classic distance estimator is marched per pixel against a slowly orbiting camera; orbit-trap values captured during iteration tint the surface, and soft shadows, a fresnel rim, and a proximity glow give it depth. No input, no feedback - a drop-in hero render, a looping VJ source, or a reference for distance-estimated raymarching.

Enter the Collection