nowo-tech / page-builder-kit-bundle
Visual Symfony page builder powered by GrapesJS, with Doctrine persistence, locale-aware content, revisions, SEO, and Twig public rendering. Classic section/column/widget documents remain supported.
Package info
github.com/nowo-tech/PageBuilderKitBundle
Type:symfony-bundle
pkg:composer/nowo-tech/page-builder-kit-bundle
Fund package maintenance!
Requires
- php: >=8.4 <8.6
- doctrine/doctrine-bundle: ^2.10 || ^3.0
- doctrine/orm: ^3.7
- nowo-tech/form-kit-bundle: ^2.4
- nowo-tech/ui-kit-bundle: ^1.4
- symfony/asset: ^7.4 || ^8.0
- symfony/config: ^7.4 || ^8.0
- symfony/dependency-injection: ^7.4 || ^8.0
- symfony/form: ^7.4 || ^8.0
- symfony/framework-bundle: ^7.4 || ^8.0
- symfony/http-foundation: ^7.4 || ^8.0
- symfony/http-kernel: ^7.4 || ^8.0
- symfony/routing: ^7.4 || ^8.0
- symfony/security-bundle: ^7.4 || ^8.0
- symfony/security-csrf: ^7.4 || ^8.0
- symfony/translation: ^7.4 || ^8.0
- symfony/twig-bundle: ^7.4 || ^8.0
- symfony/uid: ^7.4 || ^8.0
- symfony/validator: ^7.4 || ^8.0
- symfony/yaml: ^7.4 || ^8.0
- twig/extra-bundle: ^3.12
- twig/string-extra: ^3.12
- twig/twig: ^3.8
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- igor-php/igor-php: ^0.9.7
- nowo-tech/phpstan-frankenphp: ^1.0
- phpstan/extension-installer: ^1.4
- phpstan/phpstan: ^2.0
- phpstan/phpstan-phpunit: ^2.0
- phpstan/phpstan-symfony: ^2.0
- phpunit/phpunit: ^11.0 || ^12.0 || ^13.0
- rector/rector: ^2.0
- vincentlanglet/twig-cs-fixer: ^4.0
Suggests
- core/aws-s3-bundle: AWS S3 uploads for GrapesJS Asset Manager (grapesjs.assets_upload.storage=s3).
- nowo-tech/ckeditor5-editor-bundle: Alternative rich text editor for text widgets.
- nowo-tech/tiptap-editor-bundle: Rich text editing for text widgets in the canvas.
- pentatrion/vite-bundle: Compile host-app frontend with Pentatrion Vite (Twig vite_entry_*). The Symfony 8 demo uses this stack with pnpm.
- symfony/flex: Automatic recipe installation
Provides
None
Conflicts
None
Replaces
None
README
⭐ Found this useful? Give it a star on GitHub! It helps us maintain and improve the project.
Visual Symfony page builder powered by GrapesJS, with Doctrine persistence, locale-aware content, CSRF-protected JSON document API, and Twig-based public rendering. Legacy section/column/widget documents (schema v1) remain supported for read/render.
Compatible with Symfony 7.4, 8.0, and 8.1+ on PHP 8.4+
This bundle is FrankenPHP worker mode friendly. Shared services stay request-safe; optional BuilderLocales static binding is cleared after each request. See FRANKENPHP-WORKER-AUDIT.md.
Public pricing — full demo context + Web Profiler |
Admin GrapesJS canvas — context + Web Profiler |
What is this?
Page Builder Kit Bundle gives Symfony applications a reusable visual page builder backed by Doctrine. Editors create pages with stable keys, compose layouts on a GrapesJS canvas (or classic sections), save locale-specific content, publish or leave as draft, and expose pages on host routes or through Twig helpers. It complements Page Layout Kit Bundle when you need a free-form canvas instead of fixed typed blocks.
Features
- GrapesJS admin canvas with preset-webpage + official plugins, Asset Manager, devices, a11y helpers, and PBK compound blocks
- Legacy schema v1 still supported (legacy): sections → columns → widgets (+ Sections editor). Prefer Grapes + content fields for new pages.
- Locale tabs /
localeContentwith default-locale fallback for public render - Configurable admin mount:
web_ui.path_prefix(default/admin/page-builder) - Optional
doctrine.table_prefixfor shared databases - JSON document API (GET/POST), publish / unpublish, public
/p/{pageKey} - Optional revisions history (
revisions.enabled) with restore, diff, templates, duplicate, import/export - Public edit pencil via
nowo_page_builder_can_edit()+ access checker; draft preview for editors - Sandboxed Twig in Grapes HTML; page SEO / Open Graph; asset uploads (local / S3)
- Dev Web Profiler panel (
debug.collector); classic widget packs for host extensions DocumentService,PageRenderProvider, Twignowo_page_builder_render()- Configurable access guard and HTML sanitization
- Symfony 8 FrankenPHP demo in
demo/symfony8(default port 8137)
Quick start
composer require nowo-tech/page-builder-kit-bundle:^1.0 composer require twig/extra-bundle twig/string-extra
# config/packages/nowo_page_builder_kit.yaml nowo_page_builder_kit: default_locale: es locales: [es, en] security: access_roles: [ROLE_EDITOR]
# config/routes/nowo_page_builder_kit.yaml nowo_page_builder_kit: resource: '@NowoPageBuilderKitBundle/Resources/config/routing.yaml'
php bin/console doctrine:migrations:diff php bin/console doctrine:migrations:migrate
Admin: /admin/page-builder/pages → open a page canvas.
Page Layout Kit vs Page Builder Kit
| Topic | Page Layout Kit | Page Builder Kit |
|---|---|---|
| Mental model | Ordered list of typed blocks per configured page key | Tree document: sections, columns, widgets |
| Block / widget set | Fixed six types (hero, text, cards, …) |
Core six widgets; registry open to extensions (Phase 4) |
| Admin UX | Reorder list + inline CMS modals on public pages | Full-page canvas with drag-and-drop |
| Page keys | Declared in config (pages: [home, contact]) |
Created dynamically in admin (unique pageKey) |
| Content storage | One entity per block type + translations | Single JSON structure + per-locale widget props map |
| Public API | PageBlockProvider::getLayout() |
PageRenderProvider::getRenderedTree() / Twig nowo_page_builder_render() |
| Best for | Marketing pages with known block patterns | Landing pages and layouts that change shape often |
Use both bundles in one app when some routes need rigid blocks and others need a visual builder.
Roadmap
| Phase | Status | Scope |
|---|---|---|
| Phase 1–2 | Shipped (v1.0.0) | GrapesJS + classic v1, document API, publish/draft, i18n, SEO/a11y, security, demo |
| Phase 3 | Shipped (v1.1.0) | Revisions + diff, duplicate, import/export, templates library, draft preview |
| Phase 4 | Shipped baseline (v1.1.0) | WidgetPackInterface, author guide; classic widget tags |
| DX | Shipped (v1.1.0) | Web Profiler DataCollector (debug.collector) |
| Follow-ups | Shipped (v1.2.0) | Visual revision diff panels, template JSON sharing, Grapes block packs |
| Phase 5–7 | Shipped (v1.4.0) | Content fields + ACL capabilities, hardening/slots, media library + tags |
| Phase 9 | Done (v1.4.3) | Org compliance: ≥99% PHP elements, Symfony Form Twig (TWIG-003/005), README coverage |
Details: SPEC-DRIVEN-DEVELOPMENT.md. Spec Kit: specs/001–009 (docs closure in v1.1.1; follow-ups in v1.2.0; content/media in v1.4.0; polish + compliance in v1.4.1–v1.4.3).
Development
make assets # pnpm + Vite: TS → src/Resources/public/ make -C demo/symfony8 assets # Pentatrion Vite: assets/app.ts → public/build/ make -C demo/symfony8 test-e2e make -C demo/symfony8 demo-screenshots # refreshes docs/images/demo/*.png
make up
make test
make phpstan
make -C demo/symfony8 up
make demo-smoke
Demo default URL: http://localhost:8137.
Documentation
- Architecture (Mermaid)
- Installation
- Configuration
- Widget authors
- Cookbook (packs + templates)
- PSR evaluation (REQ-CS-007)
- Usage
- Builder manual
- Contributing
- Code of Conduct
- Changelog
- Upgrading
- Release process
- Security
- Engram
- Spec-driven development
- GitHub Spec Kit
Additional documentation
- GitHub Actions CI requirements
- Demo with FrankenPHP
- Use cases matrix
- Builder manual
- FrankenPHP worker mode audit
Tests and coverage
| Area | Status | Command |
|---|---|---|
PHP src/ coverage |
99.73% elements (CI gate ≥99%) | make test-coverage |
| TS/JS | N/A (canvas/typecheck only; no Vitest coverage suite yet) | pnpm typecheck |
| Python | N/A | — |
| Unit / bundle QA | Enabled | make test |
| Full release checks | Enabled | make release-check |
make test
make test-coverage
pnpm typecheck
make release-check
License
MIT — see LICENSE.


