advoor/nova-editor-js
A Laravel Nova field that brings Editor.js block-style editing to your admin panel, letting you create clean structured content and render it as HTML. Easy to install and customize for any Nova resource.
Architecture fit. This package is a capture component, not a content platform. It wires Editor.js into a Laravel Nova field and round-trips content as structured JSON ({ time, blocks, version }). Everything that makes that content useful — a server-side renderer, sanitization, block normalization, a plain-text shadow for search, schema versioning — is downstream work the team owns. Architecturally, that is an acceptable fit only if the product already runs Nova and the org accepts that adopting this field implicitly commissions a rendering pipeline. The package itself is thin (a Vue field component plus a config file mapping Editor.js tools); treat "thin" as both the appeal (small surface to audit and fork) and the risk (little upstream gravity).
Integration feasibility. Install is trivial: composer require, php artisan vendor:publish, add a json column, cast it array, wire the field on one resource. The genuine integration work is the two undeclared hard dependencies: (1) a renderer — editorjs-php server-side or editorjs-html client-side — and (2) an HTML sanitizer for raw/HTML blocks. Both are effectively mandatory and neither is supplied. Feasibility is high if scoped as a two-to-three-week mini-program (spike, renderer, sanitizer, normalizer, deploy hardening), not as a one-day drop-in.
Technical risk. The risk profile is elevated for a low-signal dependency (92 stars, 0 dependents). Key exposures:
packages/ within a year.public/vendor bundle yields a blank editor with no console error — the #1 production-vs-local failure. This is a deploy-pipeline risk, not a code risk.Key questions to resolve before commitment.
Stack fit. The package assumes Laravel + Nova + a JSON column + a frontend that can consume either structured JSON or rendered HTML. It slots in cleanly where the product keeps content in the same admin as business data rather than standing up a second CMS. Fit is poor if Nova is being phased out, or if the content surface is headless with multiple clients that would each need their own JSON renderer.
Compatibility matrix to verify in the spike.
editorjs-php) requirements.vendor:publish must run in every environment and stage public/vendor assets; the existing pipeline almost certainly does not do this today.displayUsing — needed for the detail/index views, which are not useful as editable surfaces.Migration path. Do not point this field at an existing text/longtext column containing HTML or Markdown — Editor.js will replace the value with its JSON envelope on first save and silently destroy legacy content. Instead:
json column (body).array on the model.body_text shadow column populated by the same save observer, so search, previews, and Nova index columns don't parse JSON at query time.version and add your own schema marker alongside it if you mutate the contract.Sequencing (recommended program).
editorjs-php. This is the decision gate: if rendering is painful, stop.body_text.Maintenance. The package will need vendoring into packages/ within roughly a year, with a 1–3 engineer-day budget per Nova major and a periodic toolchain upgrade review. The renderer, sanitizer, and normalizer are permanent internal code, not package responsibilities — staff them as such. Pin Editor.js tool versions in a lockfile and treat any tool bump as a testable change. The 92-star, 0-dependent profile means no downstream population catches regressions; the org's own smoke test is the only safety net.
Support. There is no enterprise support and no strong public maintenance signal. Internal ownership must be explicit — a named team on the hook for Nova upgrades, the renderer, and editor questions. Expect recurring editor-level support: paste-from-Word formatting questions (enable a paste-cleaner tool if the content team lives in Word), missing-block confusion when a tool is removed, and image upload disk confusion. Document the block vocabulary and the "unsupported block" placeholder behavior so editors can self-serve.
Scaling. Editor.js JSON is typically 2–4x larger than equivalent HTML and costs a parse+render per request. Cache rendered HTML keyed on the record and bust on save; that converts a per-request parse into a per-write cost. For read-heavy surfaces, the cached HTML is the fast path and the JSON remains the re-renderable source of truth. For multi-consumer content (web + API + email + search), normalize to HTML/Markdown at write time and store both forms — otherwise every consumer needs its own Editor.js JSON renderer, multiplying surface area. Search must go through the plain-text shadow column, not the JSON.
Failure modes and controls.
blocks: [] not null; control: coalesce both cases in the renderer.Ramp-up. A single engineer can complete the spike in 1–2 days and reach production-ready in roughly 1–2 weeks including the renderer, sanitizer, normalizer, shadow column, and deploy hardening. Plan a parallel half-day for editor onboarding on the block model and toolset. The critical ramp-up risk is treating the package as a drop-in; the realistic framing is a small program with the package supplying only the editing UI and JSON round-trip.
How can I help you explore Laravel packages today?