← All notes
Product4 min read

Drag and drop is a contract, not a feature

A builder is only convincing when the canvas and the published page agree. Everything else is decoration.

Every site builder makes the same promise: what you see is what you get. Almost none of them keep it, and the reason is rarely the drag-and-drop library.

The promise breaks when the editor and the published page are two different renderers. One draws with editor styling, the other with production styling, and the gap between them widens with every feature until nobody can predict what publishing will do.

Build one renderer, use it twice

We settled this by refusing to write a second renderer. The editor canvas and the published site both walk the same document and hand each node to the same component.

This constrains the design. Anything the editor cannot render, the published site cannot either - which is exactly the constraint you want. It removes an entire category of bug by making it unrepresentable.

What it costs

You give up the freedom to have editor-only affordances in the markup, so selection outlines and drag handles live outside the rendered tree rather than inside it.

You also cannot ship a block type the production site does not support, even temporarily. In practice that discipline is a feature: it stops half-finished blocks from reaching anyone.

Next step

Working on something?

We are happy to say whether we can help before you commit to anything.