Skip to content
EditorStackPlayground

Changelog

Dated log of data corrections, new entries, methodology changes and benchmark runs on EditorStack. Corrections are published rather than quietly applied.

Updated

TL;DR

  • Every substantive change to the data, the methodology or a published number is recorded here with its date.
  • Corrections are published rather than silently applied, because a reference that edits its history is not a reference.

2026-09-17 — Rich-text editors, GrapesJS guides and two corrections

Dataset grew from 30 to 34 products. Added CKEditor 5, TinyMCE, BlockNote and Quill, and a new rich-text editor category that also includes Tiptap, Lexical, Plate and Editor.js. Licences, first-publish dates and versions were read from the npm registry; licensing terms and prices from each vendor's own licensing and pricing pages, recorded as vendor-published. Six new head-to-head comparisons and a TinyMCE alternatives guide were published.

Measurement run bundles-2026-09-17. Twelve libraries measured, up from eight. New entries: Quill 2.0.3 at 58.7 kB gzip, CKEditor 5 48.5.1 at 161.2 kB, BlockNote 0.54.2 at 386.1 kB and TinyMCE 8.9.1 at 393.9 kB, which is now the heaviest in the set; the spread is 13.5×. Existing entries re-measured at the versions npm resolved today:

  • Lexical 0.49.0 → 0.50.0: 97.1 → 104.9 kB.
  • Tiptap 3.30.2 → 3.31.3: 125 → 123.3 kB.
  • React Page 5.4.6, same version: 375.5 → 377.2 kB, from dependency drift.
  • GrapesJS 0.23.5 → 0.23.6: 294.5 → 294.6 kB.
  • Editor.js 2.31.6 → 2.31.7: unchanged at 64.3 kB.
  • Craft.js, Puck and Plate: unchanged versions and sizes.

Every bundle figure quoted in prose was updated, including superlatives that stopped being true: React Page is no longer the largest bundle and GrapesJS is no longer the second largest.

BlockNote install workaround recorded. Its documented npm install failed with ERESOLVE on npm 10.8.2 over optional peer dependencies; both measurement scripts now install it with --legacy-peer-deps and say so next to the result.

Time to first editor: four applications built, no timings published. Benchmark applications for the four new editors are in the repository and their screenshots appear on their reviews. Their timings were taken on a different machine from run tte-2026-08-20; re-timing the eight published applications on that machine gave medians 1.1 to 3.7 times faster than published, so the results cannot be combined. The published run is unchanged, the calibration data is in data/measurements/time-to-editor-calibration-2026-09-17.json, and the four new products carry no scores until they are timed alongside the others. The measurement script now launches Playwright's own Chromium when the original Linux browser path is absent, and gained a merge mode that refuses to run without calibration references.

Correction — this changelog's 2026-08-20 entry drifted. Three figures in it were rendered from the live dataset, so the dated entry had started to state today's product count, bundle spread and scored count. They are now fixed at their values on that date: 30 products, 12.9×, eight scored.

New section: GrapesJS guides. Ten practical tutorials: React, Next.js and Vue integration, saving projects to a database, custom blocks, Tailwind CSS, S3 uploads, HTML and CSS export, an MJML email builder and AI section generation. Every guide states the GrapesJS version its code ran against (0.23.5). The code on each page is a file from examples/guides/ in the repository; CI bundles each example, runs it in headless Chromium with assertions on what happened, and fails if a code block on a guide page no longer matches the file it came from.

Findings recorded in the guides rather than smoothed over. In GrapesJS 0.23.5, remote storage rejects every non-2xx response with a TypeError instead of the response body; isParsedNode receives upper-case tag names from the default browser parser, unlike the documentation's example; @grapesjs/react 2.0.0 declares a peer range that excludes 0.23.x; and an AWS SDK presigned PUT URL signs only the host header unless told otherwise.

Correction — GrapesJS and server rendering in Next.js. The Next.js use case said GrapesJS touches window at import time and therefore cannot be imported from a server-rendered module. Building GrapesJS 0.23.5 with Next.js 15.5.4, a client component that imports it directly was pre-rendered without error. The answer now says so; we still recommend next/dynamic with ssr: false, for bundle and HTML reasons.

Code blocks are now syntax-highlighted at build time, with no added client JavaScript.

2026-08-20 — Six products added, benchmarks re-run, two corrections

Dataset grew to 30 products. Added Tiptap and Lexical, the two rich-text frameworks most often shortlisted alongside Plate and Editor.js, and four platforms that come up in agency evaluations: Brizy, Duda, Sitejet and Wix Studio. Licences, first-publish dates and versions for the two npm-distributed additions were read from the registry; the four platforms carry vendor-published pricing and no scores.

Measurement run bundles-2026-08-20. Eight libraries measured. New entries: Tiptap 3.30.2 at 125 kB gzip, Lexical 0.49.0 at 97.1 kB. The other six were unchanged at the same versions, and the spread across the set remained 12.9×.

Measurement run tte-2026-08-20. Time to first editor re-run across all eight applications on the same machine. Every median moved, because these are wall-clock measurements on shared hardware: GrapesJS 438 → 309 ms, Editor.js 100 → 70 ms, Puck 879 → 852 ms, Craft.js 118 → 94 ms, Plate 252 → 209 ms, React Page 1,057 → 1,004 ms. New: Tiptap 171 ms in 11 lines, Lexical 159 ms in 25. Every figure quoted in prose was updated to match; the ordering did not change.

Correction — Silex was scored without being run. Silex carried a full set of verdict scores while its own review stated we had not run it hands-on. That contradicts our rule that only products we have run are scored, so the scores were removed rather than the sentence. Scored products then numbered eight, exactly matching the set in our benchmarks.

Correction — the launch entry's category breakdown was wrong. It described the 24 launch records as "eight embeddable libraries, seven commercial SDKs, four headless CMSs and three platforms", which totals 22 rather than 24 and misstated three of the four counts. Every aggregate quoted in prose is now computed from the dataset at build time rather than typed by hand, so this class of error cannot recur.

2026-09-17 — Automated metric refresh

The daily sync recorded a change of more than 10% in at least one tracked metric:

beefree-sdk: npm_weekly_downloads null → 105382, github_stars null → 30, last_commit null → 2026-09-17, open_issues null → 24, contributors null → 21, latest_version 11.6.1 → 11.7.0  [significant]
blocknote: npm_weekly_downloads null → 545506, github_stars null → 10185, last_commit null → 2026-09-17, open_issues null → 213, contributors null → 129  [significant]
builder-io: npm_weekly_downloads null → 80352, github_stars null → 8835, last_commit null → 2026-09-17, open_issues null → 150, contributors null → 111, latest_version 9.4.2 → 9.4.6  [significant]
ckeditor: npm_weekly_downloads null → 893935, github_stars null → 10496, last_commit null → 2026-09-17, open_issues null → 737, contributors null → 209  [significant]
contentful-studio: npm_weekly_downloads null → 23625, github_stars null → 18, last_commit null → 2026-09-17, open_issues null → 28, contributors null → 40  [significant]
craftjs: npm_weekly_downloads null → 64907  [significant]
directus: npm_weekly_downloads null → 15509, github_stars null → 37948, last_commit null → 2026-09-17, open_issues null → 401, contributors null → 582, latest_version 12.3.0 → 12.3.1  [significant]
editorjs: npm_weekly_downloads null → 288930, latest_version 2.31.6 → 2.31.7  [significant]
grapesjs: npm_weekly_downloads null → 269998, github_stars null → 26245, last_commit null → 2026-08-26, open_issues null → 41, contributors null → 227, latest_version 0.23.5 → 0.23.6  [significant]
grapesjs-studio-sdk: npm_weekly_downloads null → 11068, latest_version 1.1.1 → 1.2.1  [significant]
lexical: npm_weekly_downloads null → 4577452, github_stars null → 23866, last_commit null → 2026-09-17, open_issues null → 295, contributors null → 622, latest_version 0.49.0 → 0.51.0  [significant]
plasmic: npm_weekly_downloads null → 9503, github_stars null → 7022, last_commit null → 2026-09-17, open_issues null → 45, contributors null → 88, latest_version 2.0.20 → 2.0.23  [significant]
plate: npm_weekly_downloads null → 100638, github_stars null → 16599, last_commit null → 2026-09-17, open_issues null → 16, contributors null → 268  [significant]
puck: npm_weekly_downloads null → 146091, github_stars null → 13332, last_commit null → 2026-09-17, open_issues null → 197, contributors null → 87  [significant]
quill: npm_weekly_downloads null → 6600547, github_stars null → 47348, last_commit null → 2025-07-25, open_issues null → 658, contributors null → 161  [significant]
react-page: npm_weekly_downloads null → 4544, github_stars null → 9538, last_commit null → 2026-07-28, open_issues null → 11, contributors null → 65  [significant]
sanity: npm_weekly_downloads null → 664282, github_stars null → 64, last_commit null → 2026-09-10, open_issues null → 61, contributors null → 39, latest_version 6.0.4 → 6.1.2  [significant]
silex: npm_weekly_downloads null → 159, github_stars null → 2973, last_commit null → 2026-09-16, open_issues null → 62, contributors null → 50, latest_version null → 3.0.0-alpha.17  [significant]
storyblok: npm_weekly_downloads null → 106460, github_stars null → 68, last_commit null → 2026-09-17, open_issues null → 70, contributors null → 135, latest_version 7.3.0 → 7.3.1  [significant]
teleporthq: npm_weekly_downloads null → 1165, github_stars null → 1116, last_commit null → 2026-09-17, open_issues null → 55, contributors null → 39, latest_version 0.43.52 → 0.43.65  [significant]
tinymce: npm_weekly_downloads null → 1025945, github_stars null → 16298, last_commit null → 2026-09-16, open_issues null → 420, contributors null → 330  [significant]
tiptap: npm_weekly_downloads null → 13973443, github_stars null → 38426, last_commit null → 2026-09-17, open_issues null → 846, contributors null → 529, latest_version 3.30.2 → 3.31.3  [significant]
unlayer: npm_weekly_downloads null → 196459, github_stars null → 5223, last_commit null → 2026-09-16, open_issues null → 245, contributors null → 13  [significant]

23 record(s) updated, including a significant move.

2026-08-19 — Launch

Dataset. First publication of 24 product records: eight embeddable libraries, seven commercial SDKs, four headless CMS platforms with visual editing, two self-hosted products and three hosted platforms included as build-versus-buy reference points.

Primary-source verification. Licences, first-publish dates and current versions for every npm- distributed product were read from the npm registry rather than from vendor websites.

Pricing. Recorded from vendors' published pricing pages and labelled vendor-published. Where a vendor publishes no price — Contentful Studio's add-on, the GrapesJS Studio SDK's paid tiers, Zillapage — the field is null rather than an estimate.

Measurement run bundles-2026-08-19. Six open-source libraries measured: Craft.js 0.2.12 at 29.2 kB gzip, Editor.js 2.31.6 at 64.3 kB, Puck 0.20.2 at 90.4 kB, Plate 48.0.5 at 150.8 kB, GrapesJS 0.23.5 at 294.5 kB, React Page 5.4.6 at 375.5 kB.

Measurement run tte-2026-08-19. Time to first editor measured across the same eight libraries, from 70 ms (Editor.js) to 1,004 ms (React Page), with lines of code and dependency counts.

Known issue recorded, not hidden. @react-page/editor cannot be bundled against React 19 without aliasing react/jsx-runtime.js, because its react-dnd dependency imports a path React 19 no longer exports. Recorded in the benchmark results as a workaround rather than omitted.

Correction before publication. Our first benchmark run reported that Craft.js, Puck and Plate failed against React 19. That was wrong: the cause was two React copies in our own build, not a library incompatibility. The build was fixed and all eight libraries measured successfully. It is recorded here because the incorrect finding would have been the most eye-catching claim on the site.

How this log works

Entries are added when a fact changes, a measurement is re-run, a product enters or leaves the dataset, or the methodology changes. Metric refreshes from the automated daily sync are not listed individually — each record carries its own last_verified date and metrics.updated_at for that.

Written by the EditorStack Research Team. How we test and what we refuse to publish is on the methodology page.