Nodes/ControlFlowUtils/πŸ‘β€πŸ—¨Data Monitor ⁄ Generator ⁄ Converter
ComfyUI Node

πŸ‘β€πŸ—¨Data Monitor ⁄ Generator ⁄ Converter

ComfyUI's Swiss Army Knife for Looking At and Changing Data

By VykosXΒ·Created 2 years agoΒ·Updated 2 years agoΒ· 147
πŸ‘β€πŸ—¨Data Monitor ⁄ Generator ⁄ Converter
  • passthrough
  • aux
  • aux2
  • aux3
  • aux4
  • aux5
  • output
β—„textβ–Ί
β—„output_typeβ–Ύβ–Ί

ComfyUI gives you terrible visibility into what's actually flowing through your wires. Data Monitor (πŸ‘οΈπŸ—¨οΈ Data Monitor / Generator / Converter, from ControlFlowUtils) is the node that fixes it - and then keeps going, because it's also a type converter, a mini scripting engine, and a window into the pack's Memory Storage variables. The README calls it "your one stop shop for all things Data," which is marketing, but honestly not far off.

The core: visualize + convert

You have a big text box and one dropdown, output_type, with ten options: ANY, STRING, INT, FLOAT, BOOLEAN, LIST, TUPLE, DICT, JSON, and FORMULA.

  • Feed anything into passthrough and the node shows you its string representation on screen, then forwards it - optionally converted to the output_type you picked. It's a debug pane and a converter in one.
  • Leave passthrough empty and the text box itself becomes a source: type a value, pick an output type, and the node converts and outputs it. "42" β†’ INT gives you the number 42; {"a":1} β†’ JSON loads a dict.

That passthrough β†’ output flow is the part to internalize first. Whatever comes in one side comes out the other, so you can drop Data Monitor inline in a wire to inspect without breaking the flow. That alone earns it a place in every debugging session.

The power: FORMULA mode

Set output_type to FORMULA and the text box becomes a restricted Python evaluator. It's safe_eval under the hood - an AST-based sandbox, so no arbitrary file access or imports - but you get real expressions: arithmetic, conditionals, list comprehensions, lambdas, %aux%, %aux2%…%aux5% variable substitution from the aux inputs, and %VariableName% to pull any value out of a Memory Storage. Want to compute "the current iteration's filename is batch_%index%.png"? That's a FORMULA expression with a Memory Storage variable and string math.

There are a few special directives hidden in there too, worth knowing if you use Memory Storage heavily:

  • __MEM__STORAGE__GET__ - dumps all storages as a dict you can inspect or manipulate.
  • __MEM__STORAGE__SET__ - replaces the whole storage dictionary from an aux input (bulk overwrite).
  • __MEM__STORAGE__CLEAR__ - deletes all storages. This is the README's recommended fix for the pack's "storages persist too long" known issue.

The honest caveats

This node has a steep feature cliff. The 90% use case is "wire something in, see what it is, convert it" - dead easy. The FORMULA and memory directives are the other 10%, and they're genuinely powerful but poorly documented beyond the tooltips and the Helpers.py source. Expect to experiment. Conversions that fail raise errors rather than returning a graceful fallback, so a wrong output_type is a hard stop until you fix it. And the DICT format is the finicky one: "Key1:Value1,Key2:Value2" with no extra spaces, or it misparses.

If you're building dynamic workflows with this pack - loops, cycles, memory storage - Data Monitor is effectively your REPL and your debugger in one node.

Install

Data Monitor ships in VykosX/ControlFlowUtils:

# ComfyUI Manager β†’ Install Custom Nodes β†’ search "ControlFlowUtils"
# or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/VykosX/ControlFlowUtils

Restart, find it under 🐺 VykosX-ControlFlowUtils. No dependencies, and the repo's "Processing Data with Data Monitor" sample workflow is the best quick tour of FORMULA mode that exists.

Category🐺 VykosX-ControlFlowUtils

Inputs (8)

NameTypeDefaultDescription
textSTRINGβ€”
output_typeCOMBOThe type the Passthrough or Text should be converted to
passthroughopt*Any value or data to be visualized and forwarded by this node
auxopt*Any optional Auxiliary data to be processed by this node
aux2opt*Any optional Auxiliary data to be processed by this node
aux3opt*Any optional Auxiliary data to be processed by this node
aux4opt*Any optional Auxiliary data to be processed by this node
aux5opt*Any optional Auxiliary data to be processed by this node

Outputs (1)

NameTypeDescription
output*Either Passthrough or Text Data processed by this node