Skip to content
EditorStackPlayground

Editor.js review: block-style content editing that outputs JSON

Editor.js is an Apache-2.0 licensed block-style content editor that outputs clean JSON instead of HTML, aimed at article and document authoring rather than page layout. First published to npm in February 2019.

Last verified · Apache-2.0 · Free (open source) · Official site · Repository

TL;DR

  • Editor.js is an Apache-2.0 licensed block editor for structured document authoring: each paragraph, heading, image or list is a block, and the saved output is JSON rather than HTML.
  • We measured @editorjs/editorjs 2.31.7 at 64.3 kB gzip; in our time-to-editor benchmark (2.31.6) it reached a working editor in 5 lines of code and a median of 70 ms — the fastest and shortest integration of the eight libraries we tested.
  • It is not a page builder: there are no columns, no breakpoints and no style controls in the core, so using it for landing pages means building the layout system yourself.

Editor.js quick facts

Quick facts about Editor.js
TypeLibrary
LicenceApache-2.0
First release2019-02
LanguageTypeScript
FrameworksAny (framework-agnostic)
SSR supportnone
Bundle size (min+gzip)64.3 kB gzip
PricingFree (open source)
Self-hostedYes
White labelYes
npm weekly downloads288,930
GitHub starspending sync
Latest version2.31.7
Last verified2026-08-19

What Editor.js is, and who it is for

Editor.js replaces the WYSIWYG textarea. It is for products where users write documents — help centre articles, blog posts, internal wikis, product descriptions — and where the stored content needs to be structured rather than a blob of markup an intern pasted from Word.

The core idea is that a document is an ordered list of typed blocks, and each block owns its own data shape. A paragraph block stores text. An image block stores a URL, a caption and a stretched flag. Saving gives you JSON, and the JSON is yours to render wherever.

That model earns its keep the moment content has more than one destination. If the same article must appear on a website, in a native app and in a newsletter, HTML forces you to parse and rewrite it, while typed blocks let each surface render what it can and skip what it cannot.

It is emphatically not a page builder, and the most common failure with Editor.js is choosing it for a job that needs one. For those, GrapesJS or Puck are the right shape, and Editor.js vs Puck sets out where the line falls.

Architecture: blocks all the way down

The editor owns a contenteditable surface and manages a list of block instances. A block tool is a class with three obligations: render returns the DOM element the user edits, save extracts data from that element, and a static toolbox describes how it appears in the plus menu. Inline tools handle selection-level formatting; block tunes handle per-block settings such as alignment.

Two consequences follow. First, because tools own their own DOM, the editor is framework-agnostic — React, Vue and Angular integrations all amount to mounting it and getting out of the way. Second, because it is contenteditable underneath, anything involving selection, paste handling or nested interactive elements needs care; this is inherent to browser text editing, not a flaw in Editor.js.

Sanitisation is configured per tool. This is worth attention: user-authored content stored as structured JSON and rendered by your own code is safer than stored HTML, but only if you validate on the way in and escape on the way out.

Getting started

Five lines, the shortest of the eight libraries we measured.

import EditorJS from '@editorjs/editorjs';

new EditorJS({
  holder: 'app',
  data: { blocks: [{ type: 'paragraph', data: { text: 'Hello editor' } }] },
});
The Editor.js benchmark application showing a clean editing surface with a single paragraph block

Editor.js 2.31.6 from the code above. The bare surface is the product: no chrome, because a document editor should look like a document.

A median of 70 ms to a rendered editor, the fastest in our benchmark. Adding the block tools a real product needs — image, list, table, quote, code, embed — raises both that number and the bundle size, so treat 64.3 kB as a floor rather than a shipping figure.

Strengths

Structured output. JSON blocks are queryable, diffable, migratable and renderable anywhere. Compared with storing HTML, this is the difference between content you own and content you archive.

The smallest integration cost in this dataset. Five lines, one dependency, 70 ms. If your requirement genuinely is document authoring, nothing here gets you there faster.

A clean block tool contract. New content types are a class with two methods. Teams routinely ship custom blocks — call-to-action panels, product embeds, code samples with syntax choice — within a day.

Framework-agnostic and self-hosted. Apache-2.0, no service, no account, works in any stack, and the editor is stable enough that older tools generally keep working.

Good defaults for safety. Per-tool sanitisation, predictable output and no arbitrary pasted markup finding its way into your database.

Limitations

No layout, at all. No columns, no grid, no breakpoints, no style manager. Users get a vertical stack. If your users expect to place two things side by side, the core will not do it and the community tools that try are not a substitute for a layout engine.

You write the renderer. Nothing turns saved blocks into HTML for you. One renderer per surface, maintained as tools are added, and kept in sync with tool version changes. This is the hidden cost of the JSON model and it is rarely mentioned in comparisons.

Uneven third-party tools. The official tools are solid; beyond them quality varies, TypeScript types are inconsistent, and some widely linked tools have not kept pace with core releases.

Contenteditable behaviour. Paste handling, selection across blocks and mobile keyboard quirks are the usual browser text-editing difficulties. They are manageable, but they are real work when your users are demanding.

Not for email. Blocks are not table-based HTML, and getting from one to the other is a renderer you write and test across mail clients. See the email template builder use case.

Pricing

Free under Apache-2.0, including the official block tools, with no usage limits. The engineering cost is the renderer plus whatever custom blocks your product needs — smaller than any page builder in this dataset, and matched by a correspondingly narrower job.

Who Editor.js fits, and who it does not

Good fit

  • Article, post and knowledge-base authoring where structured JSON output matters more than layout control
  • Content that must be rendered on several surfaces — web, mobile app, AMP — from one stored representation
  • Replacing a WYSIWYG textarea in an existing product with something that does not emit unpredictable HTML

Poor fit

  • Landing page building, because there are no columns-first layout primitives, breakpoints or style controls in the core
  • Email templates, since the output is JSON blocks that you must render to email-safe HTML yourself
  • Teams expecting free-form drag-and-drop positioning rather than a linear stack of blocks

Our scores for Editor.js

Scored 0–10 by the EditorStack team against the rubric on the methodology page. Each score is argued below it; a score with no argument fails the build.

Developer experience8/10

Initialisation is a few lines and the block tool contract is small enough to implement from memory after writing one. The awkward part is that the editor owns a contenteditable surface, so anything involving selection, paste handling or nested interactivity requires care.

Extensibility8/10

A block tool is a class with render, save and a static toolbox definition, which makes new content types cheap to add and easy to test. Inline tools and block tunes cover the second axis of customisation, though deep changes to the editing surface itself are not part of the contract.

Documentation7/10

Base concepts and the tool API are documented clearly with working examples. Where it thins out is production concerns: sanitisation policy, migrating stored block data between tool versions, and server-side rendering of saved documents are largely left to the reader.

Ecosystem7.5/10

There is a broad set of first-party and community block tools — image, list, table, embed, code — and the plugin surface is stable enough that older tools generally keep working. Quality outside the official set varies and few tools ship TypeScript types.

Time to production8/10

For its actual scope — structured document authoring — it reaches production quickly: install, pick tools, persist JSON. Teams that try to stretch it into a page builder lose that speed immediately, which is a scope mistake rather than a library flaw.

Editor.js against its nearest neighbours

The closest products in the dataset by category, with the facts most people open three tabs to compare. Bundle sizes marked in kilobytes are our own measurements.

Editor.js compared with the nearest products in the dataset
ProductLicenceBundlePrice fromSelf-hosted
Editor.jsApache-2.064.3 kB gzipFree (open source)Yes
BlockNoteMPL-2.0386.1 kB gzipfrom $195/moYes
CKEditor 5GPL-2.0-or-later OR commercial161.2 kB gzipfrom $144/moYes
LexicalMIT104.9 kB gzipFree (open source)Yes

Alternatives to Editor.js

Each comparison below is a full write-up, not a feature grid: where each tool wins, and what moving between them costs.

Frequently asked questions

What is Editor.js good for?
Article, post and knowledge-base authoring where you want structured output. Because it saves JSON blocks rather than HTML, the same content can be rendered on the web, in a mobile app and in an email template from one stored representation.
Is Editor.js a page builder?
No. It produces a linear stack of blocks with no layout primitives, no responsive breakpoints and no style manager. Teams that stretch it into a page builder end up writing the layout system that GrapesJS or Puck would have given them.
How big is Editor.js?
We measured @editorjs/editorjs 2.31.7 at 64.3 kB gzip (237.9 kB raw) for the core with no block tools installed. Each tool you add — image, list, table, embed — adds to that.
Does Editor.js work with React?
Yes, through community wrappers or by mounting it in an effect against a container element. The editor is framework-agnostic and owns its own DOM, so React is hosting it rather than rendering it.
How do I render Editor.js output?
You write a renderer that maps each block type to markup. That is the cost of the JSON model: nothing renders the content for you, and you need one renderer per output surface.

Sources and verification

Last verified: . Facts on this page were checked against the sources below on the date shown next to each one.

  1. npm registry metadata for @editorjs/editorjs (licence, first publish date, latest version) — accessed 2026-08-19
  2. Editor.js source repository — accessed 2026-08-19
  3. Editor.js base concepts documentation — accessed 2026-08-19