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.
Flat blocks
Blocks can't contain blocks. No nesting, no toggles-with-content, no columns.
Everything is a block
Real hierarchy. Nested pages, columns, toggles, database rows — blocks inside blocks.
A plugin for everything
Hunt, wire, version and pray-it's-maintained for each block you need.
Batteries included
Tables, media, embeds, columns, code — one typed package, no plugin archaeology.
Just a text editor
Content is the ceiling. No structured records, no databases, no pages-in-pages.
A block engine
Databases and rows are blocks. Build a Notion-grade workspace, not just a writing surface.
No framework story
You wrap it yourself and fight the lifecycle bugs. No official React/Vue/Angular path.
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 unchangedBlok 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. Preview with --dry-run
- 2. Apply & review the diff
- 3. Ship