CPL
LensCowboy
COMFY PAL — ComfyUI Node Docs
3D previz for ComfyUI · $7/mo
Pricing & signup · Full PAL docs
Drop the PAL 3D viewport into your ComfyUI graph. Spatial layout, camera rigs, multipass render (beauty, depth, normal, alpha, ID matte) feeding directly into KSampler, ControlNet, Video Combine, or any downstream node. Local rendering via wgpu — no cloud tax.
Join the mailing list Install GitHub
📘 Looking for viewport features? This page covers the ComfyUI integration only — install, node I/O, pricing, workflows. For the viewport itself (camera modes & navigation, gizmos & transforms, timeline & keyframes, FBX/USD camera import, live pass preview, .lcam round-trip, AI Render, asset library, and more) see the full PAL docs — every viewport feature works identically inside the COMFY PAL iframe.
1 · Overview
What is COMFY PAL?
PAL, as a ComfyUI node

COMFY PAL embeds the full LensCowboy PAL viewport inside ComfyUI as a custom node. Use it for spatial layout (where things go in 3D), camera setup (position, lens, DOF, animation), and multipass render output that feeds directly into your AI graph.

The node exposes five image passes ready to drop into KSampler, ControlNet (depth/normal), Video Combine, compositing nodes, and more:

  • Beauty — rendered colour pass (available on all tiers, including Free)
  • Depth — z-depth, perfect for depth ControlNet (COMFY PAL or any SaaS tier)
  • Normal — surface normals, for normal ControlNet (COMFY PAL or any SaaS tier)
  • Alpha — matte for compositing (COMFY PAL or any SaaS tier)
  • ID matte — per-object masks (COMFY PAL or any SaaS tier)

Free tier: beauty pass only, capped at 512px. Depth / normal / alpha / ID matte return blank tensors — unlock the full set with COMFY PAL ($7/mo) or any LensCowboy SaaS subscription.

Rendering happens locally on your machine via wgpu (Metal / Vulkan / DirectX 12). No cloud infrastructure, no 15MB base64 caps, no LensCowboy compute charges. Your GPU, your render.

2 · Install

Via git clone

cd ~/ComfyUI/custom_nodes
git clone https://github.com/Lenscowboy/comfyui-lenscowboy-pal.git
pip install -r comfyui-lenscowboy-pal/requirements.txt
# restart ComfyUI, then search "PAL" in the node picker

Via ComfyUI Manager

Once published to the Comfy Registry: search comfy_pal in Manager, click install, restart. (Registry publish pending — use git clone for now.)

Local renderer (optional but recommended)

If you want direct Python rendering (bypasses the iframe round-trip, no 15MB cap, runs on your GPU), install the renderer deps:

pip install -r comfyui-lenscowboy-pal/pal_renderer/requirements.txt

Dependencies: pygfx, rendercanvas, gltflib, trimesh, assimp-py (for FBX), imageio, numpy.

3 · Quickstart

Free tier (no account needed)

  1. Place the PAL Layout node in your graph
  2. Click Open Viewport — a full-screen modal with the PAL scene editor opens
  3. Drag a model in, or connect Load3D / Hunyuan3D / Tripo to the model_3d input
  4. Position the camera, hit Render
  5. Queue Prompt — the beauty_pass output flows to your next node
Free tier limits: beauty only, capped at 512px. For depth / normal / alpha / ID matte, full resolution, and no cloud round-trip, see Plans.

Subscriber tier

After subscribing, paste your API key into the node's lc_api_key input. All passes unlock; resolution goes up to 2048px; local renderer works end-to-end.

4 · Node I/O

Inputs

InputTypePurpose
lc_api_keySTRINGYour LensCowboy platform token (optional — free tier works without)
lc_project_idSTRINGSaaS project to load (subscribers only)
lc_shot_idSTRINGSpecific shot to load
GLB / OBJvarious3D model inputs — accepts file paths, base64, or upstream 3D-gen node outputs
model_3dFILE_3DMatches native ComfyUI Load3D model_3d output exactly
promptSTRINGScene description (used for proxy generation if no model connected)
camera_presetSTRINGeye_level, low_angle, high_angle, etc.
frame_start / frame_endINTAnimation range
render_width / render_heightINT64 – 2048 (free tier capped at 512)
use_local_rendererBOOLEANRender via pygfx on your GPU instead of iframe round-trip

Outputs

OutputTypePurpose
beauty_passIMAGERendered colour pass → KSampler, depth-aware nodes, compositing
depth_passIMAGESingle-channel depth → Depth ControlNet
normal_passIMAGERGB surface normals → Normal ControlNet
alpha_passIMAGEMatte for comping the result over a background
id_matte_passIMAGEPer-object masks for selective processing
scene_jsonSTRINGScene state (object positions, rotations, scales)
camera_jsonSTRINGCamera position, rotation, FOV, DOF
frame_start / frame_endINTResolved animation range
sequence_jsonSTRINGMulti-shot sequence (Enterprise only)
5 · Render Passes

Beauty

Standard lit render. Feeds cleanly into KSampler as an img2img starting point, or into edit-style image models as a structural reference. Default materials are neutral grey — AI restyling downstream replaces the look anyway, which is the point.

Depth

Z-depth from the camera. Drop straight into a Depth ControlNet conditioning chain for shot-accurate spatial control. Normalised [0, 1]; near objects darker, far objects lighter by default.

Normal

RGB-encoded surface normals. Perfect for Normal ControlNet — preserves surface detail and lighting direction across AI restyles.

Alpha

Single-channel matte of rendered geometry vs background. Use it to composite the AI-restyled beauty pass over a different background, or to mask out specific regions before passing to downstream nodes.

ID matte

Per-object colour-coded mask. Each object in the scene gets a unique flat colour; use Image Mask by Color or similar to isolate individual objects for per-element processing.

Free tier: only beauty_pass is produced (depth/normal/alpha/ID matte return blank tensors). Multipass unlocks on a paid COMFY PAL plan or any LensCowboy SaaS plan — subscriptions paused; mailing-list signal welcome.
6 · Local Renderer

Set use_local_renderer=True on the node to bypass the iframe and render directly in Python via pygfx on your GPU.

Benefits

  • No iframe round-trip — skip the postMessage dance; queue and go
  • No 15MB base64 cap — direct numpy tensor handoff
  • Runs on your GPU — Metal (macOS), Vulkan (Linux), DirectX 12 (Windows)
  • Zero cloud cost — nothing hits LensCowboy infra

Tradeoffs

  • Requires the optional pal_renderer/requirements.txt deps installed
  • Beauty, alpha, and normal passes are available now. Depth and ID matte are on the active roadmap — use the iframe render path for those in the meantime
  • Uses the camera from your PAL viewport session (open viewport once to set camera, then local renderer uses it)
Tip: For ControlNet workflows where you need depth reliably, use the iframe render until the local depth pass ships. Beauty + normal + alpha work end-to-end today.
7 · 3D Formats
FormatIframe viewportLocal renderer (pygfx)
GLB GLTFLoader pygfx native
GLTF GLTFLoader pygfx native
OBJ OBJLoader (+ MTL) via trimesh
FBX FBXLoader via assimp-py
STL STLLoader via trimesh
USDZ

Upstream ComfyUI 3D generators connect cleanly: Hunyuan3D, Tripo, Meshy, Rodin, Load3D, Load3DAnimation, TripoSR. The node walks the graph on viewport open to auto-load any upstream model, so you don't need to queue once before seeing your geometry.

8 · Typical Workflows

Depth-guided img2img

Drop the beauty into KSampler as init image, run depth pass into Depth ControlNet for spatial faithfulness. Result: AI-generated image that respects your layout.

PAL → beauty_pass → KSampler (init)
PAL → depth_pass  → ControlNet (depth_strict)
       → KSampler (conditioning)

Multi-angle generation

Same scene, multiple camera positions, batched through your image model. Each camera preset renders a fresh beauty + depth, AI samples stay consistent via seed and pose conditioning.

Animated video via Video Combine

Render a frame sequence, feed into Animatediff or your video restyle chain, terminate in Video Combine for an mp4.

Per-object control

Use id_matte_pass to isolate an object, process differently (inpaint, colour-swap, relight), then recombine with the original beauty.

9 · Plans
FeatureFreeCOMFY PALSaaS Creator+Enterprise
Viewport, camera, imports
Beauty ≤ 512
Beauty up to 2048
Depth / Normal / Alpha / ID matte
Local renderer
Save to Drive
Project load from SaaS
Sequence export (multi-shot)
Breakdown integration
Pipeline writeback

COMFY PAL at $7/mo or $49/yr unlocks everything you need for solo ComfyUI work: all passes, full resolution, no caps.

SaaS Creator+ (see tiers) adds the Daily pipeline, cloud renders, project/shot libraries, and Drive output.

10 · When to Go Enterprise

COMFY PAL is a node. Enterprise is a factory.

If you're doing one-off shots in ComfyUI, COMFY PAL is probably all you need. But if your workflow looks more like "I need to generate a 48-shot music video from a script by Friday" — that's Enterprise territory.

Enterprise unlocks the whole LensCowboy production pipeline on top of everything in this doc:

  • Script breakdown parser — reads a screenplay, extracts CAM / LIGHT / VFX tags, auto-generates shot list
  • Multi-shot batching — run dozens of shots overnight from one config sheet
  • Consistency tooling — character and location consistency across shots, colour grading propagation, reference-frame chaining
  • LCBE bidding — client quoting, cost estimation, revision tracking. See LCBE docs
  • Delivery automation — watermarked previews, color-graded finals, music + voice + SFX merged, auto Drive-upload
  • Pipeline writeback from PAL — lay out a scene in PAL, trigger the full production pipeline on it
  • Breakdown integration — "Load from Breakdown" button in PAL loads an entire scene from your LCBE breakdown

None of that lives inside ComfyUI. Different tool for a different job. See LensCowboy →

Docs for the SaaS side:

11 · Troubleshooting

"Upload failed: 401" in the render dialog

Your current plan doesn't include the feature you just tried to use (typically Save to Drive or Export to Pipeline). The dialog should now lock these options up front and show an upgrade modal. If you're seeing this error, hard-refresh the browser (⌘⇧R / Ctrl+Shift+R) to pick up the latest iframe build.

Model doesn't appear in the viewport object list

The node auto-loads 3D models from upstream nodes (Load3D / Hunyuan3D / Tripo etc.) when the viewport opens. If nothing appears, check:

  • Is the model connected to model_3d, GLB, or OBJ?
  • Hard refresh the browser so the latest JS loads.

FBX loads but renders black

Embedded FBX textures sometimes fail to decode (common with proprietary image types). The viewport auto-swaps broken materials for neutral gray so geometry stays visible. For textured FBX, re-export as GLB from your DCC — much more portable.

Local renderer: "ImportError: gltflib required"

Install the renderer deps: pip install -r pal_renderer/requirements.txt inside the node directory.

Local renderer depth + ID matte show as black

Those two passes are on the active roadmap for the local renderer. Use the iframe render path for depth and ID matte for now — those work end-to-end today.