Frames in the diagram editor are now real containers
Drag a node into a Frame and it actually belongs there — reparenting, cascading deletes, and nesting all fall out for free.
Frames in the structured diagram editor used to be purely visual — a rectangle you could put behind a group of nodes to suggest they belonged together, with nothing enforcing that relationship. They’re now real group containers.
What that actually means
Drop a node’s center inside a Frame’s bounds and it reparents into that Frame automatically. Drag it back out and it un-parents just as automatically. Delete or duplicate a Frame and everything inside it goes with it. Put a Frame inside another Frame and nesting works the same way, with no special-casing needed — it’s just containers containing containers.
Why this took real work under the hood
Real containment interacts with everything else that touches node position: align and distribute, “tidy up,” nudging with arrow keys, and the .drawio export all used to assume a node’s stored position was canvas-absolute. Once a node can be parent-relative, that assumption breaks, so all of those had to start resolving each node’s absolute position rather than trusting .position directly.
The trickier problem was live collaboration. Once nodes can carry a parent, React Flow needs parents to appear before their children in the array it renders — a guarantee that’s hard to hold onto when two people are dragging and reparenting nodes into the same diagram at the same time over CRDT sync. Rather than trying to repair the synced node order in place, both the frontend and backend now just recompute a fresh, always-valid parent-before-child ordering on every read. A node’s raw position in the underlying array still matters for ordering among siblings that share a parent — bring-to-front and send-to-back already preserved that correctly, so nothing there needed to change.
What’s still on purpose out of scope
The Kanban tool’s three preset columns are still plain visual presets, not auto-managed swim lanes — you can now drag a card into one since a Frame is a real container, but the columns themselves don’t do anything special yet. That’s flagged as a deliberate follow-up, not an oversight.