Hi everyone,
I’d like to share a project we’ve been building on top of ProseMirror.
The core of the project still relies on ProseMirror’s document model, transactions, state management, and plugin architecture. We did not build a new editor core from scratch. Instead, we kept ProseMirror as the foundation and replaced the standard DOM-based view layer with a custom Canvas-based rendering system.
The main motivation was to explore a page-oriented editing experience with tighter control over layout and rendering. In our case, that includes custom pagination, canvas rendering, selection geometry, hit testing, and view/runtime behavior that are harder to express in a traditional DOM editor setup. So the architecture is roughly:
- ProseMirror for schema, state, transactions, commands, and plugins
- A custom Canvas view layer for rendering and interaction
- A custom layout/pagination pipeline on top of the ProseMirror document
- ProseMirror-compatible extension points retained as much as possible at the state/plugin level
This means the project is not “ProseMirror with minor patches”, but also not a completely separate editor engine. It is closer to a ProseMirror-based editor runtime with a non-DOM view implementation.
A few areas have been especially interesting and challenging:
- Mapping document positions to canvas coordinates and back
- Rebuilding selection, cursor, and hit-testing behavior without relying on the DOM
- Preserving plugin-driven extensibility while the view layer is no longer DOM-first
- Handling clipboard, paste rules, drag/drop, and input behavior in a canvas-based environment
- Supporting paginated document editing with predictable rendering and layout behavior
I’d be very interested in hearing from others who have explored similar directions, or who have opinions on where this approach fits relative to ProseMirror’s design.
A few questions for the community:
-
Have others here built or experimented with a non-DOM ProseMirror view layer?
-
In your experience, what are the biggest long-term risks when keeping ProseMirror’s state/plugin system but replacing the view layer?
-
Which parts of the ProseMirror plugin ecosystem do you think become hardest to preserve in a canvas-based