SuperDoc v1.0
A new layout engine, TypeScript core, and provider-agnostic collaboration.
From 0.36 to 1.0. SuperDoc is no longer a beta — it's a document engine.
What was wrong with v0
The v0 rendering pipeline relied on CSS for pagination. It was clever, but it hit a wall: table layouts broke across pages, images shifted unpredictably, and multi-column sections were impossible to get right. Every edge case required another CSS hack. The more complex the document, the more it fell apart.
v0 was also JavaScript-only. No type safety across the monorepo, no typed commands or events, and collaboration was hardwired to a single provider.
New layout engine
v1 replaces the CSS pagination layer with a purpose-built layout engine. It computes page geometry, measures content, and paints the result — the same approach Word and Google Docs use internally.
The engine is split into focused packages:
- layout-engine — core pagination and content flow
- measuring — DOM-based text and block measurement
- painters — renders computed layout to the DOM
- style-engine — resolves OOXML styles to computed values
- geometry-utils — coordinate math, page geometry, margins
- pm-adapter — bridges ProseMirror's document model to the layout engine
What this means in practice: tables paginate correctly, images respect anchoring rules, multi-column sections work, and headers/footers render per-section — just like Word.
TypeScript everywhere
The entire monorepo was migrated to TypeScript: core editor, commands, extensions, Vue components, the common package, and the collaboration library.
Commands and events are now strongly typed. Your editor will catch incorrect usage at build time instead of at runtime.
// Typed commands — autocomplete and compile-time checks
editor.commands.toggleList({ type: 'bullet' });
editor.commands.insertContentAt(pos, content);
// Typed events
superdoc.on('fonts-resolved', ({ documentFonts, unsupportedFonts }) => {
// ...
});
Provider-agnostic collaboration
Collaboration in v0 was coupled to a specific Yjs provider. If you used Hocuspocus, it worked. If you used Liveblocks, Y-Sweet, or TipTap Cloud, you had to fight the internals.
v1 defines a generic CollaborationProvider interface. Pass any Yjs-compatible provider and a ydoc, and collaboration just works.
import { HocuspocusProvider } from '@hocuspocus/provider';
const provider = new HocuspocusProvider({ url: '...', name: 'doc-id' });
const superdoc = new SuperDoc({
modules: {
collaboration: {
ydoc: provider.document,
provider,
},
},
});
SuperDoc ships with working examples for Hocuspocus, Liveblocks, TipTap Cloud, and Y-Sweet.
Lists, reimagined
v0 modeled lists as nested BulletList > ListItem and OrderedList > ListItem nodes. This worked for simple lists but diverged from how Word actually represents them — as paragraph numbering properties. Multi-level lists, legal numbering, and mixed bullet/number sequences broke constantly during import.
v1 models lists the way DOCX does: as paragraphProperties.numberingProperties on each paragraph. The old wrapInList, sinkListItem, liftListItem commands are replaced with toggleList, increaseListIndent, decreaseListIndent.
The result: imported Word lists render correctly, and round-trip fidelity is dramatically better.
5-10x editing performance
Large documents (100+ pages) were sluggish in v0. Tab decorations recalculated on every keystroke. List item node views mounted unnecessarily. The editor did work that only mattered for rendered output, even in headless mode.
v1 strips non-essential rendering in headless mode, batches decoration updates, and defers layout work until idle. Editing performance on large documents improved 5-10x.
What else shipped
- Vector shapes and shape groups — SVG rendering for OOXML shapes
- WMF/EMF image support — legacy Windows image formats
- Image anchor wrapping — tight, square, and through wrapping modes
- Compressed DOCX export — smaller output files
- Search results highlighting — configurable highlight behavior
- Markdown serialization —
editor.getMarkdown()support - AI-configurable provider — swap between AI providers
- Headless mode foundation — run SuperDoc without a DOM for server-side processing
Get started
npm install superdoc@latest
If you're migrating from v0, the main changes are the list model (paragraph numbering properties), paragraph formatting (moved under paragraphProperties), and the collaboration API (pass { ydoc, provider } instead of relying on internal provider creation).