emilianotisato/nova-tinymce
Nova TinyMCE adds a full-featured TinyMCE WYSIWYG editor field to Laravel Nova, enabling rich text editing with configurable toolbars, plugins, and media support for managing HTML content directly in Nova resources.
Architecture fit. emilianotisato/nova-tinymce is a Nova field package, not a standalone editor or CMS. It contributes two thin artifacts: a PHP field class extending Laravel\Nova\Fields\Field and a Vue component registered into Nova's asset pipeline. It does not own content storage, routing, rendering, or the media library — content persists as an HTML string in whatever column the resource already maps, and uploads land on a Laravel filesystem disk. From a TPM lens, this is favorable: the integration is additive and reversible, the blast radius is confined to Nova resource forms, and the package imposes no new architectural pattern the team must learn. The coupling that matters is to Nova and TinyMCE, two independently versioned third parties, not to the package itself.
Integration feasibility. Low ceremony: Composer install, publish config/assets, register TinyMCE::make('Body') on one or more resources, point uploads at a disk. The genuine prerequisites are decisions, not code — a paid Nova license, a TinyMCE distribution strategy (self-hosted bundle vs. Cloud API key with quotas), a storage target (local public disk vs. object storage), and a server-side HTML sanitization control. The package's differentiated value over Nova's stock fields is the inline image-upload path; everything else wraps TinyMCE's mature editor. That framing matters for scoping: you are buying an upload plumbing shortcut plus a field wrapper, not editor capability.
Technical risk.
Key questions.
Text/Trix field with populated HTML content?Stack fit. Strong if and only if the application already runs Laravel Nova; the package has zero value outside it. Teams on Filament, plain Blade, or a separate CMS should stop here. Within Nova the fit is clean and conventional: PHP field class on the backend, Vue component in the Nova asset pipeline, HTML column in the database, files on a Laravel disk.
Migration path. Structural compatibility is easy — the field stores HTML, so columns previously edited by Trix, a textarea, or a CMS import are already the right shape. The real work is normalization: HTML from different editors diverges in tag vocabulary, inline styles, and embed conventions, and will render inconsistently under TinyMCE's schema. Budget a one-time audit-and-sanitize pass over existing content rather than assuming byte-compatible round-tripping; this is the step most likely to be underestimated in a sprint plan.
Compatibility. Pin a verified matrix before committing: PHP, Laravel, Nova, and TinyMCE majors, with the package version pinned in composer.json under a non-floating constraint. Given the thin maintainer base, an unattended minor bump is a credible regression vector. Also confirm the publish/build step (nova:publish / vendor:publish) works in your deployment model — particularly if you build immutable container images without a writable public/vendor at runtime. That is a build-pipeline concern a TPM should surface early because it crosses team boundaries.
Sequencing.
Maintenance. Ongoing cost is modest but recurring and non-zero: tracking Nova upgrades, tracking TinyMCE releases, and re-validating the upload path whenever filesystem or auth configuration changes. The dominant risk is abandonment. Budget for a fork as a pre-approved option — cheap here, since the surface is one PHP class plus one Vue component — rather than an emergency scramble in the middle of a Nova upgrade.
Support. No commercial support and no SLA. Support is GitHub issues plus reading source. For a surface content authors touch daily, your internal team is the first and often only line of support; assign a named owner explicitly, because "the team" means "nobody" when the editor breaks on a Tuesday.
Scaling. Content scaling is a non-issue — HTML in a text column behaves like any other text. The pressure point is media: uploads grow storage and egress linearly with editorial activity. Route uploads to object storage behind a CDN from day one rather than retrofitting, and plan server-side resizing/compression, which the package will not do for you. Editor assets should be self-hosted or cached so a third-party CDN is not in the critical path of every admin page load.
Failure modes.
storage:link produces successful uploads and broken images — silent from the author's view. Smoke-test in staging after every storage-touching deploy.Ramp-up. Author ramp-up is near zero — TinyMCE is the Word-like editor content people already know, and that familiarity is a legitimate argument for this package over Nova's stock fields. Developer ramp-up is also low for anyone fluent in Nova: one field class and one Vue component. The ramp-up that actually costs time is operational — understanding the upload path, the asset pipeline, and the sanitization boundary. Budget half a day to write that down so the knowledge does not live solely with whoever ran the spike.
How can I help you explore Laravel packages today?