vCon
GPU video transcoding, FFmpeg-style, powered by TouchDesigner.
vcon is a cross-platform (macOS / Windows) command-line transcoder that
drives TouchDesigner's GPU-accelerated
Movie File Out TOP to encode video into every codec TouchDesigner
supports — NotchLC, Hap, Apple ProRes, GoPro CineForm, H.264/H.265/AV1,
and more.
Naming: the package installs as
tdxvconbut the command isvcon. (The PyPI namevconwas already taken by an unrelated project.)
Why
The NotchLC encoder is not available in FFmpeg or any open encoder — it lives in TouchDesigner (and other licensed products). vCon wraps TouchDesigner in a headless, self-driving pipeline and exposes it through a familiar CLI, so converting footage becomes:
vcon -i input.mov -c notchlc out.mov
Install
Requirements: TouchDesigner (macOS or Windows) and Python 3.10+.
pipx install tdxvcon
pipx creates an isolated environment automatically and puts vcon on your
PATH — no virtualenv to create or activate, ever. It is also the least
friction option on both macOS and Windows, and avoids app-store packaging
entirely.
Then verify:
vcon -doctor
You should see ✔ for the TouchDesigner binary, the transcoder toe, the toe's
freshness, and the controller probe. If no controller is running, vcon
launches TouchDesigner for you.
If you don't have pipx
# macOS
brew install pipx && pipx ensurepath
# Windows (PowerShell)
py -m pip install --user pipx
py -m pipx ensurepath
# any platform, if pip is available
python3 -m pip install --user pipx && python3 -m pipx ensurepath
pipx ensurepath is the one step people miss — it adds ~/.local/bin
(macOS/Linux) or %USERPROFILE%\.local\bin (Windows) to PATH so the vcon
command is found. Open a new terminal afterwards.
Windows note: TouchDesigner must be added to the firewall allow-list, or the controller's TCP port will be blocked.
TouchDesigner binary resolution order: -td-path flag → VCON_TDPATH
environment variable → config file → standard install locations
(/Applications/TouchDesigner.app/... on macOS,
C:\Program Files\Derivative\TouchDesigner\bin\... on Windows).
Usage
A codec is required for every output — like ffmpeg's -c:v, but with no
sensible default (NotchLC and H.264 are for opposite ends of a pipeline).
# NotchLC — GPU mezzanine (the usual choice)
vcon -i input.mov -c notchlc -q optimal output.mov
# ProRes 4444 XQ — for an edit suite
vcon -i input.mov -c prores -t 4444xq output.mov
# Hap Q — for a media server
vcon -i input.mov -c hap -t hapq output.mov
# H.264 delivery file
vcon -i input.mov -c h264 output.mp4
# Multiple outputs in one TouchDesigner pass
vcon -i input.mov -c notchlc a.nlc.mov -c hap -t hapq b.hapq.mov
# Force overwrite, quiet output
vcon -y -loglevel error -i input.mov -c notchlc output.mov
Run vcon -h for the full option list and the recommended codecs with their
subtypes. Run vcon -codecs for every codec TouchDesigner can encode
(including legacy ones), with quality levels, pixel formats and speed notes.
Both the help and the codec list are generated from
src/vcon/codec_meta.py at runtime, so they can
never drift out of sync with what actually works.
Flags
-i FILE input file
-c CODEC codec — REQUIRED (see vcon -codecs)
-t SUBTYPE codec variant (prores: 422proxy, 422lt, 422, 422hq, 4444, 4444xq;
hap: hap, hapq, hapr, haphdr)
-q QUALITY quality level (notchlc: good, very-good, excellent, optimal, best)
-f FPS override output frame rate
-no-alpha force alpha off even if the source has it
-y / -n allow / forbid overwriting existing files
-loglevel LVL quiet | error | warning | info | debug
-nostats disable the ffmpeg-style progress line
-codecs list every available codec
-doctor diagnose the TouchDesigner setup
Notes
- Subtypes and pixel formats vary by codec. Alpha is only available where
a format carries it — ProRes needs
-t 4444or4444xq; Hap HDR has none. vcon tells you when a combination isn't possible rather than silently producing something different. - Outputs are much larger than the source. NotchLC and ProRes are mezzanine codecs (~5:1 against raw, not against H.264). A 26 GB H.264 source can become a 45 GB NotchLC or ProRes file. Check free space first.
- vcon verifies every output. It reads the codec back out of the finished file and fails the job if TouchDesigner produced something else — the failure mode that motivated this check was a "successful" encode that was silently in the wrong codec.
Architecture
CLI (renderer) ──subscribes──▶ vcon.core (headless, event-emitting)
│ QueueManager · CodecRegistry · Driver
▼
Driver backend (mock | touchdesigner)
│ spawn + TCP JSON-lines
▼
transcoder.toe (TouchDesigner, GPU encode)
- The core is an importable library that emits typed events and never prints — a future GUI or daemon is a new subscriber, not a refactor.
- The TouchDesigner project ships inside the pip package; users never open the TD editor.
- A
--mockdriver runs the entire pipeline without TouchDesigner (used by the test suite and useful for development on machines without TD).
Development
Working on vcon itself (not just using it):
git clone … && cd vCon
python3 -m venv .venv && .venv/bin/pip install -e . pytest
.venv/bin/python -m pytest # 134 tests, no TouchDesigner needed
Rebuilding the toe
You only rebuild transcoder.toe when toe/vcon_controller.py changes. See
toe/PROTOCOL.md for the wire contract it must satisfy.
# Run in TouchDesigner's TEXTPORT — NOT the Python console, and never `import`
# (TD does not inject its builtins like `op` into imported modules).
exec(open('/path/to/vCon/toe/build_network.py', encoding='utf-8').read())
Using a global install while developing
If vcon is installed with pipx but you are rebuilding the toe, the installed
command would otherwise use a stale packaged copy. Point it at your repo:
export VCON_TOE=/path/to/vCon/src/vcon/data/transcoder.toe
Or re-sync the packaged copy after a rebuild:
./scripts/sync-toe.sh # copies toe → installed package + refreshes pipx
Status
Phase 1 — core skeleton, protocol, queue, codec registry, mock driver, FFmpeg-style CLI, and tests. TouchDesigner integration lands in phase 2+.
Metadata
Release files for tdxvcon 0.1.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| tdxvcon-0.1.4.tar.gz | 94.0 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tdxvcon-0.1.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 173.8 kB
Release files / tdxvcon-0.1.4.tar.gz
| Download URL | tdxvcon-0.1.4.tar.gz |
|---|---|
| Size | 94.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ad30bbd4948d3029e309e2eadee24fedb4c5c5b38a35c03ae12df69ace2ccd8d
|
|
BLAKE2b-256 checksum How to use checksums |
7e873add2f13e6b93f84b134cf5a92336d275d249e730007d91ead44a111c6e7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.6
|
Release files / tdxvcon-0.1.4-py3-none-any.whl
| Download URL | tdxvcon-0.1.4-py3-none-any.whl |
|---|---|
| Size | 79.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0abe0eb09a3d05d6f075070c471505f366fff8faea48087d9ad1237bc02bc36c
|
|
BLAKE2b-256 checksum How to use checksums |
3c8829d4ef739377fca237d5e32de2d722de0a729e3664189a6cedf1f9ba9638
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.6
|
Security for tdxvcon 0.1.4
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.