An node-based image editor and procedural texture generator. Open source and free. Similar to Substance Designer and Material Maker. Generate textures, edit raw photos, create vector shapes. 100% Rust and very fast. GUI to create graphs and CLI to integrate them into your workflow.
I wrote the framework for this back in 2023, intending it to be a replacement for Substance Designer, but lost interest. Picked it up again in 2026 with the help of Claude.
- 449 nodes across images, colors, curves, numbers, logic, and text — see the full Node Reference below.
- Procedural generation — 47 noise generators.
- 14 color spaces with conversion between them: sRGB, Linear RGB, HSL, HSV, HWB, Lab, LCH, Oklab, Oklch, CMYK, XYZ, xyY, YUV, YCbCr.
- Floating-point pipeline — images stay 1–4 channel
f32from input to output; conversion only happens at I/O. - 17 file formats — PNG, JPEG, GIF, WebP, TIFF, TGA, BMP, ICO, PNM, QOI, Farbfeld, Radiance HDR, OpenEXR, JPEG XL, PSD, HEIC/HEIF, and AVIF (JPEG XL, PSD, and HEIC/HEIF — iPhone photos — are read-only, AVIF write-only) and 8/16/32-bit-float output color formats.
- Camera raw — develop photographs straight off the camera: Canon CR3/CR2, Nikon NEF, Sony ARW, Fujifilm RAF, Adobe DNG and ~20 more, read-only via rawler. Demosaic, white balance, colour matrix and orientation are applied for you.
- Tethered shooting — point a from-folder node at the directory your camera software downloads into, press watch, and every new photo is developed and exported automatically as it lands.
- Subgraphs — package an entire pipeline into a single reusable node.
- GUI and CLI — build graphs visually in the desktop app or headless from the command line. Both share the same JSON graph format, and the CLI is designed to be easy for scripts and LLMs to drive.
Prebuilt binaries for Windows, macOS (Apple Silicon + Intel), and Linux from itch.io or the releases page, or via a package manager (this repo doubles as the Homebrew tap and Scoop bucket):
# macOS / Linux — Homebrew (installs `nodemangler` GUI + `mangle` CLI)
brew tap dan335/nodemangler https://github.com/dan335/nodemangler
brew install nodemangler# Windows — Scoop
scoop bucket add nodemangler https://github.com/dan335/nodemangler
scoop install nodemangler# Arch, and derivatives like Omarchy / EndeavourOS / CachyOS — AUR
yay -S nodemangler-binOn Linux there's also a single-file .AppImage on the releases page:
download, chmod +x, run. The itch.io app auto-updates
its installs; Homebrew/Scoop/AUR update through their normal
upgrade/update/-Syu commands.
cd app
cargo run -p mangler_gui # launch the desktop app
cargo run -p mangler_cli # run graphs headless (see the CLI README)
cargo build # build everything
cargo test # run the test suiteNodes are instances of operations — each declares its inputs, outputs, and async processing logic. Values (numbers, colors, images, text, …) flow along connections and auto-convert where it makes sense. The engine runs on a tokio runtime: when an input changes, affected nodes are marked dirty and re-execute in dependency order, with results propagating downstream. Graphs save as JSON and round-trip freely between the GUI and the CLI.
Four ways, all equivalent:
- Click a node in the Node List panel to drop it into the focused graph.
- Drag one out of the Node List to place it exactly where you want it.
- Press Tab over the graph canvas to search by name and add at the cursor.
- Drag a wire into empty space to search only for nodes that fit that connection.
The Node List's search box filters by node name or category, so typing noise
or blur pulls up everything in those groups.
Every numeric field in the node settings panel — sliders and drag boxes alike —
accepts arithmetic, not just a number. Click into one and type 3.5*300 to get
1050, or 1920/3, or sqrt(2)*64. Operators are + - * / % ^ with the usual
precedence and parentheses; pi, tau and e are available, along with sqrt,
abs, min, max, pow, clamp, floor, ceil, round, trunc, ln,
log, log2, log10, exp, the trig functions (radians, with rad/deg to
convert), and atan2. The result is evaluated when you press Enter or click
away; anything that isn't a valid expression leaves the value untouched.
See the mangler_core README for the engine internals.
app/— Rust application (Cargo workspace)website/— Project website (nodemangler.com)
| Crate | Path | Purpose |
|---|---|---|
| mangler_core | app/crates/mangler_core/ |
The engine — value system, node graph, operation library, color spaces |
| mangler_gui | app/crates/mangler_gui/ |
Desktop app built with egui/eframe |
| mangler_cli | app/crates/mangler_cli/ |
Headless CLI for building and running graphs |
Each crate README goes into detail on that component.
Every node in the graph editor's Add Node menu, by category and subcategory (449 operation nodes, plus subgraph nodes for composing whole pipelines).
- Input: Decimal, E, Integer, Phi, Pi, Tau
- Algebraic: Absolute Value, Cube Root, Distance 2D, Factorial, GCD, Hypot, LCM, Nth Root, Power, Square Root
- Arithmetic: Add, Average, Ceil, Clamp, Decrement, Divide, Floor, Fractional Part, Increment, Max, Min, Modulus, Multiply, Negate, Ping Pong, Reciprocal, Round, Sign, Snap, Subtract, Truncate, Wrap
- Bitwise: Bitwise And, Bitwise Not, Bitwise Or, Bitwise Xor, Shift Left, Shift Right
- Cast: To Decimal, To Integer
- Curve: Area, Bounds, Centroid, Length, Point Count, Sample Point
- Image: Average Hue, Bounding Box, Centroid, Coverage, Dimensions, Edge Density, Entropy, Image Difference, Kurtosis, Mean, Median, Min Max, Percentile, Perceptual Hash, Sharpness, Skewness, Standard Deviation, Unique Colors
- Interpolation: Lerp, Map Range, Smoothstep, Step
- Logarithmic: Exp, Ln, Log, Log10, Log2
- Random: Random Decimal, Random Gaussian, Random Integer
- Text: Byte Length, Count Occurrences, Index Of, Line Count, Parse Decimal, Parse Integer, Word Count
- Trigonometry: Acos, Acosh, Asin, Asinh, Atan, Atan2, Atanh, Cos, Cosh, Sin, Sinh, Tan, Tanh, To Degrees, To Radians
- Input: CMYK, HSL, HSV, HWB, Lab, LCH, Oklab, Oklch, RGB, RGB Linear, xyY, XYZ, YCbCr, YUV
- Output: To CMYK, To HSL, To HSV, To HWB, To Lab, To LCH, To Oklab, To Oklch, To RGB, To RGB Linear, To xyY, To XYZ, To YCbCr, To YUV
- Analysis: Color Temperature, Contrast Ratio, Distance, Dominant Hue, Harmony Score, Luminance, Mix Ratio, Most Common Colors, Sample Pixel
- Generation: From Hex, Random Color, Skin Tone, To Color, To Hex
- Harmony: Analogous, Complementary, Double Split Comp, Monochromatic, Tetradic, Triadic
- Manipulation: Adjust HSV, Blend, Clamp, Grayscale, Invert, Set Alpha
- Input: Curve
- Combine: Join, Morph
- From Image: Trace Contour
- Generators: Arc, Ellipse, Fractal Line, Lissajous, Polygon, Random Walk, Spiral, Star, Superellipse, Wave
- Modify: Jitter, Mirror, Offset, Resample, Reverse, Round Corners, Simplify, Smooth, Transform, Trim
- Simulation: Meander
- Input: Constant, From Clipboard, From Color, From File, From Folder, From Gradient, From Raw, From Text, From URL
- Output: Material, To Clipboard, To File
- Adjustments: Auto Exposure, Auto Levels, Black And White, Brighten, Clarity, Color Balance, Color Grade, Color Lookup, Color Match, Color To Mask, Contrast, Curves, Defringe, Dehaze, Dither, Exposure, Frequency Split, Gradient Dynamic, Gradient Map, Grain, Grayscale, Histogram Range, Histogram Scan, Histogram Select, HSL, HSL Mixer, Hue Shift, Invert, Levels, Negadoctor, Photo Filter, Posterize, Replace Color, Saturation, Selective Color, Shadows Highlights, Texture, Threshold, Tone Equalizer, Tone Map, Vibrance, Vignette, White Balance
- Blur: Blur, Directional Blur, Non-Uniform Blur, Radial Blur, Slope Blur
- Cast: To Image
- Channels: Channel Merge, Channel Mixer, Channel Select, Channel Shuffle, Channel Split
- Combine: Blend, Compare, Composite
- Filter / Edges: Canny, Difference Of Gaussians, Edge Detect, Highpass, Luminance Highpass, Sharpen, Unsharp Mask
- Filter / Smoothing: Anisotropic Diffusion, Bilateral, Denoise, Guided Filter, Median, Non Local Means, SNN
- Filter / Morphology: Black Hat, Close, Dilate, Distance Field, Erode, Morphological Gradient, Open, Outline, Top Hat, Vector Morphology
- Filter / Stylize: Anisotropic Kuwahara, ASCII, Cross Hatch, Emboss, Halftone, Kuwahara, Oil Paint, Pixelate, Toon
- Filter / Dither: Floyd Steinberg, Ordered Dither
- Filter: Convolution
- FX: Bloom, Drop Shadow, Inner Glow, Outer Glow
- Masks: Hue Range Mask, Linear Gradient Mask, Mask Combine, Radial Gradient Mask
- Noise: Anisotropic Noise, Billow Noise, Blue Noise, Caustics Noise, Checkerboard Noise, Cloud Noise, Concentric Rings, Craters, Crystal Noise, Curl Noise, Dirt Noise, Domain Warp, Erosion, Fault Terrain, FBM Noise, Fibers, Flow Noise, Gabor Noise, Growth Noise, Hybrid Multifractal Noise, Leaks Noise, Lightning Noise, Multifractal Noise, Open Simplex Noise, Peeling Noise, Perlin Noise, Phasor Noise, Plasma Noise, Reaction Diffusion, Ridged Multifractal Noise, Rolling Hills, Scales, Scratches, Smear Noise, Spectral Terrain, Stains Noise, Super Simplex Noise, Truchet Tiles, Value Noise, Veins Noise, Voronoi Blend, Voronoi Crack Noise, Warped Rings Noise, Wave, White Noise, Worley Distance Noise, Worley Value Noise
- Patterns: Brick, Flood Fill, Flood Fill Mapper, Hexagonal, Scatter On Curve, Splatter, Tile Generator, Tile Sampler, Weave
- PBR: AO From Height, Bevel, Curvature, Height Blend, Normal Blend, Normal Combine, Normal From Height, Normal Invert, Normal To Height
- Shapes: Circle, Cone, Curve Distance Field, Curve Gradient, Ellipse, Line, Paraboloid, Polygon, Pyramid, Rasterize Curve, Rectangle, Star
- Simulation: Carve River, Guided Rolling Hills, Hillslope Diffusion, Hydraulic Erosion
- Transform: Border, Chromatic Aberration, Crop, Directional Warp, Flip Horizontal, Flip Vertical, Kaleidoscope, Lens Distortion, Make Tile, Mirror, Perspective, Polar Coordinates, Resize, Resize Exact, Resize Fill, Rotate, Rotate 180, Rotate 270, Rotate 90, Seam Carve, Spherize, Swirl, Transform, Warp
- Input: Boolean
- Boolean: And, Nand, Nor, Not, Or, Xnor, Xor
- Comparison: Approx Equal, Equal, Greater Or Equal, Greater Than, In Range, Less Or Equal, Less Than, Not Equal
- Flow: Select
- Text: Contains, Ends With, Equals Ignore Case, Is Empty, Starts With
- Input: Text
- Encoding: Base64 Decode, Base64 Encode, Url Decode, Url Encode
- Image: Ascii Art, Data Uri, Image Hash, Image Info, Palette Hex
- Manipulation: Append, Format Number, Join, Length, Pad, Repeat, Replace, Reverse, Split, Substring, Template, Title Case, To Lowercase, To String, To Uppercase, Trim
MIT OR Apache-2.0, at your option — see LICENSE.md.
