makraz/ux-editorjs
makraz/ux-editorjs brings Editor.js to Laravel with Blade components and helpers for storing, editing, and rendering block-based JSON content. Add a clean, customizable block editor to your app with minimal setup.
Framing correction (blocking): The request frames this as a "Laravel/PHP package," but v0.1.0 is a Symfony UX Bundle (symfony/stimulus-bundle, EditorjsType form type, EasyAdmin field, Live Components). It is not usable from Laravel: there is no Laravel service provider, no Blade/Vue/React binding, no equivalent of Symfony's Form component or Twig form themes. Any Laravel-side evaluation should stop here and be re-scoped; the remainder of this assessment assumes a Symfony estate and is written so a TPM can re-target it if the underlying requirement was actually "block editor for a PHP app."
Architecture fit: Good fit for Symfony apps that already render forms server-side and want rich text without owning a JS build. The value proposition is genuinely architectural, not cosmetic: tool configuration is expressed as PHP enums/DTOs (CustomTool, AbstractTool, TuneInterface), so editor capability becomes declarative application config rather than a hand-maintained JS bundle. That shifts ownership from frontend specialists to backend teams and is the single strongest reason to adopt. Fit is poor for API-only/headless backends, for SPA frontends that already own their editor, and for any app where content must be authored or rendered outside a Symfony form.
Integration feasibility: Low-to-moderate effort for a single Symfony 6.4/7.x app on PHP 8.1+. Prerequisites are real but standard: Stimulus bundle present, an asset pipeline (AssetMapper or Encore — both supported), and for the 11 community tools, adding and pinning the corresponding npm packages. No custom JS is required for the 16 built-in tools, which is the headline feasibility win. The friction points are (a) EasyAdmin and Live Component paths are advertised but only lightly described, and (b) content is fundamentally Editor.js JSON blocks, not HTML — integration is not complete until a renderer and a sanitization layer exist on the read path, and that work is not in this bundle.
Technical risk:
| Risk | Severity | Why |
|---|---|---|
| Experimental status, explicit no-BC-guarantee | High | v0.x with stated breaking changes between releases; unsuitable for a critical authoring path without a pin-and-fork policy |
Raw HTML tool + editorjs:change payloads |
High | Stored JSON is rendered later; without a strict sanitizer this is a stored-XSS vector. Not addressed in the notes |
| Built-in upload controller | High | Three backends is convenience; auth, CSRF, per-user authorization, path traversal, MIME sniffing (declared vs. actual), and image re-encoding are unmentioned. Must be reviewed before exposure |
| Single-maintainer dependency | Medium-High | One-person project, v0.1.0, no stated license, SLA, or release cadence |
| JSON schema drift | Medium | Saved blocks embed tool names/versions; upgrading Editor.js or a tool package can orphan stored content |
| Asset pipeline drift | Medium | Dual AssetMapper/Encore support widens the test matrix; the supported path may lag |
Key questions for the maintainer / internal spikes:
data-live-ignore path production-tested or advisory?Stack fit: Target Symfony 6.4/7.x (8.x supported, but pin to what the estate can actually run) on PHP 8.1+, with symfony/stimulus-bundle >= 2.9.1. Confirm the asset strategy first — AssetMapper is the lower-friction path and removes a Node dependency for the 16 built-in tools; Encore is only justified if the app already has a Webpack build and needs the community tool packages. EasyAdmin and Live Components should be treated as optional, separately validated surfaces, not assumed.
Migration path (content is the hard part): The bundle swaps the authoring widget; it does not migrate or render existing content. Sequence:
EditorjsType on one low-traffic content type behind a feature flag.This ordering is deliberate: it removes the only irreversible step (content rewrite) from the critical path.
Compatibility: Pin exactly — package version, Editor.js core version, and every community tool npm version — and record the trio in a lockfile plus a short ADR. Because the bundle's versioning is pre-1.0, treat minor bumps as potentially breaking and gate them behind a changelog review. If adoption is approved, plan to vendor/fork the bundle so a breaking upstream release or an abandoned maintainer is not a delivery blocker.
Sequencing for a TPM:
editorjs:change path; decide local vs. Flysystem vs. custom UploadHandlerInterface.Explicit non-fit: Do not sequence this into a Laravel application. If the underlying need is "block editor in a Laravel app," the correct next step is to evaluate JavaScript-side Editor.js integration directly (or a Laravel-specific wrapper) and discard this bundle.
Maintenance: The bundle absorbs JS configuration, which is a durable reduction in the maintenance surface — tool changes become PHP edits reviewed like any other config. But it adds a dependency you must track closely: pre-1.0, single maintainer, no stated BC policy. Budget a named internal owner and a quarterly "pin review." Assume you may need to patch the bundle yourself; confirm your team can read the Stimulus controller and the form type before committing.
Support: Community support only (GitHub issues). No commercial backing, SLA, or LTS. Ramp-up for a Symfony-fluent developer is genuinely short — a day or two to a working field, since no JS is required for built-ins — but the operational knowledge that matters (JSON schema, renderer behavior, upload security) lives with your team, not upstream. Document the content schema and the version trio in an internal runbook; that document, not the package, is what makes this supportable.
Scaling: Editor-side cost is per-user and negligible. Server-side considerations are content-shaped: JSON payloads are larger than equivalent HTML, so watch column size, request body limits, and the cost of parsing JSON on every render (cache rendered HTML). Uploads are the scaling pressure point — volume and egress are governed by your chosen backend (local disk does not scale horizontally; Flysystem/S3 does; the custom UploadHandlerInterface is the escape hatch for CDN-backed or virus-scanned pipelines). Search is a real gap: if content search matters, plan a JSON→plaintext extraction job, because block JSON will not index usefully as-is.
Failure modes to monitor from day one:
Ramp-up and recommendation: Treat v0.1.0 as pilot-grade, not platform-grade. Approved use: a time-boxed pilot on one non-critical content type in a Symfony app, with the renderer and sanitizer treated as first-class deliverables and the package pinned and vendored. Not approved: a Laravel integration (technically inapplicable), a bulk content migration at cutover, or exposure of the upload endpoint to untrusted users before a security review. Re-assess at 1.0 or on any sign of maintainer activity stalling.
How can I help you explore Laravel packages today?