Genvid Connector for Foundry Nuke
The Genvid Connector turns Nuke into a first-class node in a Genvid-tracked production. Sign in once, bind a .nk script to a shot, browse and pull shot media into the Node Graph as Read nodes, publish composited keyframes or shot videos back to the shot, and trigger AI generations (I2I, I2V, KF2V, V2V, Upscale) without leaving the comp.
Every publish writes a parsed comp DAG and the raw .nk sidecar to provenance, with full C2PA digital_source_type tagging applied automatically.
Overview
The plugin adds three custom nodes (GenvidGenerate, GenvidRead, GenvidConfig), a Genvid menu, and a Genvid Browser panel that mirrors the web app's shot and asset media. It uses OAuth 2.1 + PKCE for sign-in and stores refresh tokens in the OS keychain — no long-lived secrets ever touch the .nk.
Requirements
- Nuke 14.0 or later — NukeX, Nuke Indie, Nuke Studio, and NukeStudio all supported. Nuke 15.0 is smoke-tested.
- Python 3.9+ — bundled with Nuke 14+. Nuke 13.x (Python 3.7) is an explicit non-goal.
- Operating system — macOS 11+, Windows 10+, or Linux (RHEL / Rocky / Alma 8+).
- A Genvid account on a production where you are a member.
Hiero and HieroPlayer are not yet supported.
Install — Individual artist (pip)
The plugin ships as genvid-nuke on PyPI. From inside Nuke's Script Editor, or by invoking Nuke's bundled Python:
# Prerelease (current — installs the latest 0.x release candidate):
nuke --python-only --script "import pip; pip.main(['install', '--user', '--pre', 'genvid-nuke'])"
# Stable (use once 1.0.0 ships):
nuke --python-only --script "import pip; pip.main(['install', '--user', 'genvid-nuke'])"
Then register the plugin by adding two lines to ~/.nuke/menu.py:
import genvid_nuke
genvid_nuke.install()
Restart Nuke. The Genvid menu, the custom nodes (GenvidGenerate, GenvidRead, GenvidConfig), and the Genvid Browser panel are now registered. First launch walks you through PKCE sign-in.
Install — Studio shared (zip)
For studio-wide deployment, drop the versioned zip into a directory on NUKE_PATH and register it from init.py. No per-user setup required.
- Download
genvid-nuke-<version>.zipfrom your distribution location (PyPI sdist, internal artifact store, or the Nukepedia listing). - Unzip into a directory on
NUKE_PATH, for example/studio/nuke/plugins/genvid-nuke/. - Add the following line to your studio
init.py:
nuke.pluginAddPath('/studio/nuke/plugins/genvid-nuke')
Restart Nuke. The plugin registers its menu entries, custom nodes, and panel exactly as it does for the pip install. Each artist still goes through PKCE sign-in once per machine; refresh tokens are stored per-user in the OS keychain.
Sign in
Genvid → Sign in… opens your default browser to the Genvid OAuth consent screen. The flow uses OAuth 2.1 + PKCE (RFC 7636), so no client secret is embedded in the plugin and no long-lived token ever touches the .nk script.
After you approve, the browser redirects back to a short-lived local loopback URI and the plugin completes the exchange. The refresh token is then stored in your OS keychain via the keyring library:
- macOS — Keychain.app
- Windows — Credential Manager
- Linux — libsecret (GNOME Keyring, KWallet, or compatible)
After sign-in, the plugin transparently refreshes access tokens in the background. You only need to sign in again if you revoke access from the web app or clear your keychain entry.
Bind a shot
Genvid → Bind to shot… opens the project / sequence / shot picker. When you confirm a selection, the plugin writes a GenvidConfig NoOp node into the script. That node is the binding — it carries the project, sequence, and shot identifiers as knob values.
Because the binding is a node in the script, it travels with the .nk file. Open the same script on another workstation (or commit it to your asset-management system) and the binding stays intact. There's no separate config file to lose.
A script can only carry one GenvidConfig at a time. Re-running Bind to shot… replaces the existing binding.
The Genvid Browser panel
Genvid → Browser (or the panel hotkey) opens a dockable panel that mirrors the web app's shot and asset views. The left pane shows a project / sequence / shot tree; the right pane shows media thumbnails for the current selection — keyframes, shot videos, asset references, and generated content.
Double-click any thumbnail to drop it as a Read node in the active script. The dropped node is a GenvidRead, not a stock Read — it lazy-fetches signed URLs from Genvid Storage at evaluation time, so your script does not break when a media file is relocated or its signed URL expires.
Hovering a thumbnail surfaces its metadata: render_type, model_provider, and created_at. The panel is keyboard-driven and stays in sync with your bound shot when you switch scripts.
Custom nodes
The plugin adds three nodes to the Tab menu:
GenvidRead
A Read node variant that resolves its source via the Genvid media ID set on its knobs, fetching a fresh signed URL at evaluation time. Drop these from the Browser panel rather than by hand — the Browser sets the media ID and the rest of the knobs for you. Animate, label, and connect them like any other Read.
GenvidGenerate
Triggers an AI generation using the upstream comp output as the input image or video. Configure the mode and model as node knobs, hit Execute, and the plugin posts the job to Genvid and polls for completion. While the panel is open, the plugin polls every 5 seconds; it also runs a sync sweep every time you open a script, so an in-flight generation will reconcile its status without needing the panel to be open.
When the result lands, a downstream GenvidRead connected to the GenvidGenerate node's output auto-populates with the generated media.
The supported generation modes are:
| Mode | Input | Output |
|---|---|---|
| I2I | Image | Image |
| I2V | Image | Video |
| KF2V | Keyframes | Video |
| V2V | Video | Video |
| Upscale | Image or video | Higher-resolution image or video |
All modes are animatable as standard Nuke knobs. The status knob shows pending, running, complete, or failed, with the same semantics as the web app.
GenvidConfig
The binding node written by Genvid → Bind to shot…. It is a NoOp — it does not pass image data — but it carries the project, sequence, and shot identifiers that the rest of the plugin reads from. Don't delete it unless you intend to re-bind the script.
Publishing comps
Two publish actions live under the Genvid menu:
Genvid → Publish comp as keyframe— publishes a stillGenvid → Publish comp as shot video— publishes a video
Either action renders the active Write or Viewer output, serializes the comp DAG, uploads the .nk script as a sidecar, and posts the bundle to /projects/{project_id}/comps.
What lands in Genvid
When you publish, the following is stored:
- The rendered output — PNG, EXR, MP4, or MOV depending on what you wrote.
- The raw
.nkscript as a Storage sidecar. Stored privately; only accessible via short-lived signed URLs. - A parsed JSON
comp_graphkeyed by node, capturing class, label, inputs, key knob values, and channel routing. - A
media_media_linkrow per upstream input, withlink_typeset to one ofnuke_input,nuke_clean_plate,nuke_matte,nuke_track_ref, ornuke_grade_ref.
The model_provider field on the resulting media row is set to Foundry Nuke. Domain events from the plugin carry source='nuke_plugin' so downstream listeners can route accordingly.
What you see on the web side
- The new media node appears in the shot's provenance graph with a Nuke corner badge.
- A Comp Graph sidebar tab opens to a read-only React Flow rendering of the parsed DAG. Hover any node to see its knob values.
- A Download .nk button on the same sidebar lets a TD pull the original script for debugging or rework.
C2PA and digital_source_type
Every published comp carries a C2PA digital_source_type value, set automatically based on the provenance of its inputs:
composite— when all upstream inputs are camera-original or human-made.compositeWithTrainedAlgorithmicMedia— when any upstream input was AI-generated (including outputs from aGenvidGeneratenode).
The plugin walks the comp's input graph at publish time and picks the correct value. There is no manual flag to set and no way to misclassify by accident.
This matters for studios shipping under provenance requirements — news organizations operating under CAI mandates, and an increasing share of feature work. The connector is C2PA-correct out of the box.
Troubleshooting
PKCE sign-in redirect fails
The sign-in flow uses a short-lived local loopback URI (typically http://127.0.0.1:<port>). If your browser hangs on the redirect or returns a connection error:
- Confirm your browser is not blocking loopback redirects via an extension (some "strict" privacy extensions do).
- If you are on a corporate network with a proxy that strips loopback redirects, sign in from a network without the proxy.
- Close the browser tab, re-run
Genvid → Sign in…, and try again — the loopback listener binds to a fresh port each attempt.
Keychain access prompt on first launch
The first time the plugin reads or writes the refresh token, your OS will prompt for keychain access. This is expected. Allow access (and tick "Always Allow" on macOS, or the equivalent on your platform) so Nuke can refresh tokens without prompting on every launch.
NUKE_PATH install not picked up
If your studio zip install registers nothing on launch:
- Confirm
NUKE_PATHis set in the environment Nuke actually inherits (launching from a wrapped shell vs. the Finder/Explorer can yield different environments). - Confirm
init.pyis callingnuke.pluginAddPath('/studio/nuke/plugins/genvid-nuke')with the correct absolute path. - Check
Help → About → Plug-ins(or the Nuke startup console log) forgenvid_nukeregistration messages.
Browser panel is empty
If the panel opens but shows no projects:
- Confirm you are signed in —
Genvid → Sign in…will show your account if a session is active. - Confirm you are a member of at least one production in the account you signed in with.
GenvidGenerate stuck on pending
The plugin polls every 5 seconds while the panel is open and runs a sync sweep when a script opens. If a job appears stuck:
- Open the
Genvid Browserpanel — this re-arms the polling loop. - Check the job's status on the web app; the node knob reflects the same status the backend reports.
Publish reports a permission error
Publishing requires the same permission your role has on the bound shot in the web app. If Publish comp as keyframe or Publish comp as shot video fails with a permission error, confirm you are assigned to the shot, or ask your production admin to adjust your role.
