---
title: "Migrate to Blok — Editor.js, TipTap, Quill"
description: "Migration guides and a codemod for moving an existing editor integration to Blok without rewriting stored content."
source: https://blokeditor.com/migration/
lastmod: 2026-08-31
---

# Outgrown Editor.js?

You picked it for blocks. But a block-styled text editor only goes so far — no real nesting, no data model, a plugin for everything. Blok is where those walls disappear.

[See the walls fall](#walls) [How you migrate](#move)

## Every one of these is gone in Blok

Not a feature list — the specific ceilings that made you look for something else.

Editor.js

### Flat blocks

Blocks can't contain blocks. No nesting, no toggles-with-content, no columns.

Blok

### Everything is a block

Real hierarchy. Nested pages, columns, toggles, database rows — blocks inside blocks.

Editor.js

### A plugin for everything

Hunt, wire, version and pray-it's-maintained for each block you need.

Blok

### Batteries included

Tables, media, embeds, columns, code — one typed package, no plugin archaeology.

Editor.js

### Just a text editor

Content is the ceiling. No structured records, no databases, no pages-in-pages.

Blok

### A block engine

Databases and rows are blocks. Build a Notion-grade workspace, not just a writing surface.

Editor.js

### No framework story

You wrap it yourself and fight the lifecycle bugs. No official React/Vue/Angular path.

Blok

### First-class adapters

A typed hook + component for React, Vue and Angular. Shipped, not your problem to maintain.

## You keep almost all of your Editor.js code

- Your saved content loads as-is — no data conversion step.
- Custom block tools port unchanged — same render, save, validate, onPaste.
- Old inline tools? Wrap them with wrapLegacyInlineTool instead of rewriting.
- Dropped fields log a warning naming the block when Blok loads legacy data, and `migrate()` hands them back in `report.lossyFields` — only the codemod migrates silently.

```
import { EditorJS } from '@bloklabs/core'; // new EditorJS({ ... }) stays unchanged
```

Blok ships an EditorJS alias. Change one line and your setup runs.

## One command, then review and ship

```
npx -p @bloklabs/core migrate-from-editorjs ./src --dry-run
```

1. 1. Preview with --dry-run
2. 2. Apply & review the diff
3. 3. Ship

[Full reference: every rename, CSS map & tool compatibility →](https://blokeditor.com/migration/reference/)
