Code control
The editor's source is readable. You can trace a behaviour to the line that causes it, patch it, and fork it if you ever have to.
PageKit — the self-hosted GrapesJS site builder, sold as source. Get early access
Build a visual page builder you can self-host, customize and extend. Use GrapesJS as the open-source editing engine, and add the functionality your product needs with plugins.
Blocks, canvas and style controls — running inside your application, on your infrastructure.
26k+
GitHub stars
BSD-3-Clause
Core licence
1.4M+
Monthly npm downloads
100+
Plugins on GJS.Market
Open source is not a feature list — it is a set of rights over the editor in your product. These are the six that change how you build.
The editor's source is readable. You can trace a behaviour to the line that causes it, patch it, and fork it if you ever have to.
GrapesJS is a client-side library you bundle. Nothing calls home, and the editor keeps working regardless of anyone else's uptime.
Projects, pages and assets go into your database through a storage adapter you write. The editor never sees a server you do not control.
Panels, buttons, sectors and the whole surrounding shell are yours to arrange. Your users do not have to meet a generic editor UI.
Your APIs, your authentication, your asset storage, your publishing pipeline. The editor calls the functions you give it.
Your core editing experience is not licensed from a hosted platform, so nobody else's pricing or roadmap decides whether your product still works.
The most expensive mistake teams make here is treating "we want to own our page builder" and "we have to write a visual editor" as the same sentence. They are not.
Open source
does not meanOpen source
meansThe goal isn't to reinvent every part of a visual editor. It's to start from an open-source foundation and spend your engineering time on the product that makes your application unique.
That is a reframing, not a promise of free lunch. An open-source foundation removes the canvas, the component model and the styling engine from your backlog. It does not remove your backend, your publishing workflow, or the work of keeping a dependency current — those move onto your plate the moment you self-host.
A useful comparison has to be honest about which capabilities arrive working, which arrive as an API you still have to use, and which are simply yours either way. This table separates those three.
| Capability | Build from scratch | Open-source foundation |
|---|---|---|
| Visual canvas | Build it | Built in |
| Component model | Build it | Built in |
| Drag & drop | Build it | Built in |
| Blocks | Build it | API built in — content is yours |
| Styling | Build it | Built in |
| Responsive editing | Build it | Built in — you configure it |
| Assets | Build it | Built in — you configure it |
| Rich text | Build it | Built in |
| Undo / redo | Build it | Built in |
| Storage | Build it | Connect your backend |
| Publishing | Build it | Build your workflow |
| Custom editor UI | Build it | Built in — you configure it |
| Plugin architecture | Build it | Built in |
| Product logic | Build it | Your application |
Verified against grapesjs 0.23.6 on 2026-09-03 by running each API in a browser, not by reading a feature list. "Built in" means the module ships in the core package; "API built in" means the mechanism ships but the content does not.
Open source gives you a head start without taking control away from you.
GrapesJS is a framework-agnostic visual editor you install from npm and mount into your own UI. These are the parts of it you will actually build on — and where each one stops.
Core
A canvas your users compose in directly: select, move, nest and edit real DOM rather than a preview of it.
Core
Reusable content structures with typed traits, so a marketer edits a headline in a form field instead of a div.
Core API
The draggable panel is core; the blocks in it are not. You register your own, or install a block plugin.
Core
A style manager with sectors and selectors, so users change how something looks without touching CSS.
Core
Device breakpoints are a core module. You define which devices your product offers and what widths they map to.
Core API
A plugin is a function that receives the editor. That is the whole contract, and it is why an ecosystem exists at all.
Core
Output is HTML and CSS you can read, diff and serve. Useful when the thing you are building is genuinely for the web.
Via plugins
Email is not in the core package. MJML and newsletter presets add it — a real capability, but an installed one.
Every layer between "open source" and "a page builder you own" belongs to someone. Being clear about which ones are yours is the difference between a realistic plan and a surprise.
The open-source visual editing foundation: canvas, components, blocks, styles, assets and the plugin contract.
Authentication, dashboard, billing, users, permissions and the product experience around the editor.
Storage, projects, publishing, versions and the business logic that makes your product worth paying for.
Optional blocks, integrations and specialized functionality — used where buying beats building, skipped where it doesn't.
You are not outsourcing your product. You are declining to rewrite a canvas.
Everything that makes your product yours. None of it comes from the editor.
Whatever you already build in. GrapesJS is framework-agnostic and mounts into a container element.
The open-source layer. Installed from npm, configured by you, running on your infrastructure.
Your API, your database, your rules. GrapesJS calls the load and store functions you write.
GrapesJS handles the editing experience. Your application handles everything that makes your product unique.
See how the integration worksSix products teams actually ship on this foundation. Each one is a different amount of work around the same editor.
Let your customers create and customize pages inside your product, with your components and your permissions.
Build a SaaS page builderMulti-page sites with visual editing. The Pages module is core; routing, domains and hosting are yours to build.
Build a website builderGive marketers a visual way to ship campaign pages without a deploy — and without leaving your design system.
Build a landing page builderAdd visual editing to a CMS or headless CMS, so editors see the page instead of a field list.
Build a CMS editorThe same editor, pointed at email. MJML and newsletter presets handle the output; they are plugins, not core.
Build an email builderCustom visual editing for the team that keeps asking engineering to change a paragraph. No public product required.
Four situations where owning the editor is worth the work it costs.
01
You want to give customers a visual editor without outsourcing the experience your product is judged on.
02
You need visual editing inside an application that already exists, on the framework it already uses.
03
You want control over the editor architecture, the data model and every integration point.
04
You want reusable visual editing infrastructure you can carry across client projects instead of relicensing per site.
GrapesJS is a good answer to a specific shape of requirement. If most of this list is your list, it fits.
Choose GrapesJS when you need:
What you take on in exchange: you host it, you upgrade it, you write the storage and publishing layers, and you own the editor's behaviour when something breaks. That is a real cost, and it is the right one to pay only if the list above is genuinely your list.
Start with GrapesJSThree requirements where something else is the better tool. If one of these is your situation, GrapesJS will fight you.
A hosted platform
You get the editor, hosting, upgrades and support as one bill, and you give up source control, self-hosting and the ability to change the editor itself.
A React component editor
If pages are trees of your own React components and never HTML you hand-edit, a React-first editor matches your data model more directly than an HTML/CSS-oriented one.
A complete website builder
If you want a finished website-building product rather than an editor you embed, projects that ship the whole application will get you there far faster.
None of these is a weakness in the other tools. They are different products answering different questions, and picking the wrong category costs more than picking the wrong library.
Compare open-source page buildersThese projects are not interchangeable. Some are libraries you embed, some are applications you deploy, and comparing them on one undifferentiated feature list is how teams end up committed to the wrong category. They are grouped by what they are before they are compared on what they do.
Libraries you install from npm and mount inside an application you already have. You supply the UI, the backend and the publishing pipeline; the library supplies the editing.
In this group
Libraries for building an editor over your own React component tree. A page is JSON describing components, not markup — which is the right model if your pages are already React.
In this group
Applications you deploy and use, rather than libraries you build with. Far faster to a working site, and not designed to disappear inside someone else's product.
In this group
Full content platforms where visual page building is one capability among content modelling, roles and publishing. You adopt the platform, not just the editor.
In this group
| Capability | GrapesJS | Puck | Craft.js | Silex | Webstudio | Webiny |
|---|---|---|---|---|---|---|
| Licence | BSD-3-Clause | MIT | MIT | AGPL-3.0 | AGPL-3.0 | MIT* |
| Self-hosted | Yes — a client-side library you bundle | Yes | Yes | Yes — Docker, npm or source | Published sites yes; the docs advise against self-hosting the builder in production | Yes, but AWS only — the docs are explicit that nothing else is supported |
| Embeddable in your app | Yes — mount the library into any container element | Yes — “just a React component” in your tree | Yes, but it is a toolkit: you build the editor UI yourself | As a Node server. No documented front-end editor mount | No — the builder package is private and not published to npm | No — an iframe into a fully deployed Webiny stack |
| Visual editor | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Drag & drop | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Custom components | ✓ | ✓ | ✓ | ✓ | Not verified | ✓ |
| Responsive editing | ✓ | ✓ | Custom — you build it | Partial | ✓ | ✓ |
| Custom backend / storage | Storage API — your own load and store functions | onPublish / onChange — you save the data | serialize() / deserialize() — you save the JSON | Connector API for storage and hosting | No connector API; data leaves via CLI export | Storage is fixed at project creation and cannot be changed later |
| Plugin architecture | ✓ | ✓ | None — by design | ✓ | Not verified | ✓ |
| HTML / CSS output | ✓ | — | — | ✓ | ✓ | — |
| Email workflows | Via plugin | — | — | — | — | — |
| React | ✓ | ✓ | ✓ | Not the primary focus | ✓ | ✓ |
| Framework | Framework-agnostic | React | React | Framework-agnostic (built on GrapesJS) | React (React Router v7 output) | React (Next.js supported) |
| Verified version | grapesjs 0.23.6 | @puckeditor/core 0.23.0 | @craftjs/core 0.2.12 | @silexlabs/silex 3.9.0 | 0.296.0 | 6.4.9 |
| Latest release | Released 2026-08-26 | Released 2026-08-07 | No commits on any branch since 2025-02 | Released 2026-07-26 | Released 2026-09-01 | Released 2026-08-27 |
Licences read from each repository's own LICENSE file, versions and deprecations from the npm registry, capabilities from each project's own documentation. Verified 2026-09-03. “Not verified” means we could not find a primary source either way — not that the capability is missing. A dash means the project does not target that use case. *Webiny's root licence carves out an enterprise directory and defers to per-package licences; on the current default branch that directory is absent and every per-package licence is MIT.
Three questions, in the order that actually narrows the field. The first one eliminates more options than the other two combined.
A product — the editor lives inside my application
Keep goingYou want a foundation you embed and control. Question 02 narrows which kind.
A finished tool — I want to build sites with it
Website builderYou want an application, not a library. Deployable open-source website builders will get you there far faster than any framework.
A content platform for a whole team
CMS platformIf page building is one requirement among publishing, roles and content modelling, start from a content platform instead.
Markup I can serve, export and diff
GrapesJSHTML and CSS output, a framework-agnostic editor, and a storage adapter into your own database.
A tree of my own React components
React editorIf pages are component trees serialized as JSON and never hand-edited markup, a React-first editor is the closer fit.
Both, depending on the surface
GrapesJS + ReactThe official React wrapper mounts the editor as a React component while output stays HTML/CSS. This is the common case for SaaS.
Yes — we run our own infrastructure
Self-host itInstall, configure, write a storage adapter, and the editor is genuinely yours.
Not right now
Hosted editorA hosted platform trades control for someone else carrying the infrastructure. That is a legitimate trade, not a failure.
Yes, but we don't want to build every feature
Foundation + pluginsSelf-host the editor and buy the pieces that aren't your product's differentiator.
The right choice depends on whether you need a complete website-building product or an editor foundation that becomes part of your own application. Everything else — licence, framework, plugin API — only matters once that question is answered.
01 — Install
One dependency. No build plugin, no framework requirement.
npm install grapesjs02 — Initialize
Point it at a container and choose your device breakpoints. This is a working editor.
import grapesjs from 'grapesjs';
import 'grapesjs/dist/css/grapes.min.css';
const editor = grapesjs.init({
container: '#gjs',
height: '100vh',
width: 'auto',
// Reads the markup already inside #gjs as the starting page.
fromElement: true,
// No storage yet — step 04 connects your backend.
storageManager: false,
deviceManager: {
devices: [
{ id: 'desktop', name: 'Desktop', width: '' },
{ id: 'tablet', name: 'Tablet', width: '768px', widthMedia: '992px' },
{ id: 'mobile', name: 'Mobile', width: '320px', widthMedia: '480px' },
],
},
});03 — Extend
A component type defines what users can edit; a block makes it draggable. They are two registrations, not one.
// A component type owns its markup and the traits your users can edit.
editor.Components.addType('cta', {
model: {
defaults: {
tagName: 'a',
attributes: { class: 'cta', href: '#' },
components: 'Get started',
traits: [
{ name: 'href', type: 'text', label: 'Link' },
{ name: 'title', type: 'text', label: 'Title' },
],
},
},
});
// A block is what makes that type draggable from the panel — a separate,
// explicit registration, not something the type gives you for free.
editor.Blocks.add('cta-block', {
label: 'CTA',
category: 'Basic',
content: { type: 'cta' },
});04 — Connect
The storage adapter is where the editor stops and your product starts.
// Your backend, your schema, your auth. GrapesJS calls load() and store();
// everything inside them is yours.
editor.Storage.add('your-backend', {
async load() {
const res = await fetch(`/api/pages/${pageId}`, { credentials: 'include' });
return res.ok ? res.json() : {};
},
async store(data) {
await fetch(`/api/pages/${pageId}`, {
method: 'PUT',
credentials: 'include',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data),
});
return data;
},
});
// Publishing is your workflow, not the editor's. getHtml()/getCss() give you
// the output; what happens to it is a decision only your product can make.
editor.Commands.add('publish-page', {
run: (ed) => ({ html: ed.getHtml(), css: ed.getCss() }),
});Verified against grapesjs 0.23.6 on 2026-09-03.
That is the whole surface: install, mount, extend, connect. Everything past step 04 — auth, billing, versions, domains — is your application, and none of it is decided by the editor.
The project's own demo — core editor, default panels, nothing bought.
Loads a third-party demo in an iframe. Nothing loads until you click.
Start with an open-source editor core. Add only the functionality your product needs — and build the rest yourself, where it is actually your differentiator.
This section is temporarily unavailable.
Browse by capability
Not a bundle — three sets that cover the first real requirement in each of three common builds. Every item is a live listing, and every one of them is optional.
Your first visual editor
Read the tutorialA customer-facing page builder
Visual email creation
Build an email builderPrices are read live from the catalogue.
Most "GrapesJS can't do X" conclusions are really "the core package doesn't ship X". Those are different problems, and only one of them requires a different editor.
Need React integration?
React integration
An official wrapper mounts the editor as a React component, so it lives in your tree like anything else.
Need email?
Email plugins
MJML and newsletter presets turn the same canvas into an email builder.
Need templates?
Template plugins
Preset and template managers give users a library to start from instead of a blank canvas.
Need Tailwind?
Tailwind blocks
Tailwind-class block sets, so the editor emits the classes your codebase already uses.
Need custom blocks?
Block plugins
Or write them yourself — a block is a label, a category and some content.
Need storage?
Storage adapters
Ready-made adapters, or your own load/store pair against your API.
Don't replace the editor because one feature is missing. Extend it.
Open source changes the economics of a page builder. It does not eliminate the engineering, and any page that tells you otherwise is selling something. Here is what you still own on each route.
You own:
Total control, and the longest path to a first working editor. Worth it only when the editor itself is your product's differentiator.
You still build:
The visual editing foundation already exists. Everything above is still yours to build — this list is shorter than Route A's, not empty.
You still build:
Buying a block set or a storage adapter removes a task, not a dependency. Each one is code you now rely on and have to keep working.
We deliberately publish no dollar figure for "building a page builder from scratch". There is no credible public benchmark for it, the honest answer depends entirely on your team and scope, and an invented number would be the least trustworthy thing on this page. Count the surfaces above instead — they are the thing you are actually trading.
This is a trade, not a ranking. Open source gives you more control; hosted gives you less to operate. Both columns contain things that will matter to you.
| Dimension | Open source | Hosted |
|---|---|---|
| Source control | Yours to read, patch and fork | Limited to what the platform exposes |
| Self-hosting | Usually possible | Usually not |
| Data location | Your infrastructure | The provider's |
| UI customization | High — the shell is yours | Depends on the platform |
| Vendor dependency | Lower | Higher |
| Maintenance | Your responsibility | The provider's |
| Infrastructure | Your responsibility | The provider's |
| Extensibility | Depends on the project's plugin API | Depends on the platform's extension points |
| Time to a working editor | Integration work before anything is usable | Usable before you have written any code |
Open source gives you more control, but you also take responsibility for infrastructure and maintenance. If nobody on your team wants that responsibility, hosted is the honest answer.
A visual page editor whose source code is published under an open-source licence, so you can read it, run it on your own infrastructure, modify it, and build a product on top of it. It can be a library you embed in your application, or a complete website-building application you deploy — those are very different things that share the same label.
There isn't one best — there is a best for your requirement. If you are embedding an editor into your own application and want HTML/CSS output, GrapesJS fits. If pages are trees of your React components, a React-first editor fits better. If you want a finished website-building application rather than a foundation, a deployable website builder will be faster. Answer "library or application?" first; it eliminates more options than any feature comparison.
Yes. The core grapesjs package is published under the BSD-3-Clause licence, and the official @grapesjs/react wrapper under MIT. Both are permissive licences. Note that GrapesJS core is not MIT, despite what a lot of comparison articles say.
Yes. GrapesJS is a client-side JavaScript library you install from npm and bundle with your application. There is no service to call and no account to create, so it runs wherever your frontend runs.
Yes, and it is one of the most common uses. BSD-3-Clause is a permissive licence that allows commercial and proprietary use provided you keep the copyright notice and licence text in your distribution. Check each project's licence individually before you commit — some open-source page builders use AGPL-3.0, which carries obligations that matter specifically for hosted products.
Yes. Panels, buttons, style sectors and the surrounding shell are all configurable, and several published editors replace the default layout entirely while running the same core. If you want the editor to look like your product rather than like GrapesJS, that is a supported outcome, not a hack.
Yes. GrapesJS has a storage API where you register an adapter with load and store functions. What happens inside them — which endpoint, which auth, which schema — is entirely yours, so project data goes into your own database rather than anyone else's.
Yes. The official @grapesjs/react wrapper mounts the editor as a React component, so it lives inside your component tree with your state and routing around it. The editor core itself stays framework-agnostic — the wrapper is an integration layer, not a rewrite.
Yes, with a caveat worth being clear about. Multi-page editing is a core module, so the editing side is covered. Everything that makes it a website builder rather than a page editor — routing, domains, hosting, deploys, user accounts — is application code you write. GrapesJS gives you the editor, not the platform.
Yes, using plugins. Email output is not in the core package: MJML and newsletter presets add the email-specific blocks and the output pipeline that survives real email clients. It is a real, production-used capability, but it is an installed one, not something you get by default.
The core package is BSD-3-Clause and the React wrapper is MIT, and both permit commercial use, including in closed-source products, as long as you retain the copyright and licence notices. This is a summary of the licence text, not legal advice — read the LICENSE file in the repository, and ask your own counsel if the answer matters to a contract.
They sit in different categories. GrapesJS is a BSD-3-Clause library you install and embed inside your own application, where you supply the UI, backend and publishing. Webstudio is an AGPL-3.0 visual website builder — an application in its own right, with a hosted offering. The licences also differ in a way that matters for hosted products: AGPL-3.0 carries source-availability obligations that BSD-3-Clause does not.
Data model and framework. Puck is an MIT-licensed React editor: a page is a JSON tree of your React components, rendered by React. GrapesJS is framework-agnostic and works with HTML and CSS output, which suits products that serve or export markup. If your pages are React components, Puck maps to them more directly; if they are web pages, GrapesJS does.
Who carries the work. With open source you get the source, self-hosting, your own data location and deep UI control — and you take on hosting, upgrades and maintenance. With a hosted builder the provider carries all of that, and you accept their pricing, roadmap and limits on customization. Neither is universally better; it depends on whether operating the editor is a cost you want.
No. GrapesJS is fully usable without buying anything, and plenty of production editors are built entirely on the core plus code the team wrote. Plugins are worth it when a capability isn't your product's differentiator — an email preset, a block set, a storage adapter — and not worth it when it is.
Yes, and it is the normal way to use the editor. You register a component type that defines the markup and the traits users can edit, then register a block that makes it draggable from the panel. They are two separate registrations, which is worth knowing before you wonder why your new component isn't in the panel.
Start with GrapesJS, keep control of your application, and extend the editor with the functionality your product needs.
Load a real editor in the browser, then install it and mount it in your own app.
Try GrapesJSBlocks, storage adapters, React shells and email presets — installed only where they save you real work.
Browse GJS.Market pluginsSee how the open-source options differ before you commit an architecture to one of them.
Compare page buildersOwn the editor. Own the data. Own the product.