Skip to content

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.

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 — never silent data loss.
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