Skip to content

Writing an integration

Adding support for another host (Maya, Blender, After Effects, a render farm) is deliberately small, because all the real work lives in the host-agnostic core.

The pattern

  1. Gather the host-specific data in the DCC - the output path(s), the node, the frame range, the workfile.
  2. Delegate to fxqintegrations.core (or the SDK directly) to publish or load. Don't reimplement the publish chain.
from fxqclient import Session
from fxqintegrations import core

def publish_from_myhost(session: Session, task_id: str, product: str):
    # 1. gather in the host
    files = my_host_render_outputs()        # your DCC code
    # 2. delegate to the shared contract
    return core.publish_scene(
        session,
        task_id=task_id,
        product=product,
        product_type="render",
        representations=[{"name": "exr", "files": files}],
    )

Guidelines

  • Import host modules lazily (inside functions), like the Houdini and Nuke adapters, so your module imports anywhere and is unit-testable without the DCC.
  • Keep host code thin - only the gather step is host-specific; publish, load and lineage are shared.
  • Record lineage with inputs when your output consumed other versions.
  • Authenticate with an API key so the integration acts as a service.

Because an integration is just an API client, it can do exactly what the API allows and nothing more - the same as the web UI and the desktop app.