ComfyUI Node

Industrial Magick

Turn a ComfyUI workflow into a live ImageMagick command line

By my-opencode·Created 2 years ago·Updated 2 years ago· 1
Industrial Magick
    • image
    • image_path
    • error
    return_imagefalse
    last_param_is_save_pathfalse
    param_count5
    param_1
    param_2
    param_3
    param_4
    param_5
    param_6
    param_7
    param_8
    param_9
    param_10
    param_11
    param_12
    param_13
    param_14
    param_15
    param_16
    param_17
    param_18
    param_19
    param_20
    param_21
    param_22
    param_23
    param_24
    param_25
    param_26
    param_27
    param_28
    param_29
    param_30
    param_31
    param_32
    param_33
    param_34
    param_35
    param_36
    param_37
    param_38
    param_39
    param_40
    param_41
    param_42
    param_43
    param_44
    param_45
    param_46
    param_47
    param_48
    param_49

    Industrial Magick is the node that says "I know the magick CLI" and means it. You type a magick command token by token - one per field - it runs it as a real subprocess, and hands the result back as an image, a file path, or an error string. That's the whole trick, and it's a good one: if you already think in ImageMagick, you just gained a couple hundred image operators that core ComfyUI will never ship.

    Why you'd reach for it

    Here's the situation it solves. ComfyUI's built-in nodes give you load, save, resize, flip, crop - and then a wall. The moment you want to threshold-and-negate line art into transparency, stamp a caption with a specific font, build a montage, or do any color-channel surgery, you're stuck reaching for Photoshop or writing a custom Python node. ImageMagick does all of it from the command line. This pack is the raw version of wiring that into the graph: instead of wrapping a handful of popular operations in typed inputs like the more popular ComfyUI-ImageMagick, it hands you the subprocess and trusts you to know what you're doing. That's freeing when you do, and fiddly when you don't.

    How it works

    Mechanically it's dead simple, and knowing this saves you real pain. The node prepends magick, collects up to 50 string tokens, drops the empty ones, and runs the whole list with subprocess.run(). No shell involved - which matters more than it sounds. Tokens are passed literally, so there are no pipes, no wildcard expansion, no && chains, and no shell quoting. Type things the way magick would see them after a shell already did its parsing; if a workflow shows you -draw "text 25,65 'Industrial Magick'", the outer double quotes are shell artifacts - in the node you enter the text 25,65 'Industrial Magick' token without them.

    The inputs that matter

    The inputs that actually matter:

    • return_image - read the output file back as an IMAGE and pass it down the graph. Leave it off and you just get the path back.
    • last_param_is_save_path - off by default, which means the node appends its own output path into ComfyUI/temp and auto-loads the result. Flip it on and your last token becomes the output path - and that path has to be absolute, the README calls this out for a reason.
    • param_count - how many param_x fields show on the node (a bundled JS extension hides the rest). Up to 50.

    The outputs are image (or None), image_path (the output file path), and error - a string that's empty on success and says the subprocess failed otherwise. Wire error into a ShowText-style node if you want completion status visible in the graph.

    Installing

    Installing is easy, and the twist is why it's easy: there are no Python dependencies at all. No requirements.txt, nothing in pyproject.toml to pip. The real dependency is a system binary - ImageMagick 7 with magick on the PATH of the process running the ComfyUI server. Install ImageMagick 7 from imagemagick.org, then either grab it via ComfyUI Manager (search "Industrial Magick") or:

    cd ComfyUI/custom_nodes
    git clone https://github.com/my-opencode/ComfyUI_IndustrialMagick
    

    Restart ComfyUI and you're done. No models to download, no heavy wheels.

    Where people get burned

    Where people get burned:

    • magick not found is the #1 failure. subprocess.run() raises FileNotFoundError when the binary is missing, and this code doesn't catch it - so instead of the friendly error string you get a red node and a traceback. On Windows, tick the "Add to PATH" checkbox in the ImageMagick 7 installer and restart ComfyUI. On Linux, many distros still ship ImageMagick 6, where the binary is convert, not magick - this pack needs v7.
    • The error output is deliberately generic. The actual magick stdout/stderr goes straight to the ComfyUI console; that's where you debug a failed command.
    • It's a raw subprocess runner. Fun and dangerous in equal measure. Be cautious about loading workflows you don't fully trust - a graph can ask this node to run arbitrary commands on your machine.

    For the money it's a niche tool with zero guardrails and zero bloat. If ImageMagick is already muscle memory, it's the one you'd actually reach for when a "just save the file and shell out" job shows up. If it isn't, this is a great reason to learn a dozen magick one-liners.

    CategoryIndustrialMagick

    Inputs (52)

    NameTypeDefaultDescription
    return_imageBOOLEANfalse
    last_param_is_save_pathBOOLEANfalse
    param_countINT50–50
    param_1STRING
    param_2STRING
    param_3STRING
    param_4STRING
    param_5STRING
    param_6STRING
    param_7STRING
    param_8STRING
    param_9STRING
    param_10STRING
    param_11STRING
    param_12STRING
    param_13STRING
    param_14STRING
    param_15STRING
    param_16STRING
    param_17STRING
    param_18STRING
    param_19STRING
    param_20STRING
    param_21STRING
    param_22STRING
    param_23STRING
    param_24STRING
    param_25STRING
    param_26STRING
    param_27STRING
    param_28STRING
    param_29STRING
    param_30STRING
    param_31STRING
    param_32STRING
    param_33STRING
    param_34STRING
    param_35STRING
    param_36STRING
    param_37STRING
    param_38STRING
    param_39STRING
    param_40STRING
    param_41STRING
    param_42STRING
    param_43STRING
    param_44STRING
    param_45STRING
    param_46STRING
    param_47STRING
    param_48STRING
    param_49STRING

    Outputs (3)

    NameTypeDescription
    imageIMAGE
    image_pathSTRING
    errorSTRING