James VeitchandClaude Sonnet 4.6 ca1c35a3cf docs: automate README screenshots with Playwright from live ComfyUI harness
Replace hand-crafted PowerPoint exports with Playwright-generated screenshots
taken from the actual running Docker test harness:

- scripts/take_screenshots.py: headless Chromium via Playwright; creates nodes
  programmatically via LiteGraph/window.app, triggers updateNodeConfig() for
  FormatString's dynamic socket update, then crops tightly around each node
- docs/assets/: four screenshots (fstring, jinja2, random, circuit_breaker)
  replacing the old 1920×1080 PowerPoint exports (90%+ smaller, more accurate)
- Justfile: add `screenshots` recipe (starts harness if needed, waits healthy,
  runs the script)
- README.md: rewrite to cover all three nodes including Circuit Breaker;
  fix stale dependency list (was listing rich/colorama/termcolor which we
  removed in spec 001); add ComfyUI Manager install path
- pyproject.toml + uv.lock: add playwright to [dev] dependencies

Run: just screenshots

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RWysE6jYn4YjNorLBQ1cXb
2026-06-28 21:52:45 +01:00
2025-03-27 13:49:00 +00:00
2025-03-27 13:49:00 +00:00
2025-03-27 13:49:00 +00:00

comfydv

A collection of workflow efficiency and quality-of-life nodes built out of necessity for personal ComfyUI use.

What is this?

comfydv fills gaps in ComfyUI's built-in node library: dynamic string formatting, seed-controlled random selection, and graceful workflow interruption. Install it once and connect the nodes like any other — no Python knowledge required.

Node What it does
Format String Formats a string from a Python f-string or Jinja2 template. Detects variables in the template and automatically adds/removes input sockets.
Random Choice Accepts any number of typed inputs and outputs one at random, with a configurable seed for reproducibility.
Circuit Breaker Halts the current ComfyUI queue run gracefully without crashing the server. Wire the status toggle to a boolean condition to skip the rest of the queue when a condition isn't met.

Install

Via ComfyUI Manager (recommended): search for comfydv and click Install.

Manual:

cd /path/to/ComfyUI/custom_nodes
git clone https://github.com/darth-veitcher/comfydv.git

Restart ComfyUI. The nodes appear under the dv/ category in the node menu. The only runtime dependency is jinja2, which is installed automatically via requirements.txt.

Documentation

Full documentation: darth-veitcher.github.io/comfydv


Format String

Formats text from a Python f-string or Jinja2 template. As you type the template, input sockets appear and disappear automatically — one per variable detected.

Python f-strings

Type {variable_name} and a socket appears. Wire it to any string output in your workflow.

Format String — f-string mode

Outputs are always in a stable order:

Output Content
formatted_string The rendered result
saved_file_path Path written to disk (if save_path is set)
<var> … Pass-through of each input value, for easy chaining

Jinja2 templates

Switch template_type to Jinja2 to unlock filters (| upper, | int, …), conditionals ({% if %}…{% endif %}), and loops.

Format String — Jinja2 mode

Variables detected in {{ }} expressions become input sockets exactly as in Simple mode. See the Jinja2 documentation for the full filter/test reference.


Random Choice

Connect any number of inputs of the same type. Each run picks one at random. Set seed for reproducibility.

Random Choice

  • Accepts any ComfyUI type (STRING, IMAGE, CONDITIONING, …)
  • Add as many inputs as you like; unused slots are removed automatically when disconnected
  • seed = 0 randomises on every run; any other value locks the selection

Circuit Breaker

Stops the queue gracefully when a condition isn't met — no crash, no error, just a clean halt.

Circuit Breaker

Wire an image (or any trigger) into trigger and a boolean into status. When status is false the node raises InterruptProcessingException, which tells ComfyUI to stop the current run cleanly. When status is true the image passes through unchanged.

Typical use: skip an expensive upscale step when a quality-check node says the draft is already good enough.

S
Description
No description provided
Readme AGPL-3.0
7 MiB
Languages
Python 81.3%
Shell 10.2%
JavaScript 4.3%
Gherkin 3.6%
Just 0.4%
Other 0.2%