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.
PageKit — the self-hosted GrapesJS site builder, sold as source. Get early access
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.
Blocks
Your page
Styles
26k+
GitHub stars
100+
Plugins on GJS.Market
1.4M+
npm downloads / month
$0
Editor licence fee
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.
Loads a live editor from a third-party demo site. Nothing is loaded until you ask for it.
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
Your application UI, authentication, routing, billing, users, permissions and APIs. The editor is one route inside it, not the whole product.
Editing layer
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
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.
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.
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.
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.
You own every layer, including the ones that have nothing to do with your product.
You implement and maintain
Every one of these is a subsystem that can regress, and none of them differentiates your product.
Adopt an editing foundation and build your application around it.
You implement
The editor stops being a project. It becomes a dependency you configure.
See the codeAdd specialised capabilities without touching editor architecture.
You install
The features you would have written next are already published, priced and installable.
Browse pluginsDon't build a visual editor from scratch. Build your React product around a proven editor foundation.
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.
GrapesJS
Canvas, components, blocks, styles, commands, serialization. Open source, self-hosted, no licence fee.
React / Next.js
Your dashboard, auth, routing, billing and APIs. The editor is a route inside your app.
GJS.Market
The capabilities you would otherwise build next — pages, templates, storage, email, SEO.
Your 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.
Let your customers create and customise pages inside your SaaS, under your branding, on your infrastructure.
Build a SaaS page builderGive marketers a visual surface for landing pages so campaign changes stop arriving as engineering tickets.
Build a landing page builderMulti-page sites with visual editing, shared templates, navigation and per-page settings.
Build a website builderVisual email creation with MJML output, so what your users design survives contact with real email clients.
Build a React email builderAdd visual editing to an existing content system without replacing the content model you already have.
Add visual editing to a CMSContent and page editing interfaces for teams inside your company, where a hosted platform is not an option.
See the plugin catalogueThis 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.
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.
| Capability | GrapesJS | Puck | Craft.js | Builder.io | Plasmic |
|---|---|---|---|---|---|
| React integration | Official wrapper | React-native API | React-native API | React SDK | React SDK + codegen |
| Licence | BSD-3-Clause core, MIT React wrapper | MIT | MIT | MIT SDK, hosted platform | MIT |
| Self-host the editor | ✓ — runs entirely in your app | ✓ | ✓ | — hosted platform | Partial — Studio self-hosting is documented |
| Embed in your own app UI | ✓ | ✓ | ✓ | Via integration | Enterprise — 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 canvas | Via 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 Manager | Custom | Custom | ✓ | ✓ |
| Responsive / viewport editing | ✓ — Device Manager | ✓ — Viewports | Custom | ✓ | ✓ |
| Persist to your own database | ✓ — Storage Manager + custom adapters | ✓ — you own the data | ✓ — serialize to JSON | — content lives in Builder | Depends — projects live in Plasmic |
| HTML / CSS export | ✓ — getHtml() / getCss() | Custom | Custom | Depends | ✓ — codegen |
| Plugin ecosystem | ✓ — GJS.Market, 100+ plugins | ✓ — Plugin API | — | ✓ | ✓ |
| White-label | ✓ | ✓ | ✓ | Depends on plan | Enterprise |
| Email (MJML / newsletter) | ✓ — MJML & newsletter presets | Custom | Custom | — email models deprecated | — |
| Embed for your own end customers | ✓ | ✓ | ✓ | Depends on plan | Enterprise |
| Latest release | 0.23.6 · 2026-08-25 | 0.23.0 · 2026-08-07 | 0.2.12 · 2025-02-14 | 9.4.4 · 2026-09-02 | 2.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.
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.
Choose it when
You need an embeddable visual editor you control end to end: self-hosted, deeply customisable, plugin-based, HTML/CSS-oriented, and able to grow into pages, templates and email. Best fit for SaaS products and CMS editors.
See the quick startConsider it when
Your primary use case is composing and configuring React components you already ship. Puck's model is a config of React components with typed fields — a strong fit when the design system, not free-form CSS, is the unit of editing.
GrapesJS vs PuckConsider it when
You want a lower-level React editor framework and intend to build the editor experience yourself. It supplies drag and drop and a component state model; the toolbars, panels and style controls are yours to write.
GrapesJS vs Craft.jsConsider them when
You want a managed visual editing platform and are comfortable with content or projects living on the vendor's side. Both are strong products; both trade some architectural control for a much shorter path to a first page.
Compare the alternativesThree outcomes, one of which is not GrapesJS. If a comparison page cannot tell you when to walk away, it isn't a comparison.
The editor lives behind your login, writes to your database and carries your branding. You expect to keep extending it for years.
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.
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.
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'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
The visual editing surface. It renders DOM inside an iframe, which is why styles cannot leak in from your application.
The palette users drag from. Register your product's sections here and they become editable content.
Persist projects to your own backend. Local and remote adapters ship built in; custom adapters take a load and a store method.
The extension surface. Everything from Tailwind blocks to MJML email arrives this way, without forking the editor.
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.
// 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 },
}}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.
// 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.
// 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
The editor is a leaf of the tree, not the trunk.
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.
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.
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.
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.
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.
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.
The official wrapper mounts GrapesJS as a React component and hands you the editor instance. Starters and React UI packs go further.
React pluginsMJML and newsletter presets turn the same editor into an email builder, with output that survives real email clients.
Email pluginsBlock packs give users something to drag on day one, instead of an empty palette and a backlog ticket.
Block pluginsTemplate and project managers add saved starting points, multi-project handling and per-page settings.
Template pluginsTailwind block packs let the editor emit utility classes that match the rest of your codebase.
Tailwind pluginsStorage adapters cover IndexedDB, Firestore and custom REST endpoints — or write your own in about twenty lines.
Storage pluginsContent generation, image tooling and accessibility/SEO auditors plug into the same editor without a fork.
Browse the catalogueDon't replace the editor because one feature is missing. Extend the editor.
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.
Starters, React UI layers and component presets for teams mounting the editor inside a React or Next.js app.
Browse categoryA working React integration to start from instead of a blank file.
React UI components for the panels around the canvas.
A React-oriented preset, so the editor arrives configured rather than bare.
A full shadcn-styled editor interface — the clearest proof of how far the UI can move.
What users drag, and where the pages live: block palettes, multi-page handling, templates and breakpoints.
Browse categoryThe starter block palette, so users have something to drag on day one.
Multi-page projects with navigation and per-page settings.
Saved templates users pick from instead of starting empty.
Custom breakpoints that match your design system, not the defaults.
The part every prototype is missing. Project management, offline storage, cloud adapters and crash recovery.
Browse categoryMultiple projects per user, listed, loaded and switched.
Local-first persistence in the browser, useful for drafts and offline editing.
A ready-made storage adapter for Firestore-backed products.
Autosave and recovery, so a lost tab is not a lost afternoon.
Where a page builder grows next: email output, utility-class workflows, and accessibility/SEO auditing.
Browse categoryMJML components in the canvas, compiled live — email that renders in real clients.
Responsive email block pack for newsletter and campaign workflows.
Tailwind block set, so editor output matches the rest of your codebase.
Accessibility and SEO auditing inside the editor, before publish.
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.
For customer-facing builders inside your product
For multi-page website creation
For visual email creation
Live catalogue prices. A stack is a suggestion, not a bundle — buy the parts you need.
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.
The initial build is the smaller half.
Cost centres
Every future feature request lands on the team that owns the editor — which is you.
The editor arrives; the product work remains.
Cost centres
No licence fee for the core, and upstream maintenance is somebody else's job.
Buy the features you were about to schedule.
Cost centres
Each plugin removes a line item from the roadmap rather than adding one.
See catalogue pricesThe expensive part of a page builder is not the first demo. It's everything required to make the editor production-ready.
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.
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.
Four teams arrive at this page with the same requirement and very different constraints.
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.
Visual editing is one feature on a roadmap full of them. You need it to ship without becoming a permanent internal platform team.
You build the same editing surface for client after client. A reusable, self-hostable foundation is worth more than any single project.
You want an extensible editor core and full control over the application around it, without inheriting somebody else's product decisions.
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
Each of these goes considerably deeper than the matrix above — data models, migration paths and the cases where the other tool wins.
Two different data models: a JSON tree of React component props, versus a document of typed components with CSS. A guide to which one matches your content.
Read the comparisonA batteries-included editor against a framework for building your own. Includes what you actually have to write in each case.
Read the comparisonThe wider field — hosted platforms, React-first editors and WYSIWYG components — with the trade-off each one asks you to accept.
See all alternativesStart with GrapesJS, integrate it with React, and extend your editor with the functionality your product needs.
Open a live editor, then take the quick start and mount one in your own React app.
Try GrapesJSBlocks, pages, templates, storage adapters, MJML email and SEO tooling — priced per capability.
Browse GJS.Market pluginsArchitecture review, a custom editor build, or a second opinion before you commit to a stack.
Talk to a GrapesJS expertBuild your product. Not your editor infrastructure.