LTX 2.5 ONE STUDIO (TJ)
The LTX 2.5 studio node with no inputs — and why its outputs still matter
- last_frame
- video_path
Open the node and you get a full-screen studio: canvas, clip length, LoRA, continuity, sampling, a gallery, a segment timeline. Open the node definition and there is nothing there - zero required inputs, zero optional inputs, two outputs. That contradiction is the whole story of LTX 2.5 ONE STUDIO (TJ), and understanding it saves you an hour of staring at a black 64×64 frame.
It's a UI wearing a node's clothes
LTX 2.5 is the fastest tier of the LTX family - the model line whose whole reputation was built on rendering faster than it plays, which is why the community's long-video experiments keep landing on it rather than on Wan. What this pack does is wrap that model in the same browser-driven studio UI it built for MiniMax H3: one node, and inside it you pick the clip's segments on a timeline, plan prompts, and hit ▶ Generate from the node itself rather than ComfyUI's top RUN button. The two-stage render (half-size first pass, 2× latent upscale, refine) is built into the node, not drawn on the canvas.
A node with no sockets is the natural shape for that. Everything you'd otherwise wire is a dropdown in ⚙ Settings: one LTX diffusion model, a latent spatial upscaler, a video VAE and an audio VAE, plus the text encoder. Files go where you'd expect - UNET into models/diffusion_models/, upscaler into models/latent_upscale_models/, encoders into models/text_encoders/, VAEs into models/vae/. The Gemma GGUF text encoder needs the separate ComfyUI-TJ_NODE pack (TJ_LTX25ClipLoaderGGUF); the int8 safetensors works with core CLIPLoader set to ltxv.
What the two outputs do
LTX25OneTJNode declares exactly two outputs:
- last_frame (IMAGE) - the final rendered frame of the most recent generation.
- video_path (STRING) - where that render was written.
Both are read-backs, not generator outputs. The class body reads a per-node record that the studio's own HTTP route fills in after a render finishes, decodes the frame off disk, and hands it over. If nothing has been generated yet, or the file has moved, it prints an error and returns a 64×64 black image instead of failing - which is exactly the kind of silence that sends people debugging their sampler when the real answer is "press Generate first".
So wire last_frame into whatever takes an image at the start of your next shot: a first-frame keyframe, an image segment on another timeline, a VAE encode. Wire video_path into anything that wants a filename string - a preview, a database save, an ITDA-style timeline. Chaining last-frame-to-first-frame is the standard trick for continuity across clips, and the pack automates it inside a run (Last Frame Chain); these outputs are for chaining between runs, or handing the result to another graph.
Install
ComfyUI Manager → Install Custom Nodes → search "ComfyUI-TJ_NODE_STUDIO_ONE"
or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/designloves2/ComfyUI-TJ_NODE_STUDIO_ONE.git
Then restart and run the dependency script once (bash install_requirements.sh, or install_requirements.bat on Windows). A Manager install brings the Python packages but not the other custom-node packs, and several features fail to load without them; the console prints a banner naming whichever are missing. Worth knowing before you commit: from the release that added this LTX code, the whole package is GPL-3.0 because the Director portion is copied from CGlide's LTX-2.5-Director (itself a fork of WhatDreamsCost's LTX Director).
Things that bite
The outputs update after a generation, so a graph queued with RUN just re-emits the previous run's last frame - the node's change-detection deliberately returns "always changed", so don't read that as a bug. And because studio nodes like this drive their own queue from browser JavaScript, closing the tab mid-run stops the next clip from being queued even though the clip in flight finishes server-side. Background the tab, don't close it, and keep the machine awake for long renders.
Inputs (0)
No inputs
Outputs (2)
| Name | Type | Description |
|---|---|---|
| last_frame | IMAGE | — |
| video_path | STRING | — |