makraz/ux-quill
makraz/ux-quill is a Laravel package that adds a ready-to-use Quill rich-text editor Blade component. Drop it into forms, customize the toolbar, and store HTML or Delta content with minimal setup—ideal for clean WYSIWYG editing in Laravel apps.
Assessment basis: This is a baseline evaluation — there is no prior assessment to reconcile. The release under review is ux-quill v0.1.0, the first experimental release of the package.
Architecture fit — primary finding: this is not a Laravel package. The release is a Symfony UX bundle (symfony/stimulus-bundle dependency, QuillType form type, QuillAdminField for EasyAdmin, Symfony 6.4/7.x/8.x constraints, PHP >= 8.1). None of its core value — Symfony Form type integration, EasyAdmin one-liner, Live Component compatibility — is reachable from a Laravel application. For a Laravel-centric stack this is a framework mismatch, not an integration gap: adopting it would mean either (a) standing up a Symfony service alongside Laravel, or (b) discarding the bundle and hand-rolling the underlying Stimulus controller + Quill wiring inside Laravel, at which point we are consuming Quill v2 directly and this package contributes essentially nothing. Architecture fit is therefore low for Laravel, moderate-to-good for Symfony shops.
Integration feasibility (Symfony context, if applicable): Conceptually clean. It is a thin wrapper: a form type that renders a container, a hidden input holding HTML, and a Stimulus controller that owns the Quill lifecycle. Both AssetMapper and Webpack Encore are supported, which matters because asset pipeline choice is often the deciding factor in whether a UX bundle is usable at all. The three lifecycle events (quill:options, quill:connect, quill:change) plus the two-way sync claim (input/change native events) are the right extension points — they suggest the authors understand that a WYSIWYG wrapper must be escapable, not airtight.
Technical risk — the material ones are not framework risk, they are content risk:
symfony/html-sanitizer). This is the single largest risk and it is a defaults problem: a form type that "just works" will be used by developers who do not think about sanitization.image in the default toolbar but say nothing about upload handling. Unmitigated, this yields multi-megabyte rows, broken payload size limits, and no lifecycle for orphaned assets. Needs confirmation before any production use.<p><br></p> rather than an empty string. Whether NotBlank/Length constraints behave correctly is unverified and is a common source of "form won't submit" bugs.Key questions to put to the maintainer (or answer in a spike):
quill:options hook, or unsupported?Stack fit: If the organisation is Laravel-first, the honest answer is that this package does not fit and should not enter the dependency graph. The correct pattern — Stimulus controller wrapping Quill, content synced into a hidden input, sanitized server-side — is reproducible in Laravel in a day or two using Livewire or Alpine in place. The bundle's differentiation is entirely in the Symfony Form/EasyAdmin layer, which is exactly the layer Laravel cannot use. If the organisation runs Symfony services (or is evaluating Symfony for an admin surface), fit is good and this is a credible candidate.
Migration path: There is nothing to migrate from — this is greenfield. The more relevant question is the exit path: because the bundle is a thin wrapper over Quill v2, the blast radius if it is abandoned is small. The Stimulus controller and the form type can be vendored or replaced with a hand-written equivalent without touching stored content, since the persistence format is plain HTML. That is a genuine strength and should be weighed against the maturity risk. The one thing that would create lock-in is proprietary content structures; none are indicated here.
Compatibility: PHP 8.1+ and Symfony 6.4/7.x/8.x cover most current estates. symfony/stimulus-bundle >= 2.9.1 is a real constraint — projects using Webpack Encore without StimulusBundle will need to add it. Quill >= 2.0.0 is a peer requirement that must be version-pinned and tracked independently, since Quill's own major-version changes will surface through this wrapper.
Sequencing (recommended):
0.1.x exactly, no caret range, given the explicit no-BC stance. Add an explicit sanitizer at the persistence boundary before the first form goes live — treat it as a hard gate, not a follow-up ticket.Maintenance: Low ongoing cost if adopted — the package is a thin wrapper, and thin wrappers rarely rot on their own. The maintenance burden sits in the dependencies: Quill major versions, StimulusBundle, and Symfony majors (with Symfony 8 on the horizon). Budget for a review each time any of those move.
Support: Weak at this stage. One maintainer, an issues link, no stated SLA, no security policy, no commercial backing. Acceptable for internal admin tooling; not acceptable for anything where a broken editor blocks revenue. Version pinning plus the low exit cost are the mitigations.
Scaling: Functionally fine — the editor runs client-side and the server sees only a form field. The scaling risk is storage, not throughput: unsanitized HTML plus base64 images will inflate row sizes and backup volumes, and rich-text columns grow monotonically as users paste content in. Set a column type that accommodates growth and, if images are enabled without an upload handler, expect this to bite first.
Failure modes to instrument/test:
quill:change events.Ramp-up: For a Symfony developer, hours — it behaves like any form field, and EasyAdmin is a one-liner. The learning curve is not the API, it is the two adjacent domains the release notes do not cover: HTML sanitization policy and Quill toolbar/upload configuration. A frontend developer will be needed for anything beyond the default toolbar. Documentation is README-level; expect the first integrator to become the internal expert and to write the runbook.
Recommendation: Do not adopt on the basis of a 0.1.0 experimental release. For Laravel stacks, close the evaluation — the framework mismatch is disqualifying regardless of quality. For Symfony stacks, run the one-day spike, gate on sanitization and image handling, and revisit at 1.0 or first BC-stable release.
How can I help you explore Laravel packages today?