dejodev/page-blocks
A Laravel package for creating and managing reusable page blocks, letting you compose dynamic page content from configurable block types and render them easily in Blade views without hardcoding layouts.
Architecture fit. dejodev/page-blocks is a Filament plugin that provides a "page blocks" content model — the classic page-builder pattern where a page record owns an ordered collection of typed blocks (hero, rich text, image + text, CTA) persisted as structured data and edited through a Filament form. Architecturally this is the right shape for a Laravel/Filament application that needs editorial composition without a full CMS: it sits between the "just use a Builder field" approach (fast, but unstructured and hard to render consistently) and a heavyweight headless CMS (PageTree, Statamic, Wagtail-style). If our application is already Filament-first, the plugin should register via package auto-discovery, expose a service provider and a block registry, and integrate as a relation or JSON column on our page model. That is a low-friction architectural fit — provided the internals follow Filament conventions and do not require us to subclass or monkey-patch core classes.
Integration feasibility. The surface area appears small, which cuts both ways: a small package is easy to read, vendor, and patch, but it also means fewer escape hatches and no ecosystem of extensions. Composer installation should be trivial (MIT license, no private registry). The real feasibility question is not install effort but whether the block schema is expressive enough for our content types and whether the rendering layer is separable from the admin layer — a block editor that only renders in Filament views is not usable for a public-facing site. We need to confirm a headless/Blade render path exists before committing.
Technical risk. High, driven almost entirely by adoption and maintenance signals rather than code quality:
Key questions (to resolve in a timeboxed spike, not by reading the README):
composer.json constraints, and is there a CI matrix proving it?render() method, or view-per-block), or is rendering left to the consumer?registerBlock() hook for custom block types?spatie/laravel-medialibrary, Filament FileUpload, or bespoke disk handling?Stack fit. Reasonable for a Filament-centric monolith, weak for anything else. A quick fit matrix:
| Dimension | Fit | Note |
|---|---|---|
| Laravel 11/12, PHP 8.2+ | Likely | Verify composer.json constraints |
| Filament v3 | Likely | Most probable target; confirm |
| Filament v4 / Livewire 3 | Unknown | Treat as unsupported until proven |
| Blade-rendered public site | Unknown | Requires a non-admin render path |
| API / headless consumption | Weak | JSON blob per page, no query surface |
| Multi-tenant / localized content | Unknown | Block schema drift risk per locale |
| Spatie Media Library | Unknown | Determine before committing to media blocks |
If our stack is Filament v4 or we are mid-upgrade, I would not integrate this package now; the compatibility surface is unproven and the upgrade burden lands entirely on us.
Migration path. Nothing to migrate from if we're greenfield — the question is the exit path. Design for removability from day one:
PageContent service and our own Blade partials) so the plugin is never called directly from application code.schema_version key so we can transform data if we swap implementations.Compatibility. Pin the package version exactly ("dejodev/page-blocks": "x.y.z", not ^). Pair that with a Laravel/Filament upgrade checklist entry: any Filament major bump requires a spike against this package first. Budget for a fork if the maintainer is inactive at that point.
Sequencing. Four gates, roughly one sprint of elapsed time:
composer.json, service provider, block registry, migrations, tests, commit history, open issues.Maintenance. Assume we own it. With zero dependents and a single maintainer, the realistic posture is "vendored code we occasionally sync." That means assigning an owner, adding the package to our dependency-review routine, and running our own static analysis (PHPStan/Larastan) and test coverage over the integration points. The MIT license makes the fork legal and cheap; the cost is ongoing attention, not licensing.
Support. No SLA, no community, no commercial backing. Issue response is best-effort at best. Internal support model: the adopting team documents the block schema and render path in our own wiki, because the upstream docs are unlikely to be a durable reference. Budget for at least one engineer who has read the source.
Scaling. Content-block workloads are read-heavy and cache-friendly; the package's own footprint is unlikely to be the bottleneck. The risks are structural rather than load-related:
updated_at.Failure modes. Ranked by likelihood × impact:
Ramp-up. Developer ramp-up is genuinely short — small API, Filament conventions, a day or two for a Filament-fluent engineer. The hidden cost is absence of documentation: onboarding happens by reading source, so the first integrator should write the internal doc as a deliverable. Editor ramp-up is the real UX dependency; plan a short training pass and a "known limitations" note for the content team.
Verdict. Viable as a bounded, internal, fork-ready component for a Filament-first application where we are willing to own the code. Not appropriate as a load-bearing dependency for a long-lived client product without that ownership commitment. Decide after Gate 2 — the spike is cheap and answers every question that matters.
How can I help you explore Laravel packages today?