Subflows
Each instance gets its own copy of the template’s nodes, its own flow context,
and its own resolved properties. The same template renders 4.2 bar in one
instance and 4.2 kPa in the next, verified end to end through a real deploy
rather than asserted in a unit test.
Expansion produces a separate graph rather than rewriting the parsed flows, and that is the whole design decision. The flow file is never touched, so the byte-identical round trip still holds, and the expanded graph is an ordinary graph, so the scheduler, the Catch routing, the metrics, and the editor’s status events all work inside a subflow with no special cases anywhere.
Nesting works. An error nobody catches inside a subflow walks out to the Catch node on the calling tab, because otherwise a subflow is just a place where errors go to disappear. A configuration node declared inside a template is shared by every instance rather than copied, since an MQTT broker inside a subflow is an author saying “share this”, and copying it would open one connection per instance against something that is almost certainly counting them.