symfinity/ux-blocks-interactive
A Laravel package for building interactive UI blocks, letting you compose dynamic, reusable front-end components with PHP. It pairs clean server-side block definitions with client-side interactivity for faster, more maintainable interfaces.
Architecture fit. symfinity/ux-blocks-interactive is a thin Laravel wrapper around Symfony UX Blocks, delivering server-defined, Stimulus-enhanced interactive UI blocks via Blade components. Architecturally it sits in the presentation layer: it owns the editor markup, client behaviour, and block registration, but deliberately does not own persistence. For a TPM this is a clean separation — the package is a rendering/composition concern, and your Eloquent models, JSON columns, and validation remain yours. It fits applications that already lean on Blade + Stimulus/Vite and want structured, re-renderable block content (marketing pages, CMS bodies, admin-composed layouts) rather than a freeform WYSIWYG. It fits poorly if your front end is Inertia/React/Vue-first, or if you need a mature, documented editing surface today.
Integration feasibility. Mechanically simple: composer require, publish config and assets, register Stimulus controllers in your Vite entrypoint, and mount <x-ux-blocks-interactive.editor :model="$page" />. Your side of the work is the non-trivial part — a JSON blocks column, an AsBlocks cast hydrating to a typed collection, a per-block-type FormRequest, and a render path for published output. That's a normal 1–2 sprint integration for one full-stack engineer on a single admin surface, but it is real work the package does not do for you.
Technical risk. Material and concentrated in three areas. (1) Maturity: v0.1.x with no stated BC policy; the v0.1.3 release is a bugfix-only drop whose notes merely link the changelog — a signal that API surface is still moving and that patch upgrades need regression testing rather than assumption. (2) Adoption: one star and a single maintainer (implied by the namespace) is a bus-factor and longevity risk for anything customer-facing. (3) Asset pipeline: the dev-works/prod-dead failure mode from vendor-published assets under Vite is common and easily misdiagnosed as a PHP bug. None of these are blockers for a scoped internal tool; all are blockers for a platform dependency.
Key questions. What is the actual Symfony UX Blocks upstream dependency and how tightly is this pinned to it? Is there a maintainer commitment or roadmap to 1.0, and who else is consuming it? Does the editor survive round-tripping unknown/newer block types in the JSON column (forward compatibility)? What is the controller-identifier namespace, and does it collide with our existing Stimulus setup? Does it support media/upload blocks and nested or reorderable blocks out of the box, or is that our build? What is the licence and any attribution requirement?
Stack fit. Native fit for a conventional Laravel monolith on Blade + Vite + Stimulus. If you already run Stimulus (Laravel's default front end does), the client model is familiar and the incremental cost is mostly registration. If you're on Livewire, you can wrap the editor as a presentational component and let Livewire own state — but you're then carrying two reactive models, so decide deliberately which one owns the block state. If you're on Inertia/Vue/React, this package is largely the wrong shape and should be skipped.
Migration path. Do not migrate existing content into blocks up front. Pick one low-risk surface — an internal admin page type, a help-centre article body, a landing-page composer — and run the full round-trip there first. Backfill by writing a one-way transform from your current representation (HTML or Markdown) into a single rich_text block, so existing content renders through the new pipeline without needing structured decomposition. Expand block types only as use cases demand; treat the block registry as a product decision, not an engineering default.
Compatibility. Pin ^0.1 (never *), commit the lockfile, and treat every patch as a minor migration: read CHANGELOG.md, diff vendor/, re-run feature tests. Pin the Stimulus/Symfony UX upstream version transitively via your lockfile. Keep composer.json extra.laravel and the service provider in review scope when upgrading — that's where block, route, and asset registration live and where breaking changes will surface first. Namespace the package's Stimulus controllers if we have any identifier overlap.
Sequencing.
npm run dev. This single test de-risks the most common failure mode.AsBlocks cast with null/empty-safe hydration, per-block FormRequest, feature test covering payload → column → re-hydrated blocks.blocks.text, blocks.image) so editor and published output share one template.Maintenance. Low code volume, but non-zero ongoing attention: every patch needs a changelog read, a vendor diff, and a test run, because there's no BC guarantee. Budget roughly a day per upgrade cycle, more if block internals move. Asset publishing is a one-way door — never edit published files; keep all customisation in our own JS so upgrades can't clobber work.
Support. Expect self-support. One star and an early version mean community answers will be thin and you are effectively the support tier. Mitigate by writing an internal one-pager: how blocks are registered, where the cast lives, how to debug a non-hydrating editor (check data-controller attributes first), and the upgrade checklist. That document is the real insurance policy.
Scaling. Rendering scales trivially — it's Blade partials and a JSON column, no runtime service. The scaling questions are content-shaped: block count per page, payload size in the JSON column, and media handling. Watch the column size; if block payloads grow past a few hundred KB, move media to references rather than embedded data. Editor performance with many blocks is the plausible ceiling and worth load-testing at realistic page complexity before wide rollout.
Failure modes. (1) Silent save corruption — malformed payload written to JSON, discovered on render; the per-block FormRequest is the primary defence. (2) Prod-only asset failure — editor renders dead markup because Stimulus didn't register in the built bundle; the production-build spike is the mitigation. (3) Patch-upgrade breakage — a v0.1.x bump alters the block contract; caught only by round-trip feature tests. (4) Abandonment — upstream goes quiet; mitigated by owning the schema, cast, and render partials. (5) Null/invalid column hydration — a legacy row with null or junk throws on read; the cast must degrade to an empty collection.
Ramp-up. A mid-level Laravel engineer familiar with Blade, Vite, and Stimulus is productive in a day or two; the unfamiliar concept is the block registry and server-driven state, which is a short read of the config file and one block class. Allocate that time explicitly — the package's thin documentation means onboarding happens by reading vendor/, so pair the first integration with the internal one-pager rather than expecting self-serve discovery.
TPM recommendation. Approve for a scoped pilot on one internal or low-blast-radius surface, with ^0.1 pinning, a production-build spike as the gate, and a round-trip feature test as the exit criterion. Do not adopt as a platform dependency or on any customer-critical path until it reaches a stable release with a stated BC policy and visible adoption beyond a single maintainer. Because the schema, cast, and render partials stay ours, the downside of a pilot is bounded to front-end rework — which is the right risk profile for a package at this maturity.
How can I help you explore Laravel packages today?