After a couple of dead ends and rewrites, an infinite pannable, zoomable surface you can draw on and place blocks of text in a grid layout. The hard part was cleanly updating the viewport when scrolling within a single block editor.