DIGIT Nodes
DIGIT — Deep Infrastructure for Generative Image Training. ComfyUI nodes for Gemini generation, Veo + Seedance 2.0 / 2.5 video, LoRA training, dataset management, and auto-captioning.
DIGIT Nodes for ComfyUI
Production-grade AI nodes that connect directly to Google Cloud Vertex AI. No middleman, no proxy, no rate limits beyond your own GCP quota. Your usage bills directly to your GCP account at Google's API pricing — no markup.
DIGIT Nodes give you raw, unfiltered access to Google's most powerful generative AI models from inside ComfyUI. Every node auto-detects your GCP credentials, so once you're authenticated, everything just works.
Why DIGIT Nodes?
Most ComfyUI nodes that talk to Google's models go through third-party proxies or require API keys from wrapper services. DIGIT Nodes skip all of that. You authenticate once with gcloud, and every node talks directly to Vertex AI using the official google-genai SDK.
This means:
- No API key management — uses your existing GCP credentials
- No rate limit surprises — you control your own quotas
- No data routing through third parties — your prompts and outputs stay between you and Google
- Lossless video output — the only way to get uncompressed Veo output is through the API with a GCS bucket, and DIGIT Nodes support this natively
- Auto-detection — on GCP instances (Compute Engine, GKE), project ID and region are detected automatically from the metadata service. On local machines, it uses your
gcloudlogin.
The Nodes
53 nodes registered in v4.1.0 (including 1 deprecated alias). All appear under the DIGIT category unless noted.
| Family | Nodes |
|--------|-------|
| Image generation | Gemini Image · GPT Image · Seedream Image · Batch Gemini Image |
| Video generation | Veo Video · Gemini Omni Video · Seedance Video · MiniMax Video · Seedance Video (Replicate) [deprecated] · MU Seedance 2 Character |
| LLM & prompts | LLM Query · Random Prompt · Prompt Combine · Text Encode |
| Subtitles / SRT | SRT Maker · SRT From Video · Batch SRT From Video · SRT Tools · SRT Preview |
| Pipeline I/O | Uber Saver · Image Saver · Video Saver · Image Loader · Drag Crop · Crop Info |
| Dataset & captioning | Batch Caption · Caption Viewer · Caption Find & Replace · Dataset Prep |
| LoRA training | Dataset Manager · Captioner · Caption Preset Manager · LoRA Trainer · LoRA Loader (training) · Naming / Trigger / Sample Prompt Presets · LoRA Loader · LoRA Loader (Model Only) |
| ElevenLabs (DIGIT/ElevenLabs) | Voice Selector · Text to Speech · Speech to Text · Sound Effects · Voice Isolation · Voice Clone · Speech to Speech · Dialogue |
| Shade | Shade Mount · Save to Shade |
| Drift QC | Drift Gate · Drift Gate (Paths) · Drift QC Preview |
| Utilities | Console Doctor · Frame Size |
DIGIT Gemini Image
Generate and edit images using Google's Gemini image models directly through Vertex AI.
This is a unified node — it handles text-to-image, image editing, and multi-image composition all in one place. Feed it a prompt and it generates an image. Feed it a prompt plus up to 3 input images and it edits or combines them.
Supported Models:
| Model | Internal Name | What It Is |
|-------|--------------|------------|
| Gemini 3.1 Flash Image | gemini-3.1-flash-image | Nano Banana 2 — balanced quality and speed. Default choice. |
| Gemini 3.1 Flash-Lite Image | gemini-3.1-flash-lite-image | Nano Banana 2 Lite — fastest and most cost-efficient; 1K resolution only. |
| Gemini 3 Pro Image | gemini-3-pro-image | Nano Banana Pro — higher quality, slower. |
| Gemini 2.5 Flash Image | gemini-2.5-flash-image | Previous generation. Still solid. |
Inputs:
| Input | Type | Default | Description | |-------|------|---------|-------------| | prompt | STRING | — | Your image generation prompt. Required. | | model | COMBO | gemini-3.1-flash-image | Which Gemini image model to use. | | aspect_ratio | COMBO | 16:9 | Output aspect ratio. 12 options: 1:1, 2:3, 3:2, 3:4, 4:1, 4:3, 4:5, 5:4, 8:1, 9:16, 16:9, 21:9. | | resolution | COMBO | 1K | Output resolution: 1K, 2K, or 4K. Nano Banana 2 Lite supports 1K only (the dropdown updates automatically). | | seed | INT | 0 | Reproducibility seed. 0 = random each run. Max 2,147,483,647. | | temperature | FLOAT | 1.0 | Creativity control. Range 0.0–2.0. Higher = more creative/varied. | | image1 … image9 | IMAGE | — | Optional input images for editing, style transfer, or composition. Batched images are iterated automatically. | | batch_count | INT | 1 | Number of images to generate (1–128). All API calls fire in parallel, each with its own seed; results return as one IMAGE batch. | | system_instruction | STRING | (built-in) | System prompt that tells the model to always produce images. Customizable. | | top_p, top_k | FLOAT/INT | 1.0 / 32 | Nucleus and top-k sampling parameters for fine-tuning output diversity. | | harassment_threshold | COMBO | BLOCK_NONE | Safety filter for harassment content. Options: BLOCK_NONE, BLOCK_ONLY_HIGH, BLOCK_MEDIUM_AND_ABOVE, BLOCK_LOW_AND_ABOVE. | | hate_speech_threshold | COMBO | BLOCK_NONE | Safety filter for hate speech. | | sexually_explicit_threshold | COMBO | BLOCK_NONE | Safety filter for sexually explicit content. | | dangerous_content_threshold | COMBO | BLOCK_NONE | Safety filter for dangerous content. | | gcp_project_id | STRING | (auto) | Your GCP project ID. Leave blank to auto-detect. | | gcp_region | STRING | global | Vertex AI region. "global" uses Google's default routing. |
Outputs:
| Output | Type | Description | |--------|------|-------------| | image | IMAGE | Generated RGBA image tensor. | | text | STRING | Any text the model returned alongside the image. |
Built-in resilience: Automatic retry with exponential backoff on 429 (rate limit) and 503 (service unavailable) errors. Up to 3 retries.
DIGIT Veo Video
Generate videos using Google's Veo models directly through Vertex AI. Supports text-to-video, image-to-video, frame interpolation, and reference-based generation — all in one unified node.
The node auto-detects which mode to use based on what you connect:
- Nothing connected → text-to-video
- first_frame connected → image-to-video (animates from your image)
- first_frame + last_frame → interpolation (generates video between two frames)
- reference images connected → reference-based (generates video maintaining visual consistency with reference images)
Supported Models:
| Model | Internal Name | Description |
|-------|--------------|-------------|
| Veo 3.1 | veo-3.1-generate-preview | Latest and most capable. Default choice. |
| Veo 3.1 Fast | veo-3.1-fast-generate-preview | Faster generation, slightly lower quality. |
| Veo 3.0 | veo-3.0-generate-001 | Previous generation, very capable. |
| Veo 3.0 Fast | veo-3.0-fast-generate-001 | Fast version of Veo 3.0. |
| Veo 2.0 | veo-2.0-generate-001 | Older model, still available. |
Inputs:
| Input | Type | Default | Description |
|-------|------|---------|-------------|
| prompt | STRING | — | Video generation prompt. Required. |
| model | COMBO | veo-3.1-generate-preview | Which Veo model to use. |
| aspect_ratio | COMBO | 16:9 | 16:9 (landscape) or 9:16 (portrait). |
| resolution | COMBO | 720p | 720p or 1080p. |
| duration_seconds | INT | 8 | Video length: 4, 6, or 8 seconds. |
| generate_audio | BOOLEAN | true | Whether Veo generates synchronized audio. |
| seed | INT | 0 | Reproducibility seed. 0 = random. |
| first_frame | IMAGE | — | Starting frame for image-to-video mode. |
| last_frame | IMAGE | — | Ending frame for interpolation mode (requires first_frame). |
| reference1, reference2, reference3 | IMAGE | — | Reference images for style/asset consistency. Cannot be used with first_frame. |
| negative_prompt | STRING | — | What you don't want in the video. |
| person_generation | COMBO | allow_adult | "allow_adult" or "dont_allow". |
| sample_count | INT | 1 | Generate 1–4 videos per run. |
| compression_quality | COMBO | optimized | "optimized" = compressed MP4 in API response. "lossless" = full-quality MP4 written to your GCS bucket. |
| output_gcs_uri | STRING | — | GCS bucket path for lossless output, e.g. gs://my-bucket/output/. Required when using lossless compression. |
| enhance_prompt | BOOLEAN | true | Let Veo enhance your prompt for better results. |
| gcp_project_id | STRING | (auto) | Your GCP project ID. |
| gcp_region | STRING | us-central1 | Vertex AI region. |
Outputs:
| Output | Type | Description | |--------|------|-------------| | video | VIDEO | First generated video as a ComfyUI VIDEO type. | | video_paths | VEO_PATHS | List of all generated video file paths (for batch saving). | | status | STRING | Generation details: model, mode, duration, resolution, file paths. |
About lossless vs. optimized:
Every Veo video generation — whether through Google's AI Studio, the web console, Freepik, Weavy, or any other third-party tool — returns the optimized (compressed) version. The only way to get lossless output is through the API with a GCS bucket URI. This node is one of the only tools that gives you that option. You can be on your local Mac, a Linux workstation, or a cloud VM — it doesn't matter where you run ComfyUI. As long as the API call includes output_gcs_uri, the lossless file goes to your bucket.
Built-in resilience: Automatic retry with exponential backoff. 20-second polling interval for long-running operations. Multiple response parsing fallback paths for SDK version compatibility.
DIGIT Seedance Video
Node menu name: DIGIT Seedance Video (2.0 / 2.5) (class DigitDanceVideo, still called Digit Dance). Seedance 2.5 is the seedance-2.5 item on the model dropdown, not a separate node. Saved Digit Dance nodes pick up new model/duration lists after a pack update plus a browser hard-refresh.
Generate videos with ByteDance's Seedance 2.0 or 2.5 through your choice of three API providers — one node, one provider dropdown. Mode auto-detects from connected inputs, same as the Veo node:
- Nothing connected → text-to-video
- first_frame connected → image-to-video
- first_frame + last_frame → first/last-frame interpolation
- reference inputs connected → reference-to-video (up to 9 images, 3 videos, 3 audio; reference them in the prompt as
@Image1,@Video1,@Audio1) - source_video connected → video edit (Seedance 2.5). Set
video_tasktoextendto continue from the last frame instead.
Models: seedance-2.0 (default), seedance-2.0-fast (fal only, 480p/720p), seedance-2.5 (fal 480p/720p native; MUAPI 480p–4K, 30s clips, video edit/extend). Replicate is 2.0 only. MUAPI 2.5 1080p/4K endpoints are upscaled from 720p, not native 4K. 2.0 VIP 4K stays the native (and cheaper) 4K auto-route.
Providers:
| Provider | Env var | Content filtering | Notes |
|----------|---------|-------------------|-------|
| fal (default) | FAL_KEY | Strict — blocks real people and likenesses | Fastest queue. Supports seedance-2.0-fast and seedance-2.5 at 480p/720p. |
| muapi | MUAPIAPP_API_KEY | Low/reduced — people OK | Cheapest at 480p/720p on 2.0; the only low-censorship route to 1080p/4K. Seedance 2.5 is opt-in via the model dropdown. |
| replicate | REPLICATE_API_TOKEN | ByteDance stock filter — blocks sensitive content incl. people | Backup provider. Supports negative_prompt. 2.0 only. |
MUAPI auto-routing: artists pick a resolution and go. With muapi_route set to auto (the default), the node picks the cheapest low-censorship MUAPI endpoint for the requested (mode, resolution) on 2.0. Switch model to seedance-2.5 to use the 2.5 family instead (do not change 2.0 auto-routes — 2.5 is more expensive).
| Mode | 480p | 720p | 1080p | 4K | |------|------|------|-------|-----| | text-to-video | mini-spicy $0.08/s | mini-spicy $0.15/s | VIP $0.675/s | VIP $1.35/s | | image-to-video | mini-spicy $0.08/s | mini-spicy $0.15/s | VIP $0.675/s | VIP $1.35/s | | first/last frame | VIP fast $0.21/s | VIP fast $0.21/s | VIP $0.675/s | VIP $1.35/s | | reference (omni) | mini-omni $0.08/s | mini-omni $0.15/s | VIP $0.675/s | VIP $1.35/s |
Seedance 2.5 MUAPI (opt-in): $0.17/s 480p, $0.34/s 720p, $0.85/s 1080p (upscaled), $1.70/s 4K (upscaled). Video edit/extend: $0.1105 / $0.221 / $0.5525 / $1.105 per second, billed on source duration plus output duration.
mini/mini-spicy tiers only exist at 480p/720p; 1080p/4K upgrade automatically to VIP endpoints (also low censorship). The muapi_route dropdown is the escape hatch for forcing VIP priority queue, a specific 2.0 tier, or a 2.5 slug. All routing and pricing data lives in seedance_pricing.py — repricing is a one-file edit.
Live cost strip: the node shows a two-line estimate at the bottom that updates as you change provider, resolution, duration, or batch count:
Muapi · reduced filter · mini-spicy 720p
Est. $3.00 (4 clips × 5s)
fal and replicate answer from the static price table; muapi proxies its live estimate-cost endpoint with a static fallback. After a run, the status output records the actual Cost: and Route: lines.
Per-second price cheat sheet (text/image-to-video, no video refs):
| Provider | 480p | 720p | 1080p | 4K | |----------|------|------|-------|-----| | muapi (auto 2.0) | $0.08 | $0.15 | $0.675 | $1.35 | | muapi 2.5 | $0.17 | $0.34 | $0.85 | $1.70 | | replicate | $0.08 | $0.18 | $0.45 | $1.00 | | fal 2.0 | $0.14 | $0.30 | $0.68 | $1.56 | | fal 2.5 | $0.22 | $0.47 | — | — |
Replicate is cheaper than MUAPI at 1080p/4K — but only MUAPI passes people through its filter. Pick by content, not just price.
Other inputs: duration (4-15s on 2.0, 4-30s on 2.5, auto, or same_as_input which probes the first connected source/reference video). Video edit inherits the source length — use same_as_input or auto. MUAPI still needs a number except on video edit. aspect_ratio, generate_audio, bitrate_mode (2.0 fal + muapi), batch_count (1-8, submits all before polling), seed (fal + replicate; MUAPI Seedance 2.5 also accepts seed), negative_prompt (replicate only), video_task (auto / edit / extend when source_video is connected).
Outputs: video (first clip), video_paths (all clips, feed to Video Saver), status (provider, route, cost, per-job request IDs).
DIGIT MiniMax Video
Generate videos with MiniMax H3 (Hailuo 03) through fal or MUAPI — one node, one provider dropdown. Mode auto-detects from connected inputs, same as Seedance:
- Nothing connected → text-to-video
- first_frame connected → image-to-video
- first_frame + last_frame → first/last-frame interpolation
- reference inputs connected → reference-to-video (up to 9 images, 3 videos, 3 audio; cite them in the prompt as
Image 1,Video 1,Audio 1)
H3 outputs native stereo audio on every generation. There is no separate generate_audio toggle.
Providers:
| Provider | Env var | Notes |
|----------|---------|-------|
| fal (default) | FAL_KEY | minimax/h3/* endpoints. Supports 768P, 2K, and 4K. Optional enable_prompt_expansion and enable_safety_checker. |
| muapi | MUAPIAPP_API_KEY | minimax-h3-* endpoints. 2K only today. Offline pricing fallback in h3_pricing.py. |
| replicate | REPLICATE_API_TOKEN | Hidden until REPLICATE_MODEL is set in h3_models.py. |
Example workflow: workflows/minimax_h3_t2v.json
Smoke test: python scripts/manual/h3_smoke.py --provider fal (validates env, inputs, and live pricing without ComfyUI).
Live endpoint test (fal + MUAPI): exercises T2V, I2V, and R2V with a generated test image against real APIs:
export FAL_KEY=...
export MUAPIAPP_API_KEY=...
python scripts/manual/h3_integration_test.py
# Save MP4s locally, fal only, skip R2V:
python scripts/manual/h3_integration_test.py --provider fal --modes text_to_video,image_to_video --output-dir /tmp/h3-live
Pytest equivalent (skipped in CI by default; needs keys):
pytest -m integration tests/test_h3_integration_live.py -v --override-ini "addopts="
Architecture: validation and payload builders live in h3_payloads.py; provider I/O in h3_backends.py; shared download/retry helpers in digit_video_common.py.
Troubleshooting:
| Error | Fix |
|-------|-----|
| FAL_KEY environment variable is not set | Export FAL_KEY before starting ComfyUI. |
| MUAPI supports 2K only | Set resolution to 2K when using muapi. |
| Reference-to-video requires at least one reference_image or reference_video | Connect a reference image or video; audio alone is not enough. |
| Refusing to download from untrusted URL host | Provider returned an unexpected CDN URL; open an issue with the request ID from status. |
| Duration must be between 4 and 15 | Pick a duration in the supported range. |
Resolution: 768P, 2K, 4K on fal; MUAPI accepts 2K only.
Duration: 4–15 seconds (integer). Billed per second on fal ($0.26/s at 2K per fal's published rate).
Aspect ratio: Fixed ratios for text-to-video (adaptive rejected). Image-to-video and first/last-frame follow the source image. Reference mode supports adaptive.
Other inputs: batch_count (1–8), enable_prompt_expansion (fal only), enable_safety_checker (fal only). No seed input — fal and MUAPI H3 APIs do not expose seed control.
Live cost strip: updates as you change provider, resolution, duration, or batch count. fal uses the static price table in h3_pricing.py; muapi proxies its live estimate-cost endpoint.
Outputs: video (first clip), video_paths (all clips), status (provider, route, cost, per-job request IDs).
DIGIT MU Seedance 2 Character
Build a reusable character sheet from 1-3 reference images via MUAPI's seedance-2-character endpoint. Auth via MUAPIAPP_API_KEY. Outputs the character sheet IMAGE, its URL, the request ID, and a status string.
DIGIT LLM Query
Send text (and optionally images) to Gemini LLM models and get text responses. Useful for prompt engineering, image analysis, script writing, or any text generation task within a ComfyUI workflow.
Supported Models:
| Model | Internal Name | Description |
|-------|--------------|-------------|
| Gemini 3.1 Pro | gemini-3.1-pro-preview | Latest and most capable text model. Default. |
| Gemini 2.5 Pro | gemini-2.5-pro | Very strong, slightly older. |
| Gemini 2.5 Flash | gemini-2.5-flash | Fast and cost-effective. |
| Gemini 2.5 Flash Lite | gemini-2.5-flash-lite | Fastest and cheapest. |
Inputs:
| Input | Type | Default | Description | |-------|------|---------|-------------| | model | COMBO | gemini-3.1-pro-preview | Which Gemini text model to use. | | prompt | STRING | — | Your text prompt. Required. | | system_prompt | STRING | — | Optional system instructions to guide the model's behavior. | | image | IMAGE | — | Optional image input for vision/multimodal queries. | | max_tokens | INT | 1024 | Maximum response length. Range 1–8192. | | temperature | FLOAT | 0.7 | Creativity control. Range 0.0–2.0. | | gcp_project_id | STRING | (auto) | Your GCP project ID. | | gcp_region | STRING | (auto) | GCP region. |
Outputs:
| Output | Type | Description | |--------|------|-------------| | response | STRING | The model's text response. |
DIGIT SRT Maker
Automatically generate SRT subtitle files from scripts. Paste a Google Doc URL (private or public) or raw script text, and Gemini 3.1 Pro analyzes it to extract only the spoken dialogue — stripping out stage directions, scene headings, camera instructions, and action lines — then generates a properly timed SRT file.
How it works:
- Fetches the script from a Google Doc URL (using your GCP credentials for private docs) or accepts pasted text
- Sends the full script to Gemini 3.1 Pro with instructions to identify only spoken dialogue
- Gemini generates timed SRT subtitles based on natural speaking pace
- Saves the
.srtfile to your project'sassets/auto_srt/folder
Inputs:
| Input | Type | Default | Description |
|-------|------|---------|-------------|
| script_url | STRING | — | Google Doc URL or any web URL containing the script. Private Google Docs are supported via your gcloud auth login credentials. |
| extra_instructions | STRING | (built-in) | Instructions for Gemini about what to include/exclude. Default tells it to only extract spoken dialogue. Customize to filter by character, scene, etc. |
| words_per_second | FLOAT | 2.5 | Speaking rate for subtitle timing. 2.5 wps is natural conversational pace. Lower = slower reading, longer subtitles. |
| script_text | STRING | — | Paste script text directly instead of using a URL. Overrides the URL if both are provided. |
| projekts_root | COMBO | (auto) | PROJEKTS volume root. |
| project | COMBO | (auto) | Project folder (dynamic dropdown). |
| filename | STRING | dialogue | Output filename (without .srt extension). |
| gcp_project_id | STRING | (auto) | Your GCP project ID. |
| gcp_region | STRING | global | Vertex AI region. |
Outputs:
| Output | Type | Description | |--------|------|-------------| | srt_filepath | STRING | Full path to the saved .srt file. | | srt_text | STRING | Raw SRT content as text. |
Output path: PROJEKTS/project/assets/auto_srt/filename.srt
Google Docs authentication: For private docs, the node uses gcloud auth print-access-token from your gcloud auth login --enable-gdrive-access session to authenticate with the Google Drive API. If authenticated access fails, it falls back to public export.
DIGIT SRT From Video
Transcribe the audio from a video file into SRT subtitles using Gemini. Extracts audio via ffmpeg, sends it to Gemini for transcription with accurate timestamps, then runs a full post-processing pipeline before saving.
How it works:
- Extracts audio from the video with ffmpeg (mono 16kHz WAV — small and fast)
- Sends audio to Gemini for transcription with precise timestamps
- Runs the post-processing pipeline: hallucination removal → line-length enforcement → frame padding → snap-to-frame
- Optionally translates to another language
- Saves in your chosen format(s) (SRT, VTT, ASS, TXT, or all)
- Optionally burns subtitles directly into the video with full styling control
Inputs:
| Input | Type | Default | Description |
|-------|------|---------|-------------|
| video_path | STRING | — | Path to the video file. Browse button in the UI. |
| model | COMBO | gemini-2.5-flash | Gemini model for transcription. |
| subtitle_output | COMBO | srt_only | srt_only: sidecar file(s). burn_in_only: hardcode subs into video. both: file(s) + burned-in video. |
| extra_instructions | STRING | — | Additional instructions for Gemini (e.g. "ignore background music", "this is a commercial"). |
| projekts_root | COMBO | (auto) | PROJEKTS volume root. |
| project | COMBO | (auto) | Project folder (dynamic dropdown). |
| filename | STRING | transcription | Output filename (without extension). |
| gcp_project_id | STRING | (auto) | Your GCP project ID. |
| gcp_region | STRING | global | Vertex AI region. |
Post-processing inputs (optional):
| Input | Type | Default | Description |
|-------|------|---------|-------------|
| identify_speakers | BOOLEAN | true | Label different speakers as SPEAKER 1, SPEAKER 2, etc. |
| pad_frames | INT | 0 | Extend each subtitle by N frames on both head and tail. Gives captions breathing room. |
| frame_rate | FLOAT | 23.976 | Video frame rate. Used for pad_frames and snap-to-frame calculations. |
| snap_to_frames | BOOLEAN | false | Round all timestamps to nearest frame boundary. Prevents subtitle flicker on frame-accurate systems like Flame. |
| max_chars_per_line | INT | 42 | Maximum characters per subtitle line. 42 = Netflix/broadcast standard. 0 = no enforcement. Lines exceeding this are word-wrapped. |
| max_lines | INT | 2 | Maximum lines per subtitle entry. Entries exceeding this are split into multiple entries with proportional timing. |
| remove_hallucinations | BOOLEAN | true | Detect and remove repeated/hallucinated entries (common LLM transcription artifact). |
| output_format | COMBO | srt | srt, vtt, ass, txt, or all (saves all four formats). |
| language | COMBO | auto | Audio language. 30+ languages supported. auto = let Gemini detect. Specifying improves accuracy. |
| translate_to | COMBO | none | Translate subtitles after transcription. Preserves all SRT timing, only translates text. |
Burn-in styling inputs (optional):
| Input | Type | Default | Description | |-------|------|---------|-------------| | font_name | STRING | Arial | Font family for burned-in subtitles. | | font_size | INT | 24 | Font size (8–120). | | font_color | COMBO | white | Text color. 10 presets: white, yellow, cyan, green, red, orange, magenta, blue, black, gray. | | outline_color | COMBO | black | Outline/border color around text. | | outline_width | INT | 2 | Outline thickness (0–8). | | shadow_depth | INT | 1 | Drop shadow depth (0–8). | | position | COMBO | bottom_center | Where subtitles appear: bottom_center, bottom_left, bottom_right, top_center, top_left, top_right, middle_center. | | margin_v | INT | 30 | Vertical margin from screen edge in pixels (at 1080p). |
Outputs:
| Output | Type | Description | |--------|------|-------------| | srt_filepath | STRING | Path to the saved SRT file. | | srt_text | STRING | Raw SRT content as text. |
Output path: PROJEKTS/project/assets/auto_srt/filename.srt (and .vtt, .ass, .txt if using all format)
Burn-in output: When using burn_in_only or both, saves as PROJEKTS/project/assets/auto_srt/filename_subtitled.mp4 (preserves original video extension). If an ASS file exists (from all or ass format), it's used for burn-in with full styling. Otherwise, force_style is applied to the SRT.
DIGIT Batch SRT From Video
Batch version of SRT From Video. Point it at a folder and it recursively finds all video files, transcribes each one, and saves the output. Designed for processing dozens of files unattended.
How it works:
- Recursively scans the folder (and all subdirectories) for video files
- Filters by file type if specified (e.g. only
.mp4, skip.mov) - Skips files that already have output (unless overwrite is on)
- Transcribes each file through the same pipeline as the single-file node
- Shows progress bar in ComfyUI and per-file status in the log
Inputs (in addition to all post-processing and styling inputs from SRT From Video):
| Input | Type | Default | Description |
|-------|------|---------|-------------|
| video_folder | STRING | — | Top-level folder path. Browse button in UI. Scans recursively through all subdirectories. |
| file_types | COMBO | all | Filter: all, mp4, mov, mxf, mkv, avi, m4v, qt. Use this when you have MOVs and MP4s in the same folder and only want to process one type. |
| subtitle_output | COMBO | srt_only | Same as single-file node. |
| model | COMBO | gemini-2.5-flash | Gemini model. |
| output_mode | COMBO | alongside_video | alongside_video: saves .srt next to each video, wherever it lives in the tree. projekts_auto_srt: collects all output to one project folder. |
| overwrite | BOOLEAN | false | Skip files that already have output. Set to true to regenerate everything. |
| delay_seconds | FLOAT | 1.0 | Pause between API calls to avoid rate limiting. |
| gcp_project_id | STRING | (auto) | Your GCP project ID. |
| gcp_region | STRING | global | Vertex AI region. |
Outputs:
| Output | Type | Description | |--------|------|-------------| | log | STRING | Per-file status log with relative paths. Shows OK/SKIPPED/ERROR for each file. | | transcribed_count | INT | Number of files successfully transcribed. | | output_folder | STRING | The output directory path. |
Skip logic: The skip check is output-mode-aware. If subtitle_output is srt_only, it checks for the .srt file. If burn_in_only, it checks for the _subtitled video. If both, it requires both to exist before skipping. This means you can re-run after errors and it picks up only the failures.
Log format:
[1/27] 30_Hero_Pre/spot_01.mp4 -> OK (24 entries, .srt)
[2/27] 30_Hero_Pre/spot_02.mp4 -> SKIPPED (exists)
[3/27] Paid_Social/social_01.mp4 -> ERROR: ffmpeg audio extraction failed
DIGIT SRT Tools
Post-process and manipulate existing SRT files. Takes SRT text (pasted or from a file) and applies transformations. Use this to clean up, convert, or adjust subtitle files after generation or from external sources.
Actions:
| Action | Description |
|--------|-------------|
| post_process | Full pipeline: hallucination removal → line-length enforcement → frame padding → snap-to-frame. Same pipeline as the transcription nodes. |
| convert_format | Convert SRT to VTT, ASS/SSA, TXT, or all formats. ASS output includes full styling (font, color, outline, shadow, position). |
| time_offset | Shift all timestamps by N milliseconds. Positive = later, negative = earlier. Useful for syncing subtitles to re-edited video. |
| merge | Combine adjacent subtitle entries that have gaps smaller than a threshold (default 500ms). Reduces subtitle entry count for cleaner reading. |
| renumber | Re-number all entries sequentially starting from 1. Fixes gaps after manual editing or merging. |
Inputs:
| Input | Type | Default | Description |
|-------|------|---------|-------------|
| srt_input | STRING | — | Paste SRT text directly. |
| action | COMBO | post_process | Which operation to perform. |
| srt_filepath | STRING | — | Path to an SRT file. Browse button in UI. Overrides srt_input if provided. |
| save_filepath | STRING | — | Path to save output. Leave empty for text-only output (no file saved). |
| time_offset_ms | INT | 0 | Milliseconds to shift (for time_offset action). Range -600000 to +600000. |
| merge_gap_ms | INT | 500 | Maximum gap between entries to merge (for merge action). |
Plus all post-processing inputs (pad_frames, frame_rate, snap_to_frames, max_chars_per_line, max_lines, remove_hallucinations) and all styling inputs (for ASS format conversion).
Outputs:
| Output | Type | Description | |--------|------|-------------| | output_text | STRING | Processed SRT/VTT/ASS/TXT text. | | output_filepath | STRING | Path to saved file (if save_filepath was set). | | log | STRING | Summary of what was done. |
DIGIT SRT Preview
Validate and QA-check SRT subtitle files. Shows a summary with entry count, duration, and character stats, plus warnings for common issues.
What it checks:
| Check | Description | |-------|-------------| | Overlapping timestamps | Entries where the start time is before the previous entry's end time. | | Long lines | Lines exceeding max_chars_per_line (default 42, Netflix/broadcast standard). | | Too many lines | Entries with more than 2 lines of text. | | Reading speed (CPS) | Characters per second exceeding max_cps (default 20, Netflix adult standard). Subtitle is on screen too briefly for comfortable reading. | | Bad timing | Entries with zero or negative duration. |
Inputs:
| Input | Type | Default | Description | |-------|------|---------|-------------| | srt_input | STRING | — | Paste SRT text directly. | | srt_filepath | STRING | — | Path to an SRT file. Browse button in UI. Overrides srt_input if provided. | | max_chars_per_line | INT | 42 | Flag lines exceeding this length. 0 = no check. | | max_cps | FLOAT | 20.0 | Flag entries with reading speed above this (characters per second). 0 = no check. Netflix standard: 20 CPS adult, 17 CPS children. |
Outputs:
| Output | Type | Description | |--------|------|-------------| | summary | STRING | Entry count, duration, character stats, warning count. | | entry_count | INT | Number of subtitle entries. | | warnings | STRING | All warnings, one per line. Empty if no issues found. |
Summary format:
Entries: 47
Duration: 2m 34s
Total characters: 3842
Avg chars/entry: 81
Warnings: 3
DIGIT Uber Saver
One node to rule them all. Connect an image or video, pick the destination, and save it with the same pipeline naming rules.
Visible controls:
| Input | Type | Description |
|-------|------|-------------|
| media | IMAGE, VIDEO, or VIDEO_PATHS | Image, image batch, video, or video-path batch. |
| project | COMBO | Existing #####_ project. |
| shot | COMBO | Existing shot, or make one with + Shot. |
| folder | COMBO | Existing path under the shot, or make one with + Folder. Paths can be eight levels deep. |
| name | STRING | File name without frame or extension. Empty uses PREFIX_SHOT_FOLDER. |
| Next output | READ ONLY | Full path and next available frame before saving. |
Advanced contains the PROJEKTS root, image format, JPEG quality, EXR tone mapping, start frame, frame padding, preview, and workflow metadata. Video always saves as MP4.
After saving, the node shows the saved path and advances Next output to the next frame.
DIGIT Image Saver
Save images to a VFX-pipeline folder structure with auto-incrementing frame numbers. Designed for production workflows where files need to follow a strict naming and directory convention.
Inputs:
| Input | Type | Default | Description |
|-------|------|---------|-------------|
| image | IMAGE | — | Image to save. Batch images save as sequential frames. |
| projekts_root | COMBO | (auto) | PROJEKTS volume root. Auto-detects available mount points. |
| project | COMBO | (auto) | Project folder (dynamic dropdown, scans for #####_ prefix pattern). |
| shot | STRING | — | Shot folder. Type a new name and click Create shot, or pick from the live list. |
| subfolder | STRING | comfy | Subfolder within the shot (e.g. "comfy", "renders", "plates"). Type a name, or pick from the live list. |
| task | STRING | comp | Task name (e.g. "comp", "paint", "roto"). Type a name, or pick from the live list. |
| format | COMBO | png | Output format: PNG, JPEG, or EXR. |
| tonemap | COMBO | linear | EXR tone mapping: linear, sRGB, or Reinhard. Only applies to EXR format. |
| quality | INT | 95 | JPEG quality (1–100). Only applies to JPEG format. |
| start_frame | INT | 1001 | Starting frame number if no existing frames are found. |
| frame_pad | INT | 4 | Frame number padding (e.g. 4 = 0001, 8 = 00000001). |
| show_preview | BOOLEAN | true | Show saved image in ComfyUI's preview panel. |
| save_workflow | COMBO | ui | Save workflow metadata as JSON sidecar: "ui", "api", "ui + api", or "none". |
Output path: PROJEKTS/project/shots/shot/subfolder/task/PREFIX_SHOT_TASK.FRAME.EXT
Example: ~/PROJEKTS/10001_my_project/shots/sh010/comfy/comp/10001_sh010_comp.1001.png
EXR support: Full 32-bit float EXR with OpenCV. Supports RGBA with inverted alpha (VFX convention). Tone mapping options let you convert from sRGB gamma space to linear on save.
Batch support: If a batched IMAGE tensor is connected (e.g. from a batch generation), each image in the batch is saved as a sequential frame.
Failure modes: A shot or project still set to (no shots found) raises instead of creating a junk folder. Path segments with / or .. are rejected. Changing project reloads that project's shots. Click Create shot to mkdir a typed name. The status line shows PROJEKTS OK — N projects or a storage error.
DIGIT Video Saver
Save videos to the same VFX-pipeline folder structure as the Image Saver. Accepts either a single VIDEO or a batch of video file paths from the Veo node.
Inputs:
| Input | Type | Default | Description | |-------|------|---------|-------------| | projekts_root | COMBO | (auto) | PROJEKTS volume root. | | project | COMBO | (auto) | Project folder (dynamic dropdown). | | shot | STRING | — | Shot folder. Type a new name and click Create shot, or pick from the live list. | | subfolder | STRING | comfy | Subfolder within the shot. | | task | STRING | comp | Task name. | | start_frame | INT | 1001 | Starting frame number. | | frame_pad | INT | 4 | Frame number padding. | | save_workflow | COMBO | ui | Save workflow metadata as JSON sidecar: "ui", "api", "ui + api", or "none". | | video | VIDEO | — | Single video input (from Veo node's VIDEO output). | | video_paths | VEO_PATHS | — | Batch video paths (from Veo node's VEO_PATHS output). Saves all videos with incrementing frame numbers. |
Output path: PROJEKTS/project/shots/shot/subfolder/task/PREFIX_SHOT_TASK.FRAME.mp4
Batch support: Connect the video_paths output from the Veo node and all generated videos (up to 4) are saved with sequential frame numbers.
Failure modes: Same pipeline guards as Image Saver. Placeholder shot names and path traversal raise. Changing project reloads that project's shots. Click Create shot to mkdir a typed name.
DIGIT Image Loader
Load the latest rendered frame from a shot/task directory. Pairs with the Image Saver — point both at the same shot and task to always have the most recent output available as an IMAGE tensor.
Inputs:
| Input | Type | Default | Description |
|-------|------|---------|-------------|
| projekts_root | COMBO | (auto) | PROJEKTS volume root. |
| project | COMBO | (auto) | Project folder (dynamic dropdown). |
| shot | STRING | — | Shot folder. Type a new name and click Create shot, or pick from the live list. |
| subfolder | STRING | comfy | Subfolder within the shot. |
| task | STRING | comp | Task name. |
| format | COMBO | png | File format to scan for: png, jpg, exr, tif, tiff, webp. |
| frame_mode | COMBO | latest | latest loads the highest frame number. pinned loads the exact frame. |
| frame | INT | 1001 | Used when frame_mode is pinned. |
| on_missing | COMBO | error | error raises when no frame is found. blank returns a 1x1 black image. |
| browse_path | STRING | — | Absolute path inside a PROJEKTS root. Highest priority. |
| filepath | STRING | — | Optional direct filepath input. If connected from a Saver node, loads that specific file instead of scanning. |
Outputs:
| Output | Type | Description | |--------|------|-------------| | image | IMAGE | Loaded image as a ComfyUI tensor. | | filepath | STRING | Full path to the loaded file. | | frame | INT | Frame number of the loaded file. |
Load order: browse_path (must stay inside PROJEKTS) → upload → connected filepath → pipeline scan.
Smart loading: latest finds the highest-numbered frame in the target directory. pinned loads one frame number. If a filepath is connected (e.g. from the Image Saver's output), it loads that exact file instead.
EXR support: Full 32-bit float EXR loading with OpenCV. BGRA to RGBA conversion and alpha un-inversion handled automatically.
DIGIT Drag Crop
Interactive image cropping with a drag-and-drop crop box directly on the node's image preview. No more guessing pixel coordinates — drag to select, resize with handles, and the cropped region updates in real time.
Features:
- Drag to crop — Click and drag anywhere on the preview to create a new crop region
- Resize handles — Corner and edge handles for precise resizing
- Move — Drag inside the crop box to reposition it
- Aspect ratio locking — Enter values like
16:9,2.35, or0.5and toggle the lock to constrain the crop box - Pixel snapping — Snap crop dimensions to grids of 2, 4, 8, 16, 32, or 64 pixels
- Box color — 11 preset colors (Lime, Grey, White, Black, Red, Green, Blue, Yellow, Magenta, Cyan, Hot Pink)
- Info overlay — Shows crop dimensions in pixels and percentage on the crop box. Toggle on/off.
- Resolution tracking — Automatically resets crop when the input image resolution changes
- Mask pass-through — Optional mask input is cropped to match the image crop region
Inputs:
| Input | Type | Description | |-------|------|-------------| | image | IMAGE | Image to crop. Run the graph once to load the preview. | | crop_left/right/top/bottom | INT | Numeric crop offsets (also adjustable via the interactive UI). | | mask | MASK | Optional mask that gets cropped to match. |
Outputs:
| Output | Type | Description | |--------|------|-------------| | IMAGE | IMAGE | Cropped image. | | MASK | MASK | Cropped mask (or zero mask if none connected). | | CROP_JSON | STRING | JSON with all crop coordinates and dimensions. |
Note: You must run the graph once before the interactive preview appears. This is a technical limitation of ComfyUI's widget system — the node needs to receive image data from upstream before it can display anything.
DIGIT Crop Info
Companion node for DIGIT Drag Crop. Takes the CROP_JSON string output and breaks it into individual integer values for use in other nodes.
Inputs:
| Input | Type | Description | |-------|------|-------------| | crop_json | STRING | CROP_JSON output from the Drag Crop node. |
Outputs:
| Output | Type | Description | |--------|------|-------------| | left | INT | Left crop offset in pixels. | | top | INT | Top crop offset in pixels. | | right | INT | Right crop offset in pixels. | | bottom | INT | Bottom crop offset in pixels. | | width | INT | Cropped region width in pixels. | | height | INT | Cropped region height in pixels. | | csv | STRING | All values as comma-separated string. | | pretty | STRING | Human-readable formatted string. |
DIGIT GPT Image
Generate and edit images with OpenAI GPT Image 2 via fal.ai. Auth via FAL_KEY.
Mode auto-detects from inputs:
- No images connected → text-to-image (
openai/gpt-image-2) - image1–image16 connected → edit (
openai/gpt-image-2/edit); optional mask for inpainting
Models: gpt-image-2 (default)
Key inputs: prompt, model, image_size (auto, square_hd, portrait_16_9, landscape_16_9, custom, etc.), quality (auto/low/medium/high), output_format (png/jpeg/webp), num_images (1–4 per call), batch_count (1–128 parallel jobs), seed, image1–image16, mask (inpainting), custom_width/custom_height (multiples of 16, max edge 3840).
Outputs: image (IMAGE batch), status (job IDs, cost, errors).
Built-in resilience: Up to 3 automatic retries; content-policy errors (422) are not retried.
DIGIT Seedream Image
ByteDance Seedream 5.0 image generation via fal.ai. Auth via FAL_KEY.
Mode auto-detects:
- No images → text-to-image
- image1–image10 connected → edit
Models:
| Model | Endpoint | Notes |
|-------|----------|-------|
| seedream-5.0-pro | Pro text-to-image / edit | auto_1K/auto_2K sizes; output_format (jpeg/png) |
| seedream-5.0-lite | Lite text-to-image / edit | auto_2K–auto_4K; max_images up to 4 per call |
Key inputs: prompt, model, image_size, batch_count (1–128), seed, image1–image10, custom_width/custom_height, max_images (lite only).
Outputs: image, status.
DIGIT Batch Gemini Image
Batch Gemini image generation across a folder of source images with optional LLM-driven prompt variation. Uses Vertex AI (same auth as Gemini Image).
How it works:
- Scans a source folder for images (optionally filtered by extension)
- For each image, optionally varies the prompt via Gemini LLM before generation
- Runs generation with the same model/resolution/safety controls as DIGIT Gemini Image
- Saves outputs to a destination folder with progress bar
Key inputs: source_folder, output_folder, prompt, model, aspect_ratio, resolution, variation_mode (none/fixed/llm), variation_prompt, batch_per_image, overwrite, file_types, safety thresholds, gcp_project_id, gcp_region.
Outputs: log, generated_count, output_folder.
DIGIT Gemini Omni Video
Conversational video generation via Vertex AI's Interactions API (gemini-omni-flash-preview). Supports stateful follow-up edits through previous_interaction_id.
Tasks (or auto to detect from inputs):
| Task | Trigger |
|------|---------|
| text_to_video | Prompt only |
| image_to_video | first_frame connected |
| reference_to_video | reference1–reference7 connected |
| edit | source_video connected |
Key inputs: prompt, model, aspect_ratio (16:9/9:16), duration_seconds (3–10), sample_count (1–8 concurrent jobs), task, seed, first_frame, source_video, reference1–reference7, previous_interaction_id, delivery (inline/uri), output_gcs_uri (required for uri delivery), store, background, gcp_project_id, gcp_region.
Outputs: video (list), video_paths, status, interaction_id (pass to a follow-up run for conversational edits).
DIGIT Random Prompt
Builds randomized cinematic image prompts from curated category pools: setting, location, time of day, weather, mood, camera body, lens, film stock, lighting, composition, color palette, and subject modifiers.
Inputs: seed (0 = random each run), toggles to enable/disable individual categories, custom_prefix/custom_suffix.
Outputs: prompt (STRING), seed_used (INT).
Use with Prompt Combine and Text Encode for full prompt-to-conditioning pipelines.
DIGIT Prompt Combine
Joins multiple text inputs into a single prompt string. Empty inputs are skipped.
Inputs: separator (default ", "), optional trigger (from LoRA Loader), prompt_1–prompt_3 (connectable), prefix, suffix (typed on node).
Outputs: prompt (STRING). Shows combined text in the node UI.
DIGIT Text Encode
CLIP text encode with text as a connectable input (no widget conversion needed). Drop-in replacement for the stock Text Encode when wiring prompts from other DIGIT nodes.
Inputs: clip (CLIP model), text (STRING, connectable).
Outputs: conditioning.
DIGIT Batch Caption
Caption a folder of images using Gemini via Vertex AI. Writes a .txt sidecar next to each image.
Caption styles: descriptive_formal, descriptive_casual, training_detailed, training_concise, booru_tags, prompt_style, custom.
Caption lengths: short (<75 words), medium (75–200), long (200–500), any.
Key inputs: image_folder, caption_style, caption_length, custom_system_prompt, custom_prompt, model, max_tokens, temperature, overwrite, delay_seconds, file_types, gcp_project_id, gcp_region.
Outputs: log, captioned_count, folder_path (connect to Caption Viewer).
DIGIT Caption Viewer
Step through image + caption pairs in a dataset folder for QA review.
Inputs: dataset_folder, index (0-based, wraps), optional folder_path (from Batch Caption output).
Outputs: image, caption, filename, status, total. Shows preview on the node.
DIGIT Caption Find & Replace
Bulk find/replace across all .txt caption files in a folder. Supports prefix/suffix append after replacement.
Inputs: caption_folder, find_text, replace_text, case_sensitive, dry_run (preview without writing), prefix_text, suffix_text.
Outputs: log, modified_count.
DIGIT Dataset Prep
Resize and prepare a folder of images for LoRA training. Copies matching .txt captions to the output folder.
Resize modes: fit (maintain aspect, no crop), fill_crop (center crop), stretch, pad (solid color).
Key inputs: source_folder, output_folder, resolution, resize_mode, output_format (png/jpg), quality, overwrite, copy_captions, pad_color_r/g/b.
Outputs: log, processed_count.
DIGIT LoRA training suite
Full LoRA training pipeline for Flux and Qwen models. Requires training dependencies: pip install -r requirements-training.txt.
Set DIGIT_DATASET_BASE to override the default dataset root (~/datasets).
| Node | Purpose |
|------|---------|
| DIGIT Dataset Manager | scan, create, validate, or stats on a training dataset. Create copies images from a source path, filters by min resolution. |
| DIGIT Captioner | Auto-caption dataset images via Gemini. Actions: caption_all, caption_uncaptioned, caption_single, recaption_all, preview. Supports saved caption presets. |
| DIGIT Caption Preset Manager | Save/load/list/delete caption presets (system prompt, template, model, temperature, example captions). |
| DIGIT LoRA Trainer | Train LoRA adapters. Actions: train, stop, status, load_preset, save_preset, list_presets, list_runs. Models: flux1-dev, flux1-schnell, flux2, flux2-klein, qwen. Writes digit_metadata.json with trigger info. |
| DIGIT LoRA Loader | Load a trained DIGIT LoRA from the ComfyUI loras folder (or path override). Returns lora_path, trigger_word, trigger_class, trigger_phrase, metadata. |
| DIGIT Naming Preset | Template presets for output directory and checkpoint naming ({name}_{model}_r{rank}_{date}, etc.). |
| DIGIT Trigger Preset | Save/load trigger word + class noun combinations for training runs. |
| DIGIT Sample Prompt Preset | Save/load sample prompt lists used during training for preview image generation. |
YAML configs in configs/ (default.yaml, flux1_style.yaml, flux1_subject.yaml) provide starting points. See workflows/lora_training_pipeline.json for a complete example workflow.
DIGIT LoRA Loader
Loads LoRAs into ComfyUI pipelines with automatic trigger-word extraction from safetensors metadata. Supports AI Toolkit, Kohya/sd-scripts, SimpleTuner, and modelspec formats — no external metadata files required.
Variants:
- DIGIT LoRA Loader — applies LoRA to
model+clip - DIGIT LoRA Loader (Model Only) — applies to
modelonly
Inputs: model, clip (full loader only), lora_name (dropdown from loras folder), strength_model, strength_clip.
Outputs: model, clip (full loader), trigger_word, metadata_json. Connect trigger_word to Prompt Combine.
DIGIT ElevenLabs suite
Direct ElevenLabs API access — no ComfyUI org proxy. Auth via DIGIT_ELEVENLABS_API_KEY or ELEVENLABS_API_KEY.
| Node | What it does |
|------|-------------|
| Voice Selector | Pick from 22 predefined voices; outputs voice_id for downstream nodes. |
| Text to Speech | Convert text to audio. Models: eleven_multilingual_v2, eleven_v3. Controls: stability, similarity_boost, speed, style, speaker boost, language code, output format. |
| Speech to Text | Transcribe audio with scribe_v2. Optional diarization, word timestamps, audio event tags. |
| Sound Effects | Generate SFX from a text description. Duration 0.5–30s, optional seamless loop. |
| Voice Isolation | Strip background noise; returns isolated voice audio. |
| Voice Clone | Clone a voice from a short audio sample. Returns voice_id for TTS/STS. |
| Speech to Speech | Convert spoken audio to a different voice while preserving delivery. |
| Dialogue | Multi-speaker dialogue generation from a script with per-line voice assignment. |
All audio nodes output ComfyUI AUDIO type (PCM 44.1kHz by default).
Shade integration
Shade.inc filespace integration for LucidLink-style project drives on render VMs.
Environment variables: SHADE_API_KEY, SHADE_WORKSPACE_ID, SHADE_DB_DIR, SHADE_MOUNT_BASE, SHADEFS_BIN.
| Node | What it does |
|------|-------------|
| Shade Mount | Lists drives from the Shade API, configures and mounts the selected drive via shadefs. Outputs mount_path (e.g. /Volumes/shade/my_project). |
| Save to Shade | Writes images or video clips to <mount_path>/output/ with auto-incrementing filenames. |
DIGIT Drift QC
VFX/automotive QC gates that compare a reference plate to a generated image and reject on drift.
DIGIT Drift Gate — compares reference vs generated IMAGE tensors. Resize-aligns with configurable resize_mode and fit_method (stretch/letterbox/crop_center). Scores drift confidence using pixel SSIM + edge-sensitive SSIM (catches badge, logo, and typography drift). Rejects when confidence falls below threshold.
Outputs: passed, confidence, drift_report, qc_json, qc_filepath, gated_image (generated if passed, blank if failed), qc_sheet, diff_heatmap, edge_diff, reference_aligned, generated_aligned.
DIGIT Drift Gate (Paths) — same comparison but loads images from file paths instead of IMAGE tensors. Useful when reference plates live on disk.
DIGIT Drift QC Preview — interactive review node wired after Drift Gate. Cycle layers (reference, generated, pixel diff, edge diff, annotated) or A/B blink. Draws red hotspot circles on failed regions parsed from qc_json.
DIGIT Console Doctor
Reads ComfyUI's in-memory log buffer, filters by severity, and sends errors to Gemini for diagnosis.
Log levels: errors_only, warnings_and_errors, all.
Inputs: log_level, max_entries, node_filter (optional node name substring), extra_context, model, gcp_project_id, gcp_region.
Outputs: diagnosis (plain-language explanation + fix suggestions), error_count, log_excerpt.
Identifies Python tracebacks, missing modules (suggests pip install), CUDA/VRAM errors, and node execution failures.
DIGIT Frame Size
Resolution preset picker organized by size tier (Large / Medium / Small) and aspect ratio.
Presets include: square 1:1, photo 4:5/5:4, standard 4:3/3:4, classic 3:2/2:3, HD 16:9/9:16 (up to 4K), ultrawide 21:9, anamorphic 2.39:1, IMAX 1.43:1, SD 480p.
Inputs: preset (dropdown), optional width_override/height_override (non-zero overrides preset).
Outputs: width, height, megapixels (STRING).
Installation
From ComfyUI Manager (Recommended)
- Open ComfyUI Manager
- Search for
comfyui-digit - Click Install
- Restart ComfyUI
All nodes will appear under the DIGIT category (and DIGIT/ElevenLabs for ElevenLabs nodes).
Manual
cd ComfyUI/custom_nodes
git clone https://github.com/thedepartmentofexternalservices/comfyui-digit.git
cd comfyui-digit
pip install -r requirements.txt
Deploy to every ComfyUI install
Fleet machines must track GitHub master, not a SHA pin. From a machine with gcloud access:
gcloud config set project YOUR_PROJECT_ID
./scripts/deploy-gcp-comfyui.sh
That resets every comfyui-digit checkout on each running comfy* VM to origin/master (cherry-picks included) and restarts comfyui. Stopped VMs are listed, not started.
To pin ComfyUI core to 0.15.1 (fixes the Travis LoadImage missing-node dialog):
USE_IAP=1 ./scripts/deploy-gcp-comfyui-core.sh
That checks out tag v0.15.1 (3dd10a59) under /opt/comfyui, upgrades the 0.15.1 frontend packages, and restarts comfyui. Bump comfyui_version in digit-infra-ansible to the same tag or the next --tags comfyui play rewinds the fleet.
On Flame, studio, or a Mac (paths auto-discovered, including Easy-Install):
./scripts/sync-comfyui-digit.sh
Common overrides:
# Match instances by label instead of name
INSTANCE_FILTER="labels.app=comfyui" ./scripts/deploy-gcp-comfyui.sh
# Private VMs without external IPs
USE_IAP=1 ./scripts/deploy-gcp-comfyui.sh
# Pin the remote path instead of auto-discovery
DIGIT_NODE_DIR="/opt/comfyui/custom_nodes/comfyui-digit" ./scripts/deploy-gcp-comfyui.sh
Artists: hard-refresh the ComfyUI tab after the service comes back. Ansible must use version: master and force: true so the next custom_nodes play does not rewind the fleet. See ansible/README.md.
GCP Setup
DIGIT Nodes require a Google Cloud project with Vertex AI enabled. Setup takes about 2 minutes.
1. Install the Google Cloud SDK
https://cloud.google.com/sdk/docs/install
2. Authenticate
# Log in to your Google account
gcloud auth login --enable-gdrive-access
# Set up application default credentials (for Vertex AI)
gcloud auth application-default login
# Set your default project
gcloud config set project YOUR_PROJECT_ID
gcloud auth application-default set-quota-project YOUR_PROJECT_ID
3. Enable APIs
gcloud services enable aiplatform.googleapis.com
gcloud services enable drive.googleapis.com
4. (Optional) Create a GCS bucket for lossless Veo output
gcloud storage buckets create gs://your-bucket-name --location=us-central1
5. Use in ComfyUI
Set gcp_project_id on any DIGIT node, or leave it blank if running on a GCP instance (auto-detected via metadata service).
Project Folder Structure
The Image Saver, Video Saver, and Image Loader nodes use a VFX-pipeline folder convention:
PROJEKTS_ROOT/
PROJECT_NAME/ (e.g. 10001_my_project)
shots/
SHOT_NAME/ (e.g. sh010)
SUBFOLDER/ (e.g. comfy)
TASK/ (e.g. comp)
PREFIX_SHOT_TASK.FRAME.EXT
Example paths:
~/PROJEKTS/10001_my_project/shots/sh010/comfy/comp/10001_sh010_comp.1001.png
~/PROJEKTS/10001_my_project/shots/sh010/comfy/comp/10001_sh010_comp.1001.mp4
~/PROJEKTS/10001_my_project/assets/auto_srt/dialogue.srt
The SRT nodes (SRT Maker, SRT From Video) save to PROJECT/assets/auto_srt/ instead of the shots hierarchy. The Batch SRT From Video node can save either alongside each video or to the auto_srt folder.
Configuring PROJEKTS roots:
Set the DIGIT_PROJEKTS_ROOTS environment variable to a colon-separated list of paths:
export DIGIT_PROJEKTS_ROOTS="/mnt/storage/PROJEKTS:/Volumes/shared/PROJEKTS"
If not set, the node auto-detects common mount points or falls back to ~/PROJEKTS.
Project folders must follow the #####_name pattern (5-digit prefix) to appear in the dropdown menus.
Trace a generated file back to its workflow
DIGIT savers write a *_ui.json workflow sidecar beside the first output in a
batch. Start there when you need the prompt, model settings, or input filenames
used to create a saved file.
For a completed render on a Comfy server:
- Find its Comfy prompt UUID:
journalctl -u comfyui --since today | grep "DigitBrokerHook.*Reported prompt" - Query the full prompt before Comfy history rotates:
curl -s "http://127.0.0.1:8188/history/<prompt_id>" - Check the saved output's
*_ui.jsonsidecar for durable workflow metadata.
Provider request IDs (MUAPI, fal, or Replicate) are not Comfy prompt IDs.
journalctl records timing and provider events, but it does not contain the
full workflow payload.
The studio paths map as follows:
/Volumes/saint/goose/PROJEKTS/... <-> /mnt/lucid/PROJEKTS/...
Check mount health and scan latency with:
curl -s http://127.0.0.1:8188/digit/health
journalctl -u comfyui --since today | grep -E "projekts_listdir_retry|projekts_scan_error"
Node deprecation policy
Major version bumps may rename or merge node classes. To keep artist workflows loading:
- Aliases stay registered for at least one major cycle. Example:
DigitReplicateSeedance(removed in v4.0.0) was restored in v4.0.1 and will stay until v5.0.0. - Saved workflow JSON keeps working. Alias nodes keep their original widget layout and forward to the replacement node at runtime.
- Release notes call out every rename. Deprecated aliases show
[deprecated]in the ComfyUI node picker. - Migration map lives in
legacy_aliases.py.
| Old class id | Replacement | Removed in | Alias removed in |
|--------------|-------------|------------|------------------|
| DigitReplicateSeedance | DigitDanceVideo (set provider=replicate) | v4.0.0 | v5.0.0 (planned) |
Dependencies
| Package | Purpose |
|---------|---------|
| google-genai | Official Google GenAI SDK for Gemini and Veo via Vertex AI |
| google-auth | GCP authentication and credential management |
| google-cloud-storage | GCS bucket access for lossless Veo output |
| fal-client | fal.ai API client for GPT Image, Seedream Image, and Seedance Video |
| replicate | Replicate API client for Seedance Video (replicate provider) |
| soundfile | Audio I/O for ElevenLabs nodes |
| piexif | EXIF metadata embedding in JPEG files |
| opencv-python | EXR file reading and writing |
| pyyaml | YAML config parsing for LoRA training |
| requests | HTTP requests for LLM Query, ElevenLabs, and MUAPI nodes |
| ffmpeg (system) | Audio extraction for SRT From Video nodes. Must be on PATH. |
Training dependencies (optional, for LoRA training nodes): install with pip install -r requirements-training.txt. Includes torch, diffusers, transformers, peft, accelerate, bitsandbytes, tensorboard, wandb, safetensors.
License
MIT
Built by DIGIT