yeswedev/nova-ckeditor4-field-translatable
Provides a Laravel Nova field that brings CKEditor 4 rich-text editing to translatable attributes, letting you edit and manage localized content across multiple locales directly within Nova resources.
Architecture fit
yeswedev/nova-ckeditor4-field-translatable is a Nova field package, not a general Laravel package. Its entire value surface is a Vue component registered as a Nova field plus a PHP field class that hands rendered HTML to the model. That makes fit binary and narrow:
title, body, description per locale).nova-translatable, or spatie/laravel-translatable). That means the package's real dependency graph is Nova + CKEditor 4 + a translation package, three independent upgrade cadences the TPM inherits.Integration feasibility
Integration is mechanically simple — composer require, register in NovaServiceProvider::fields(), php artisan vendor:publish for assets, then swap Text::make() for the new field. Estimate half a day for a working spike in a single resource.
The blockers are not mechanical:
composer.json laravel/nova constraint is the single most important artifact to read before anything else.Technical risk
| Risk | Severity | Rationale |
|---|---|---|
| Abandonment | High | No stars, no dependents, hosted on Framagit (low discoverability), likely a single-agency internal extraction. No signal of ongoing maintenance. |
| Supply chain / provenance | Medium-High | Unaudited third-party code from a non-GitHub host. No CI, no test suite, no visible release history. Needs a source read before install. |
| XSS / sanitization | High | Rich-text fields store raw HTML. Wrapper packages typically do not sanitize server-side. Without HTMLPurifier (or equivalent) on output/render, you inherit stored-XSS exposure from any user with editor access. |
| Editor EOL | High | Security patches have a hard stop; no migration assistant to CKEditor 5. |
| Upgrade breakage | High | Nova major upgrades and CKEditor asset changes both land on you; no upstream to wait for. |
Key questions to resolve before any commitment
composer.json constraints for laravel/nova, php, and the translation package? Does it support Nova 4, Nova 5, or both?nova-translatable, or Spatie — and does it handle per-locale dirty state (unsaved edits when switching locale tabs)?Stack fit
Verdict: conditional reject as a dependency; accept as a fork-and-own candidate given the score of 0 and no dependents.
Recommended stack position: treat the repo as a reference implementation for the PHP field class + Vue component, copy it into nova-components/ as an in-house field, and take direct ownership of the CKEditor dependency and the sanitization layer.
Migration path
composer require from Framagit (which pins you to a Git VCS repository with no tag guarantees), copy the field into a local nova-components/rich-text-translatable package under your own namespace and CI. This converts an abandoned dependency into maintained first-party code.fill/resolve with an HTMLPurifier policy (allowed tags, allowed attributes, rel="noopener" on links). Never trust the editor's client-side filtering.Compatibility
vendor/ publishes cause stale-editor bugs after deploys.Sequencing
Text/Textarea field code path until editorial sign-offIf any gate fails, the fallback is a plain markdown/textarea field plus server-side rendering — cheaper than owning an EOL editor.
Maintenance
This package is maintenance-negative out of the box. With no stars, no dependents, and a Framagit-only presence, you should assume the effective maintainer count is zero and plan for the fork in step 2 of the integration approach. Budget roughly 2–5 engineer-days per year for dependency bumps (Nova major, PHP minor, PHPUnit/HtmlPurifier) plus reactive work when Nova ships breaking changes. The CKEditor 4 EOL horizon means a mandatory editor migration project inside 12–24 months — that is a real line item, not a risk footnote.
Support
No commercial support, no SLA, no security disclosure process on the repo. Internal support burden lands on whoever owns Nova. Editor behavior questions ("paste from Word breaks formatting," "image upload doesn't work") will come from content editors to your team, not to an upstream maintainer. Set expectations with the editorial team early; a short internal FAQ reduces ticket volume more than any code change.
Scaling
Backend impact is negligible — the editor is client-side, and the persistence path is an HTML string into an existing column. The scaling concerns are elsewhere:
LONGTEXT usage, replication lag on large updates, and full-row SELECT * patterns.LIKE/full-text search. If translated content must be searchable, plan a stripped-text projection column or an external index (Meilisearch/Scout) at the same time as adoption — retrofitting it later is a backfill.Failure modes
| Failure | Blast radius | Mitigation |
|---|---|---|
| Stored XSS via editor input | High — admin and, if echoed, public pages | Server-side HTMLPurifier policy; strict CSP |
| Nova upgrade breaks the field | Medium — admin editing blocked for affected resources | Owned fork + CI smoke test on Nova upgrades |
| CKEditor 4 security advisory with no patch | High — indefinite exposure | Track EOL date; pre-scoped migration to CKEditor 5/TipTap |
| Translation tab switch loses unsaved edits | Medium — editorial data loss, trust erosion | Verify dirty-state handling in the spike; test explicitly |
| Asset publish staleness after deploy | Low-Medium — odd editor behavior, cache confusion | Versioned assets, nova:publish in deploy pipeline |
| Framagit repo disappears | Low if forked; High if composer required by VCS |
Fork on day one |
Ramp-up
Recommendation
Adopt only as a vendored, first-party Nova field with server-side sanitization and a documented CKEditor 4 exit plan. Do not add it as a VCS composer require dependency. If the team cannot commit to owning the fork and the editor migration, prefer a maintained alternative (a CKEditor 5 Nova field, a TipTap-based field, or a plain translatable textarea) — the capability is cheap to re-source; the EOL editor is not.
How can I help you explore Laravel packages today?