PageKit — the self-hosted GrapesJS site builder, sold as source. Get early access

React page builder

Build a React Page Builder Without Building the Editor From Scratch

Build an embeddable visual page builder with React and GrapesJS. Start with the open-source editor core, then add blocks, responsive controls, storage, templates and email capabilities through plugins.

Open sourceSelf-hostedEmbeddableExtensibleReact & Next.js
your-app.com/editor
React

Blocks

  • Hero
  • Text
  • Image
  • Button
  • Card
  • Columns

Your page

Hero section
The editor your users see — mounted inside your own React application, on your own domain.

26k+

GitHub stars

100+

Plugins on GJS.Market

1.4M+

npm downloads / month

$0

Editor licence fee

See it first

A React page builder, running

Open fullscreen

The unmodified open-source editor. This is the foundation everything else on this page builds on — canvas, blocks, style manager, device switching, undo/redo, export.

grapesjs.com/demo.htmlFree

Loads a live editor from a third-party demo site. Nothing is loaded until you ask for it.

Definition

What Is a React Page Builder?

A React page builder is a visual editing interface embedded into a React application that lets users create, modify and arrange page content without writing HTML and CSS by hand.

The important word is embedded. A React page builder is not a separate website your users visit — it is a route inside your product, behind your login, writing to your database.

Three layers do the work, and they belong to three different owners. Confusing them is the most common reason a page-builder project stalls.

Application layer

React / Next.js

Your application UI, authentication, routing, billing, users, permissions and APIs. The editor is one route inside it, not the whole product.

Editing layer

GrapesJS

The visual canvas, components, blocks, styling, drag and drop, commands and serialization. The part that would take months to write and years to harden.

Persistence layer

Your backend

Project storage, users, permissions, publishing and business logic. The editor hands you JSON and HTML; where it goes and who may see it is yours.

Scope

A React Page Builder Is More Than Drag & Drop

A canvas you can drop a box onto is a weekend. Everything below is what turns that prototype into something you can put in front of paying customers — and every item on the list is a subsystem someone has to build, test and keep working.

  • Visual canvasGrapesJS core
  • ComponentsGrapesJS core
  • BlocksGrapesJS core
  • Drag & dropGrapesJS core
  • Style managerGrapesJS core
  • Responsive editingGrapesJS core
  • AssetsGrapesJS core
  • Rich textGrapesJS core
  • Undo / redoGrapesJS core
  • StorageGrapesJS core
  • DevicesGrapesJS core
  • ExportGrapesJS core
  • Plugin systemGrapesJS core
  • PagesPlugins
  • TemplatesPlugins
  • PermissionsYour application
  • PublishingYour application
Who builds itYour applicationGrapesJS corePlugins

Building the first drag-and-drop prototype is relatively easy. Building everything around it that makes an editor reliable in production is the expensive part.

Build vs. adopt

Why Build the Editor From Scratch?

There is a good reason to write your own editor: your editing model is genuinely unlike anything that exists. Short of that, here is what each of the three routes actually asks of your team.

Option A

Build from scratch

You own every layer, including the ones that have nothing to do with your product.

You implement and maintain

  • Canvas and selection
  • Drag & drop with nesting rules
  • Component system
  • Block palette
  • Style manager
  • Responsive controls
  • Asset management
  • Rich text editing
  • Undo / redo history
  • Storage and autosave
  • HTML / CSS export
  • Templates and pages
  • Cross-browser testing
  • Ongoing maintenance

Every one of these is a subsystem that can regress, and none of them differentiates your product.

Option B

Start with GrapesJS

Adopt an editing foundation and build your application around it.

You implement

  • Mounting the editor in your React app
  • The blocks your product needs
  • Storage against your own API
  • Publishing your editor output
  • Your own UI around the canvas

The editor stops being a project. It becomes a dependency you configure.

See the code
Option C

Extend with GJS.Market

Add specialised capabilities without touching editor architecture.

You install

  • Blocks, presets and templates
  • Pages and project management
  • Storage adapters
  • Email and MJML support
  • Responsive and SEO tooling

The features you would have written next are already published, priced and installable.

Browse plugins

Don't build a visual editor from scratch. Build your React product around a proven editor foundation.

The stack

GrapesJS + React + Plugins = Your Page Builder

Each layer has one job. Keep them separate and the whole thing stays replaceable — including the editor, which is the point of using a standard one.

Editor engine

GrapesJS

Canvas, components, blocks, styles, commands, serialization. Open source, self-hosted, no licence fee.

plus
Application layer

React / Next.js

Your dashboard, auth, routing, billing and APIs. The editor is a route inside your app.

plus
Functionality layer

GJS.Market

The capabilities you would otherwise build next — pages, templates, storage, email, SEO.

equals
Your product

Your React page builder

  • SaaS page builder
  • Website builder
  • CMS visual editor
  • Landing page builder
  • Email builder
Start with the code
Outcomes

What Can You Build With a React Page Builder?

The same editor core, pointed at five different products. What changes between them is the blocks, the storage model and the output — not the editor.

Architecture

How React and GrapesJS Work Together

The editor is a component, not a destination. It mounts inside a route you already own, next to the rest of your application. Your users never leave your product, your session is already valid, and the content it produces goes straight into your database.
  1. React / Next.js
  2. GrapesJS
  3. Your backend

This is the part that surprises teams evaluating hosted platforms: there is no second system to keep in sync, because there is no second system.

Data flows down: your app mounts the editor, the editor hands back a project, your backend stores it.

Comparison

React Page Builder Comparison

Five tools that all describe themselves as visual editors for React, and are not interchangeable. Every cell below is taken from each project's own documentation or its published package metadata.

CapabilityGrapesJSPuckCraft.jsBuilder.ioPlasmic
React integrationOfficial wrapperReact-native APIReact-native APIReact SDKReact SDK + codegen
LicenceBSD-3-Clause core, MIT React wrapperMITMITMIT SDK, hosted platformMIT
Self-host the editor✓ — runs entirely in your app— hosted platformPartial — Studio self-hosting is documented
Embed in your own app UIVia integrationEnterprise — whitelabelling & embedding
Visual canvas✓ — same-origin iframe✓ — you supply the surrounding UI
Drag & drop
Custom components✓ — custom component types✓ — config + render function✓ — user components✓ — registered components✓ — code components
Your React components rendered in the canvasVia integration — the canvas renders DOM✓ — native✓ — native
Ready-made editor UI✓ — default UI included— you build the UI✓ — hosted UI✓ — hosted studio
Style manager for arbitrary CSS✓ — Style ManagerCustomCustom
Responsive / viewport editing✓ — Device Manager✓ — ViewportsCustom
Persist to your own database✓ — Storage Manager + custom adapters✓ — you own the data✓ — serialize to JSON— content lives in BuilderDepends — projects live in Plasmic
HTML / CSS export✓ — getHtml() / getCss()CustomCustomDepends✓ — codegen
Plugin ecosystem✓ — GJS.Market, 100+ plugins✓ — Plugin API
White-labelDepends on planEnterprise
Email (MJML / newsletter)✓ — MJML & newsletter presetsCustomCustom— email models deprecated
Embed for your own end customersDepends on planEnterprise
Latest release0.23.6 · 2026-08-250.23.0 · 2026-08-070.2.12 · 2025-02-149.4.4 · 2026-09-022.0.26 · 2026-09-02

✓ = documented capability. Custom = supported, but you implement it. Via integration / Depends / Enterprise = available under conditions the vendor sets. — = not offered, or not documented as a capability of the product itself.
Verified 2026-09-02 against each project's official documentation, npm registry metadata and GitHub repository. Product capabilities and pricing change over time — check the current documentation before making an architectural decision.

Selection

Which React Page Builder Should You Choose?

None of these is universally better. They are answers to different questions, and the question you are actually asking is usually obvious once it is written down.

Honest fit

When GrapesJS Fits — and When It Doesn't

Three outcomes, one of which is not GrapesJS. If a comparison page cannot tell you when to walk away, it isn't a comparison.

Good fit

You are building a product, and editing is a feature of it

The editor lives behind your login, writes to your database and carries your branding. You expect to keep extending it for years.

  • Self-hosting is a requirement, not a preference
  • You need HTML/CSS output you can render anywhere
  • The editor will eventually need pages, templates or email
  • You want a plugin surface instead of a fork
Look elsewhere

Your editing unit is a React component, not a page

If users are configuring instances of components you already ship, and free-form styling is explicitly not wanted, a React-first editor will feel more natural than a general visual editor.

  • Editing means filling in typed props, not moving boxes
  • Your design system is the constraint, deliberately
  • You do not need arbitrary CSS at all
Not yet

You are not sure what your users will edit

The content model decides the editor, not the other way round. Picking an editor before you know what a "page" is in your product is the most common way these projects end up rewritten.

  • Write down what a user can create, and what they cannot
  • Decide where content lives before choosing how it is edited
  • Prototype with the free core before committing
Implementation

Build Your First React Page Builder

Two packages and one component. The wrapper does not bundle the core library, so install both. The example below runs as written — the @grapesjs/react wrapper requires the core to be passed in explicitly, which is the step most third-party tutorials leave out.

npm i grapesjs @grapesjs/react
components/page-builder.tsxtsx
'use client';

import grapesjs, { type Editor } from 'grapesjs';
import GjsEditor from '@grapesjs/react';
import 'grapesjs/dist/css/grapes.min.css';

export default function PageBuilder() {
  const onEditor = (editor: Editor) => {
    // The full GrapesJS API is yours from here: Blocks, Pages,
    // DeviceManager, Commands, StorageManager.
    editor.Blocks.add('hero', {
      label: 'Hero',
      category: 'Sections',
      content: '<section class="hero"><h1>Headline</h1></section>',
    });
  };

  return (
    <GjsEditor
      // Required. The wrapper does not bundle the core library.
      grapesjs={grapesjs}
      options={{
        height: '100vh',
        // Persistence is wired separately — see the storage step below.
        storageManager: false,
      }}
      onEditor={onEditor}
    />
  );
}

What each piece does

Canvas

The visual editing surface. It renders DOM inside an iframe, which is why styles cannot leak in from your application.

Blocks

The palette users drag from. Register your product's sections here and they become editable content.

Storage

Persist projects to your own backend. Local and remote adapters ship built in; custom adapters take a load and a store method.

Plugins

The extension surface. Everything from Tailwind blocks to MJML email arrives this way, without forking the editor.

Save projects to your own database

Storage is where prototypes stop and products start. GrapesJS ships local and remote storage and lets you register a fully custom adapter with two async methods — so the editor never needs to know what your backend looks like.

storage.tsts
// Persist projects to your own API. GrapesJS ships `local` and `remote`
// storage; `Storage.add` registers a fully custom adapter.
// Docs: grapesjs.com/docs/modules/Storage.html

const onEditor = (editor: Editor) => {
  editor.Storage.add('api', {
    async load() {
      const res = await fetch(`/api/pages/${pageId}`);
      return res.json(); // → the project JSON GrapesJS restores from
    },
    async store(project) {
      await fetch(`/api/pages/${pageId}`, {
        method: 'PUT',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(project),
      });
    },
  });
};

// …then point the editor at it:
options={{
  storageManager: { type: 'api', autosave: true, stepsBeforeSave: 5 },
}}

Turn editor output into a live page

The editor hands back HTML and CSS. What you do with them is an application decision: render them from a Next.js route, push them to a CDN, or send them as an email. The editor is not in the serving path.

publish.tsts
// Editor output → a production page.
// getHtml/getCss return the exact markup the canvas rendered.

const html = editor.getHtml();
const css = editor.getCss();

await fetch('/api/publish', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ slug, html, css }),
});

// Your app renders it wherever you control — a Next.js route, a CDN
// object, an email send. The editor is not in the serving path.

Verified against @grapesjs/react 0.23.6, which targets React 18/19 and Next.js 15. One caveat worth knowing early: the React wrapper builds your UI around the canvas — it does not render your React components inside it. If rendering live React components in the canvas is a hard requirement, a React-first editor is a better match, and this page says so in the comparison above.

Next.js

Using Next.js?

Keep the editor on the client. React page builders are usually embedded into Next.js applications. The editor is client-only; your application keeps handling authentication, APIs, routing and everything server-side.
  1. Next.js App
  2. Route: /editor
  3. Client component
  4. GrapesJS
app/editor/page.tsxtsx
// app/editor/page.tsx — the editor is client-only.
// GrapesJS measures the DOM on init, so it must never render on the server.
import dynamic from 'next/dynamic';

const PageBuilder = dynamic(() => import('@/components/page-builder'), {
  ssr: false,
  loading: () => <EditorSkeleton />,
});

export default function EditorRoute() {
  // Auth, params and data fetching stay on the server side of your app.
  return <PageBuilder />;
}

Practical notes

  • Import the editor with `dynamic(..., { ssr: false })`. GrapesJS measures the DOM on init, so server rendering it produces hydration mismatches.
  • Render a skeleton in the `loading` slot. The editor bundle is large and the route otherwise flashes empty.
  • Keep auth, params and data fetching on the server side of the route; pass the results down as props.
  • Hold the editor instance from `onEditor` in a ref, not in state — writing it to state re-renders the tree on every editor event.
  • Lazy-load plugins you do not need on first paint. Most editors need blocks immediately and MJML never.

The editor is a leaf of the tree, not the trunk.

Roadmap

From Prototype to Production

  1. 1
    01

    Mount the editor

    Integrate GrapesJS into a route in your React application. At this point you have a working canvas and the default UI — a day's work, not a quarter's.

  2. 2
    02

    Define your content model

    Decide what a page is in your product, what users may create, and what they must not touch. This decision constrains everything after it, so make it before you write blocks.

  3. 3
    03

    Add blocks & components

    Turn your product's sections into blocks and custom component types. This is where the editor starts to feel like part of your product rather than a generic tool.

  4. 4
    04

    Connect storage

    Register a storage adapter against your own API, with autosave and recovery. Projects now belong to users, and drafts survive a closed tab.

  5. 5
    05

    Publish

    Turn saved projects into production pages — a Next.js route, a CDN object, an email send. The editor stays out of the serving path.

Extend

You May Not Need a Different Page Builder

Most "we need to replace our editor" conversations turn out to be about one missing capability. Replacing an editor costs a quarter; adding a capability costs an afternoon.

Don't replace the editor because one feature is missing. Extend the editor.

Marketplace

Extend Your React Page Builder With GJS.Market

Start with the editor core and add the functionality your product actually needs. Prices, names and thumbnails below come straight from the catalogue, so nothing here can drift from what is for sale.

Stacks

Build Your React Page Builder Stack

Three shopping lists rather than a catalogue dump. Each one is what a working build of that product tends to need beyond the free core.

Live catalogue prices. A stack is a suggestion, not a bundle — buy the parts you need.

Total cost

What Does It Cost to Build a React Page Builder?

The editor licence is rarely the number that matters. These are the cost centres each route creates — deliberately without invented figures, because your team's rates and scope are the only inputs that would make a number real.

Build from scratch

You pay for the editor forever

The initial build is the smaller half.

Cost centres

  • Editor architecture and design
  • Implementation across every subsystem
  • Editor UX, which is its own discipline
  • Cross-browser and regression testing
  • Bug fixing in code that is not your product
  • Integrations as requirements arrive
  • Ongoing maintenance, indefinitely

Every future feature request lands on the team that owns the editor — which is you.

Use GrapesJS

You pay for integration, not invention

The editor arrives; the product work remains.

Cost centres

  • Integration into your React app
  • Customisation to your design system
  • Backend and storage wiring
  • Your product-specific features

No licence fee for the core, and upstream maintenance is somebody else's job.

Add plugins

You pay per capability, once

Buy the features you were about to schedule.

Cost centres

  • One-off cost per plugin, at catalogue price
  • Configuration rather than construction
  • No headcount attached to the capability

Each plugin removes a line item from the roadmap rather than adding one.

See catalogue prices

The expensive part of a page builder is not the first demo. It's everything required to make the editor production-ready.

Division of labour

Build Your Product. Not Your Editor Infrastructure.

Here is the whole argument on one screen. The left column is work only you can do, because it is your product. The other two are work that already exists.

Your app & backend
  • AuthenticationWho is logged in, and as whom.
  • BillingPlans, limits and invoices.
  • Users & permissionsWho may edit which project.
  • DatabaseWhere projects and pages actually live.
  • PublishingTurning saved content into a live URL.
GrapesJS
  • Canvas & selectionThe editing surface and everything on it.
  • Blocks & drag-dropThe palette and the sorting rules.
  • Style managerPer-component, per-breakpoint CSS.
  • Component systemTyped elements with traits and serialization.
  • Editing & historyRich text, undo/redo, commands.
GJS.Market
  • Email outputMJML and newsletter presets.
  • Templates & pagesReusable starting points, multi-page projects.
  • SEO & accessibilityAuditing before the page goes live.

The expensive part of a page builder is not the first demo. It is everything required to make the editor production-ready — and almost none of it is what your customers are paying you for.

Audience

Who Builds React Page Builders?

Four teams arrive at this page with the same requirement and very different constraints.

SaaS founders

You need a visual editor inside your product, on your domain, under your branding — and you cannot send customers to a third-party platform to edit their own content.

Product teams

Visual editing is one feature on a roadmap full of them. You need it to ship without becoming a permanent internal platform team.

Agencies

You build the same editing surface for client after client. A reusable, self-hostable foundation is worth more than any single project.

Developers

You want an extensible editor core and full control over the application around it, without inheriting somebody else's product decisions.

Decision

Find the Right React Page Builder

Three questions. Two of the four answers are not GrapesJS.

Do you need the visual editor to live inside your own application?

Every path at a glance

  • Do you need the visual editor to live inside your own application? Yes, inside my app, then Is the thing users edit always one of your existing React components? Yes, components onlyResult: Consider Puck
  • Do you need the visual editor to live inside your own application? Yes, inside my app, then Is the thing users edit always one of your existing React components? No, they edit pages and layout, then Do you want to design and build the entire editor interface yourself? Yes, I'll build the UIResult: Consider Craft.js
  • Do you need the visual editor to live inside your own application? Yes, inside my app, then Is the thing users edit always one of your existing React components? No, they edit pages and layout, then Do you want to design and build the entire editor interface yourself? No, I want an editor UI includedResult: GrapesJS fits
  • Do you need the visual editor to live inside your own application? No, a hosted tool is fineResult: Consider a hosted platform
Comparisons

Compare React Page Builder Frameworks

Each of these goes considerably deeper than the matrix above — data models, migration paths and the cases where the other tool wins.

FAQ

React Page Builder Questions

Get started

Build Your React Page Builder

Start with GrapesJS, integrate it with React, and extend your editor with the functionality your product needs.

Developer

Start building

Open a live editor, then take the quick start and mount one in your own React app.

Try GrapesJS
Extend

Add what you're missing

Blocks, pages, templates, storage adapters, MJML email and SEO tooling — priced per capability.

Browse GJS.Market plugins
Product team

Need help?

Architecture review, a custom editor build, or a second opinion before you commit to a stack.

Talk to a GrapesJS expert

Build your product. Not your editor infrastructure.