Industrial Magick
Turn a ComfyUI workflow into a live ImageMagick command line
- image
- image_path
- error
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/tempand 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_xfields 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:
magicknot found is the #1 failure.subprocess.run()raisesFileNotFoundErrorwhen 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 isconvert, notmagick- 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.
Inputs (52)
| Name | Type | Default | Description |
|---|---|---|---|
| return_image | BOOLEAN | false | — |
| last_param_is_save_path | BOOLEAN | false | — |
| param_count | INT | 50–50 | — |
| param_1 | STRING | — | |
| param_2 | STRING | — | |
| param_3 | STRING | — | |
| param_4 | STRING | — | |
| param_5 | STRING | — | |
| param_6 | STRING | — | |
| param_7 | STRING | — | |
| param_8 | STRING | — | |
| param_9 | STRING | — | |
| param_10 | STRING | — | |
| param_11 | STRING | — | |
| param_12 | STRING | — | |
| param_13 | STRING | — | |
| param_14 | STRING | — | |
| param_15 | STRING | — | |
| param_16 | STRING | — | |
| param_17 | STRING | — | |
| param_18 | STRING | — | |
| param_19 | STRING | — | |
| param_20 | STRING | — | |
| param_21 | STRING | — | |
| param_22 | STRING | — | |
| param_23 | STRING | — | |
| param_24 | STRING | — | |
| param_25 | STRING | — | |
| param_26 | STRING | — | |
| param_27 | STRING | — | |
| param_28 | STRING | — | |
| param_29 | STRING | — | |
| param_30 | STRING | — | |
| param_31 | STRING | — | |
| param_32 | STRING | — | |
| param_33 | STRING | — | |
| param_34 | STRING | — | |
| param_35 | STRING | — | |
| param_36 | STRING | — | |
| param_37 | STRING | — | |
| param_38 | STRING | — | |
| param_39 | STRING | — | |
| param_40 | STRING | — | |
| param_41 | STRING | — | |
| param_42 | STRING | — | |
| param_43 | STRING | — | |
| param_44 | STRING | — | |
| param_45 | STRING | — | |
| param_46 | STRING | — | |
| param_47 | STRING | — | |
| param_48 | STRING | — | |
| param_49 | STRING | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| image_path | STRING | — |
| error | STRING | — |