Auto-Update¶
Embody can check GitHub for new releases and update itself in place — no manual download, no drag-and-drop, and no loss of your settings or externalizations.
Running a Convoy fleet? Nodes take the same update remotely -- update_embody / convoy_update_embody, no per-machine visit and no TD Python grant. See Fleet Updates.
An update never writes your content: the post-update validation reconciles Embody's tracking without saving dirty externalizations -- anything you had unsaved stays exactly as unsaved as it was, flagged in the manager for you to save when you choose.
Availability
Self-update ships with Embody v6.0.143+. Older installs update manually
one last time (drag in the new release .tox as before); from then on
the updater is available.
Quick start¶
- Check now: pulse Check for Update (About page). If a newer release exists you'll see the version pair and a link to its release notes, and can install with one click.
- Automatic: set Auto-Update (About page) to
Check and NotifyorCheck and Install. It defaults toOff— nothing is checked and nothing leaves your machine until you opt in.
Parameters (About page)¶
| Parameter | Name | Meaning |
|---|---|---|
| Auto-Update | Autoupdate |
A fresh install ships set to Check and Notify (the parameter's own default is Off, but the released .tox carries Check and Notify, so a new install does check once at startup until you change it). Off: never checks. Check and Notify: checks once at startup and shows availability in Update Status — nothing is installed. Check and Install: checks at startup and installs a verified update automatically. A check that can't complete (no network, no manifest, TD too old) is logged quietly; a failure during an install (backup, reload, verify, rollback) always shows a dialog. |
| Check for Update | Checkforupdate |
Checks GitHub now and prompts if an update is available (up to date and network errors are reported in a dialog). A release built for a newer TouchDesigner than yours is offered with a warning (Install Anyway), not refused. |
| Update Status | Updatestatus |
Read-only status line: Disabled (Auto-Update is Off -- the fresh-install resting state), Up to date (v6.0.150), v6.0.151 available, Downloading..., Retrying download (2/3)..., Updated to v6.0.151, or an error summary. |
The Autoupdate choice is a persisted setting (.embody/config.json), so it
survives updates, project moves, and re-installs like every other Embody
preference.
What an update does¶
- Check — a background request to
api.github.com/repos/dylanroscover/Embody/releases/latest. The frame loop is never blocked. On a manual check every outcome is shown in a dialog; on the automatic startup path a failed check is logged and shown in Update Status without interrupting you. - Gate — the release's
embody-release.jsonmanifest is fetched and validated. If the release requires a newer TouchDesigner build than the one running (min_td_build), the automatic path refuses before anything is downloaded — a.toxsaved in a newer TD build can fail to load in older ones. A manual Check for Update warns you instead and offers Install Anyway: the risk is yours to take, and the backup and rollback below still cover you. - Download — the release
.toxis downloaded to.embody/updates/and verified against the manifest's byte size and SHA-256 digest. A download that fails verification is discarded. - Back up — the currently installed Embody is exported to
.embody/updates/backup-v<version>.toxand sanity-checked. On the manual path you are offered a project save first — the saved.toeis the recovery point of last resort. - Install (in place) — Embody's contents are reloaded from the new
.toxusing TouchDesigner's external-tox mechanism. The Embody COMP itself is never destroyed: its network location, wires, globalop.Embodyshortcut, and your parameter values all survive. New parameters introduced by the update appear with their defaults. Envoy is stopped cleanly first and restarts through its normal startup path afterward (if you had it enabled). - Verify — after the new version boots, the updater confirms the component is intact, stamps the new version metadata, reconciles parameters, detaches from the downloaded file, clears the in-flight sentinel, and only then reports success — one dialog for the whole update, which also names any settings the new version retired. If verification fails, the pre-update backup is restored automatically and the failure is reported.
The reporting deliberately comes last. A message box is modal to the script that raised it but not to TouchDesigner, whose scheduled callbacks keep running behind it — so a dialog raised mid-verification used to park the update half-applied, with its crash sentinel still on disk, long enough for the startup sweep to find it and offer to roll back an update that was seconds from succeeding.
Your externalized files and the externalizations table are untouched by
design — the table lives beside Embody precisely so it survives component
replacement, and the new version revalidates every tracked operator on boot
(the same path a manual drag-in upgrade uses).
Safety model¶
- Nothing silent is destructive.
Offis the default;Check and Notifynever installs. OnCheck and Install, failures during an install — anything that touches the live component (backup, reload, verify, rollback) — always raise a dialog; only a fully successful install is quiet. Failures before an install starts (a check that can't reach GitHub, an unverifiable release, a too-old TouchDesigner) are logged to the Embody log and shown in Update Status, without a startup dialog on every launch. On the manual Check for Update button, every outcome — up-to-date, unavailable, or error — is shown in a dialog. - Integrity: the manifest's SHA-256 must match the downloaded bytes, and
the manifest names a bare
.toxasset (no path escapes). Releases without a manifest (all releases before v6.0.143) are refused with a pointer to manual update. Note this is tamper-detection within GitHub's trust domain: the manifest and the.toxare published together, so the SHA-256 protects against a corrupted or post-publish-mutated asset, not against a compromise of the release itself. Because there is no independent signature,Check and Installis an explicit opt-in — if you are cautious, preferCheck and Notifyand review each release before installing. (A signed-manifest scheme with a pinned public key is planned.) - Compatibility:
min_td_buildis checked before download. Loading a newer-build.toxon an older TouchDesigner can fail silently, so an unattended update never crosses that floor. On a manual check the choice is yours: Install Anyway runs the same backed-up, verified install, and a version that fails to boot is rolled back. - Downgrade protection: version tags are compared numerically
(
MAJOR.MINOR.PATCH); a release whose tag is not strictly newer than the installed version is never installed. Tags that don't parse are refused. - Crash recovery: before the reload, a sentinel file
(
.embody/updates/pending.json) records the update in flight. If TouchDesigner crashes or is closed mid-update, the next project open detects it and offers to restore the backup. It offers that only for an update that really was interrupted: the sentinel records the process that wrote it, and an in-place reload keeps the same TouchDesigner process, so the rebuilt component recognises its own update still finishing instead of mistaking it for wreckage. If a swap is found live but nothing is left to finish it — the interrupted case where the component was already re-pointed at the new.tox— verification is re-armed rather than prompting, so the install completes instead of stalling half-applied. - Rollback: a failed verification automatically reloads the pre-update
backup, and restores the version metadata with it — the About page and
Update Status describe the build you are actually running, so a later check
offers the update again instead of reporting you are up to date on a
version you rolled away from. If even the rollback fails, the updater tells
you to close without saving and reopen — the saved
.toestill holds the previous working state. - Undo: the swap is excluded from the undo stack. A stray Ctrl+Z cannot half-resurrect the old version.
When the network stalls¶
Nothing about an update can leave the updater stuck:
- Every phase has a wall-clock deadline. The download owns its own budget, so a connection that trickles bytes forever (a proxy or captive portal that half-opens the socket) is abandoned instead of hanging -- a socket timeout alone would never fire on one.
- A failed check or download retries itself, up to three attempts. The
Update Status line shows
Retrying download (2/3)...while it does. - After three failures it stops and tells you, in a dialog on the manual path (quietly in the log and Update Status on the automatic startup path), and cancels the attempt: no leftover state, no "already in progress" refusal. Press Check for Update again whenever you want.
- A stalled attempt never owns the updater. If an update phase somehow stops reporting, the next attempt clears it and proceeds rather than refusing.
The dev checkout refuses self-update¶
If Embody's own source DATs are file-synced (you are working in the git
repository, where the repo — not a downloaded .tox — is the source of
truth), every update path refuses with a message to update via git pull
instead. This protects the working tree from being clobbered.
Privacy¶
A version check is a single HTTPS request to GitHub's public API. It carries
no account data or project information — GitHub sees what any web request
shows it (your IP address and a user-agent naming the updater). With
Auto-Update Off, Embody never phones home at all (set it yourself -- a fresh install ships on Check and Notify). Note
GitHub's anonymous API allows 60 requests per hour per IP address — many
machines behind one NAT (a classroom) may see checks fail temporarily;
checks fail soft and never block startup.
For maintainers: the release manifest¶
Every project.save() in the dev project exports the release .tox and
writes release/embody-release.json beside it:
{
"schema": 1,
"name": "Embody",
"version": "6.0.143",
"tag": "v6.0.143",
"asset": "Embody-v6.0.143.tox",
"size": 699178,
"sha256": "…64 hex chars…",
"td_build": "2025.33230",
"min_td_build": "2025.33230",
"build": 842,
"date": "2026-07-21",
"exported_at": "2026-07-21T12:00:00+00:00"
}
min_td_build is the build the .tox was saved with — the support floor by
construction. The GitHub release step attaches every file in release/, so
the manifest rides along automatically. A release without its manifest is
invisible to the updater — users on auto-update simply won't receive it.
Troubleshooting¶
| Symptom | Cause / fix |
|---|---|
| "cannot be verified: release has no embody-release.json" | The release predates the manifest system. Update manually from GitHub. |
| "requires TouchDesigner build X+" | Your TD build is older than the release's floor, and the automatic path will not cross it. Update TouchDesigner, stay on the current Embody, or pulse Check for Update and choose Install Anyway (unsupported: the release was not built for your TD; a version that fails to boot is rolled back). |
| "was built for TouchDesigner X+ ... and may not load here" | The manual check found a release built for a newer TouchDesigner than yours. Cancel changes nothing. Install Anyway installs it with the usual backup; save when asked, since the saved .toe is the recovery point of last resort. |
| "Update failed after 3 tries -- check your internet connection" | The check or download failed three times in a row (no internet, a proxy that stalls the transfer, GitHub down, or the 60/hour anonymous rate limit shared per IP). The attempt is cancelled and nothing is left half-done -- press Check for Update again whenever you like. |
| "An update is already running (download)" | A check or download really is in flight. It retries by itself and stops on its own; you never have to restart TouchDesigner to get out of it. |
| "A previous update to vX did not complete" on a manual check | An earlier update stopped before it could be verified. Choose Restore Backup to go back to the pre-update version, or Discard and Continue to drop the leftover and check again. |
| "Update Recovery" dialog at startup | A previous update was interrupted. Restore Backup returns to the pre-update version; Keep Current State leaves things as they are. It never appears for an update that is merely still finishing — if you see it, the update really did stop. |
| "N settings no longer exist in this version and were removed" | The new version retired those parameters; their values are gone with them. It arrives inside the update's own success dialog, never as a separate alarm, and it never names Convoy node rows or any other runtime-populated sequence — those are a live readout, not settings, and an update leaves them alone. |
| Status shows an old version after update | The verify step stamps version metadata a few seconds after the reload; if it still shows stale info, check the Embody log for a rollback report. |
| Status shows the NEW version after a rollback | Fixed in v6.2.58. Older builds preserved the parameter values across the reload without stamping them back, so a rolled-back install kept claiming the version it had discarded — and, because the update check compares against that number, rested on "Up to date" indefinitely. Update to v6.2.58 or later; the version is now restored as part of the rollback. |
| Updater refuses in the dev repo | Intended — see above. Use git pull. |