Skip to content
EditorStackPlayground

React Page review: a cell-and-row content editor for React

React Page is an MIT-licensed, cell-and-row based content editor for React that ships a grid layout system and a plugin API, first published to npm in November 2019.

Last verified · MIT · Free (open source) · Official site · Repository

TL;DR

  • React Page is an MIT-licensed React content editor built around a cell-and-row grid, with per-language content handling included rather than bolted on.
  • We measured @react-page/editor 5.4.6 at 377.2 kB gzip — the third-largest bundle in this dataset — and a median of 1,004 ms to a rendered editor, the slowest of the eight libraries we tested.
  • It does not bundle against React 19 without aliasing react/jsx-runtime.js, because its react-dnd dependency imports a path React 19 no longer exports.

React Page quick facts

Quick facts about React Page
TypeLibrary
LicenceMIT
First release2019-11
LanguageTypeScript
FrameworksReact
SSR supportpartial
Bundle size (min+gzip)377.2 kB gzip
PricingFree (open source)
Self-hostedYes
White labelYes
npm weekly downloads4,544
GitHub stars9,538
Latest version5.4.6
Last verified2026-08-19

What React Page is, and who it is for

React Page is a content editor built around an explicit layout grid. Content lives in cells, cells sit in rows, and users resize and rearrange them. Each cell is rendered by a cell plugin — text, image, video, spacer, or one you write.

This puts it in a different place from Puck and Craft.js. Those two treat layout as something your components decide; React Page treats layout as a first-class feature of the editor. If your users need to put two things side by side and resize the split, React Page does that on install and the others do not.

Its other distinguishing feature is language handling. Content can carry per-language values with the editor aware of the current language, which is unusual — most editors leave internationalisation entirely to the surrounding application.

The library is the oldest active React editor in this dataset, first published in November 2019, and it shows both in what it includes and in what it costs.

Architecture: cells, rows and plugins

The stored value is a tree of rows and cells. Each cell records which plugin renders it and that plugin's data. Layout plugins can wrap groups of cells for structural components.

A cell plugin declares its controls — the settings form the editor shows — its default data, and its renderer. The contract is straightforward, and writing one is a familiar exercise for a React developer, though the type ergonomics feel dated next to Puck's.

The editor interface is built on Material UI, which is the main reason for the bundle size. That is a structural cost rather than a configuration choice: you are shipping a component library inside your editor whether or not your application uses one.

Getting started

From our benchmark. Note the two CSS imports — the editor ships styles you must include, unlike the prop-driven builders:

import { useState } from 'react';
import { createRoot } from 'react-dom/client';
import Editor from '@react-page/editor';
import slate from '@react-page/plugins-slate';
import '@react-page/editor/lib/index.css';
import '@react-page/plugins-slate/lib/index.css';

const cellPlugins = [slate()];

function App() {
  const [value, setValue] = useState(null);
  return <Editor cellPlugins={cellPlugins} value={value} onChange={setValue} />;
}

createRoot(document.getElementById('app')).render(<App />);
The React Page benchmark application showing its Material UI editor interface with an empty cell grid

React Page 5.4.6 from the code above. The interface is Material UI, which is both why it looks finished and why it weighs 377.2 kB.

Building this at all required aliasing react/jsx-runtime.js to react/jsx-runtime in our bundler. Without it, esbuild fails outright on react-dnd. That is a real integration cost that no feature comparison mentions, and it is recorded in our time to first editor benchmark.

Strengths

A layout grid you do not have to build. Rows, cells, resizing and drop targets are included. Recreating this on Craft.js is a substantial project.

Multilingual content is built in. Per-language content handling inside the editor rather than in your data layer is rare in this category and genuinely valuable for teams who need it.

A finished-looking interface on install. For internal tools where nobody is going to restyle the editor, this is worth real money.

MIT licensed and self-hosted. No service, no account, no usage ceiling.

A stable API. The slow release cadence has an upside: integrations do not need rewriting every quarter.

Limitations

One of the largest bundles we measured. 377.2 kB gzip, more than four times Puck and nearly thirteen times Craft.js. Much of that is the Material UI editor interface, which you cannot opt out of.

The slowest to first editor. 1,004 ms median in our benchmark, roughly ten times Craft.js.

React 19 needs a bundler workaround. See above. It is one line of configuration, but you have to know to write it, and it signals a dependency tree that has not been modernised.

Dated ergonomics. Type definitions and error messages are noticeably older in style than Puck's, and invalid plugin definitions do not always report where the mistake is.

A thin ecosystem. A small set of official plugins and few third-party ones. Plan to write what you need.

Documentation lags the code. Some pages describe earlier versions, so the examples directory in the repository is often the more reliable reference.

Pricing

Free under MIT with no usage limits. The cost is the bundle you ship and the plugins you write. For a React team choosing today, Puck covers most of the same ground at a quarter of the weight — the exception being teams who specifically need the resizable grid or the multilingual handling, which Puck does not have. React Page vs Puck sets out that trade directly.

Who React Page fits, and who it does not

Good fit

  • React content sites that need a row-and-column layout editor with per-language content out of the box
  • Teams replacing a legacy WYSIWYG in an internal CMS where multilingual content is a hard requirement
  • Projects that want both a layout grid and custom React plugins without building the grid themselves

Poor fit

  • Products needing an active, fast-moving upstream, since release cadence is slow compared with newer React builders
  • Non-React stacks and server-rendered templating engines
  • Design-heavy landing pages that need arbitrary positioning rather than a cell grid

Our scores for React Page

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 experience6.5/10

The editor mounts with a value and an onChange, which is familiar to any React developer, and the cell plugin contract is straightforward. Type ergonomics are dated in places and error messages from invalid plugin definitions are not always specific enough to locate the mistake quickly.

Extensibility7.5/10

Cell plugins define their own controls, serialisation and rendering, and layout plugins can wrap groups of cells, which covers most structural requirements. Deeper changes to the drag-and-drop behaviour or grid semantics are harder because those live inside the core.

Documentation6/10

Concepts are explained with runnable examples and the multilingual story is documented, which is unusual. Some pages lag behind the current major version, so a portion of integration work is reading the examples directory in the repository instead.

Ecosystem5/10

A small set of official plugins covers text, image, video and spacer, and third-party contributions are rare. Teams should plan to write the plugins their product needs rather than shop for them.

Time to production7/10

The built-in grid and language handling remove two chunks of work that other React libraries leave to you, so a straightforward content editor lands quickly. Anything requiring modification of core drag behaviour extends the timeline sharply.

React Page 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.

React Page compared with the nearest products in the dataset
ProductLicenceBundlePrice fromSelf-hosted
React PageMIT377.2 kB gzipFree (open source)Yes
BlockNoteMPL-2.0386.1 kB gzipfrom $195/moYes
Craft.jsMIT29.2 kB gzipFree (open source)Yes
LexicalMIT104.9 kB gzipFree (open source)Yes

Alternatives to React Page

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

Does React Page work with React 19?
It runs, but it does not bundle without help: react-dnd, a dependency of @react-page/editor, imports react/jsx-runtime.js, which React 19 does not export. We aliased that path in esbuild to complete our benchmark, and recorded it as a workaround.
How big is React Page?
We measured @react-page/editor 5.4.6 at 377.2 kB gzip (1,279.3 kB raw) with React external — the third largest of the twelve libraries in our bundle benchmark, largely because it bundles a Material UI-based editor interface.
What makes React Page different from Puck?
React Page gives you a row-and-column grid and multilingual content out of the box; Puck gives you a smaller, more modern API and no grid. React Page is the older design and shows it in bundle size and API ergonomics.
Is React Page still maintained?
It receives updates — 5.4.6 was published in July 2026 — but the cadence is slower than newer React builders, and parts of the documentation lag the current major version.

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 @react-page/editor (licence, first publish date, latest version) — accessed 2026-08-19
  2. React Page source repository — accessed 2026-08-19
  3. React Page documentation — accessed 2026-08-19