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:

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

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).

Read the migration guide