Convert to Expression
Replace a node, in place, with an editable Expression that reproduces what it was doing.
Convert to Expression swaps a node for an Expression node carrying the same computation as readable code, wires intact, so the maths becomes something you can edit by hand.
How to use it
Right-click any node in the node graph and choose Convert to Expression.
Incoming and outgoing connections are preserved, so nothing downstream notices the change. From there you can rename attributes, adjust formulas, and add steps.
Three uses:
Read the generated code to see the logic a node runs.
Edit the code when the parameters do not expose the exact behaviour you need.
Convert a node that is already close, then shape it into something new.
The swap is undoable. Cmd+Z returns the original node.
A one-way conversion
Once a node becomes an Expression there is no button to turn it back. The original parameters and controls are gone, replaced by the code. That is the trade: the node's dials for hands-on control.
To read the logic without committing, convert a duplicate (Cmd+D first), or undo straight after reading the code.
Not every node can convert
Conversion handles per-element data work, the point, attribute, and geometry maths an Expression can express. A node doing something an Expression cannot represent is left unchanged, and a notice appears in the console explaining why.
Four things decide it:
The node has to be on the proven list. A node converts only once its generated code has been checked to produce the same result as the node itself, frame for frame. That check is written one node at a time, so the list grows as each node earns its place. This is deliberate: a conversion that is nearly right would look correct and silently render something else. It runs to 29 node types today, covering the point-wise colour effects (Levels, Colour Correct, Channel, HSV Grade, Quantize, Color Space, Color Map), the neighbourhood effects (Normal Map, Emboss, Slope, Key, Denoise), the blur family (Blur, Smooth, Sharpen), the coordinate-driven ones (Dither, Lens Distort, Panoramic), Mask, the analytic fields, distance fields and boolean CSG, and a handful of points and number-array operations.
The setting matters, not just the node. Several nodes convert in one mode and not another. Blur converts in its Gaussian, Box, Directional and Radial modes; Dither converts in both of its ordered modes and is refused on its blue-noise texture and error-diffusion ones; Mask converts when both its inputs are images; Normals converts in its point-wise modes; Smooth converts on its spatial raster arm; Boolean converts when both inputs are distance fields and the operation is a plain union, intersection or subtraction. Switch the mode and the same node may become view-only.
Some things aren't a per-element formula. A node that only passes its input through has nothing to write down, and is refused rather than replaced by an Expression that does nothing. An Expression binds at most two whole collections, so a node reading more is refused for the same reason. Image inputs are the wider case and go up to four.
A few operations have no written form yet. Noise-driven fields are the main one: the node's noise takes far more settings than the written form accepts, so a field chain fed by one cannot be printed. Mesh and topology work on Boolean, and its Clip and Divide operations, are refused the same way.
Multi-output nodes can convert, as long as their extra outputs are unwired. An Expression has one output, so conversion reroutes everything onto it. That is safe when nothing was connected to the others, and refused when something was.
Selecting two or more nodes converts the run into a single Expression. That path skips the proven list and asks only whether the combined work can be written down, so it reaches further than converting the same nodes one at a time. When it cannot, the console says so and points you at Collapse to Subgraph instead.