PHPagebuilder: a drag and drop page builder that drops into any PHP project
A drag and drop page builder to manage pages in any PHP project
At a glance
- What is it?
- PHPagebuilder is a page builder built on GrapesJS with a Bootstrap admin interface, designed to be dropped into an existing PHP project rather than to be a CMS you install. The server side has no dependencies at all, it stores pages in a database you create yourself, and the theme system is three folders of PHP and HTML that you write yourself.
- Who is it for?
- PHPagebuilder suits a PHP developer who wants clients to be able to edit pages without installing a full CMS, and who is prepared to write the theme as PHP templates. It does not suit a team that wants an off the shelf theme library or a non-technical owner running the whole site, since the theming layer is yours to build.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 16 days ago.
- What is it written in?
- Mainly PHP, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.
Editorial analysis
A page builder, not a CMS
PHPagebuilder is a drag and drop page builder to manage pages in any PHP project, and the positioning sentence in the readme sets the scope: it can be used as an ultra lightweight CMS to quickly spin up new websites, or integrated into existing projects or frameworks, with a Laravel version linked for the second case. What it is not is a content management system that owns your site. The server-side code does not depend on any other libraries, and the readme calls it blazing fast, which is the payoff of writing the storage and rendering in plain PHP. The feature list is short, and the first entry is the page builder built on GrapesJS, the open source drag and drop editor. The primary language is PHP, the licence is MIT, the last push was on 2026-10-07, and the homepage is phpagebuilder.com.
Who it is for, and what it is meant to replace
The section on how it helps reads as a list of frustrations, and it is a more useful description of the tool than a feature list would be. If you want a basic site you can manage from any device. If you get lost installing, configuring, updating or using feature abundant systems like Wordpress or Drupal. If you dislike the limited page editors those systems offer. If you want to build a custom site for a client within a few hours. If your clients get lost in admin panels like Drupal. If you hate relying on messy plugins for features you could write in plain PHP yourself but still want some admin functionality so other people can manage the site. And if you want advanced functionality such as search or views displaying data from remote sources, manageable by your clients. The through-line is that it sits between a full CMS and no admin at all, and the intended user is a developer who wants to keep control of the code.
The website manager is optional and replaceable
A basic website manager is included with a Bootstrap interface, and it offers the basics: adding and removing pages, editing page settings such as the title or the URL, and opening the page builder from the edit button. What makes it interesting is that the readme tells you how to get rid of it. If you do not want to use the website manager, it is included for people who want to use PHPagebuilder directly out of the box, and there is a section on how to disable or replace the website manager. So the admin interface is a convenience layer rather than a requirement, which is consistent with the design where the package is embedded in a project you already control. The GrapesJS editor is the part that does the actual editing, and the manager is the part that lists the pages and opens the editor.
Two install paths, and one needs no dependency manager at all
There is a quick start path, which is to download the boilerplate project structure and follow the steps there, and there is the path for integrating into a project you already have. With Composer the install is:
composer require hansschouten/phpagebuilderand the initialisation is four lines of PHP, requiring the autoloader, loading a config file, constructing the builder and handing it the request:
require_once __DIR__ . '/vendor/autoload.php';
$config = require __DIR__ . '/config.php';
$builder = new PHPageBuilder\PHPageBuilder($config);
$builder->handleRequest();The config file should be a copy of config/config.example.php with your settings filled in. The path without Composer is the one that tells you how little this depends on anything: the project is written in plain PHP without any dependencies, so you can download the latest release into a separate folder inside your project, which the readme names phpagebuilder, and include it directly:
$installationFolder = __DIR__ . '/phpagebuilder';
require_once $installationFolder . '/src/Core/helpers.php';
spl_autoload_register('phpb_autoload');
$config = require __DIR__ . '/config.php';
$builder = new PHPageBuilder\PHPageBuilder($config);
$builder->handleRequest();There is a helpers file, a manually registered autoloader, and then the same three lines as before. The requirement is PHP 7 or later, and the readme lists the second requirement as a cool project.
The database, the theme config, and the three folder structure
Used out of the box the tool needs a database to store pages, and the instruction is to create one and run the queries from config/create-tables.sql, then add the database credentials to your config file. Theming is configured through a theme key in config.php, holding a themes_folder and an active_theme, and a new theme is a new folder inside the configured themes folder, with the folder name acting as the identifier. Each theme has three folders. The blocks folder holds a subfolder per block, and a single block contains either a view.php or a view.html. That choice is the one that matters, because if the block uses view.html the content is fully editable inside the page builder, and if it uses view.php the block can be rendered with server-side logic and the HTML content cannot be changed from within the builder. The layouts folder holds a view.php per page layout, defining the base HTML structure with the stylesheets and scripts the blocks need, and each layout must contain the string for the body placeholder where the dragged blocks go. The public folder holds the assets that should be publicly accessible, and a theme-url shortcode points at a file in the public folder of the active theme.
Shortcodes, nested blocks, and the JavaScript side of the build
Blocks can be included in other blocks and in layout files with a shortcode, so adding the header block shortcode to the master layout view pulls that block into every page using the master layout. To allow dragging blocks into a block in the builder, a blocks container is added, and the readme covers the blocks container only briefly. On the JavaScript side, the package manifest shows a build driven by esbuild with a script under scripts, with a development, a watch, a production and a prod script, and three separate test scripts for the builder scripts, the page storage optimiser and the page translation synchroniser. The build chain uses sass and postcss with autoprefixer, html-minifier-terser for the production output, and the editor itself is CKEditor 4 pinned to a specific release, with esbuild doing the bundling. The engines field requires Node 20 or newer, and the browserslist is set to more than 2 percent, which is an old and very permissive target.
Editorial conclusion
PHPagebuilder suits a PHP developer who wants clients to be able to edit pages without installing a full CMS, and who is prepared to write the theme as PHP templates. It does not suit a team that wants an off the shelf theme library or a non-technical owner running the whole site, since the theming layer is yours to build. Before you start, read the block and layout rules, because the difference between a view.html block and a view.php block decides what the page builder can edit, and note that the release tags stop at v0.31.0 in January 2025 even though the repository itself is being worked on.
Frequently asked questions
What is PHPagebuilder and how is it different from a CMS?
It is a drag and drop page builder built on GrapesJS with a Bootstrap website manager, designed to be embedded in a project you already control. The server-side code has no dependencies at all, and the website manager can be disabled or replaced if you would rather use the builder directly.
How do I install PHPagebuilder in an existing PHP project?
Run composer require hansschouten/phpagebuilder, then require the autoloader, load a config.php copied from config/config.example.php, construct the builder with that config and call handleRequest on it. Without Composer you can download the release into a folder in your project, require the helpers file, register the autoloader and do the same three lines.
What is the difference between a view.html block and a view.php block?
A block whose view is html is fully editable inside the page builder, while a block whose view is php can be rendered with server-side logic, and the html content of that block cannot be changed from within the builder. That choice decides per block whether the editor can touch the content.
What does a PHPagebuilder theme need to contain?
Three folders. The blocks folder has a subfolder per block with a view.php or view.html, the layouts folder has a view.php per layout that defines the base html and includes the body placeholder, and the public folder holds the publicly accessible assets, referenced from templates with the theme-url shortcode.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/hansschouten-phpagebuilder)Was this useful?