lilac-wysiwyg/lilac
Lilac is a modern WYSIWYG editor for Laravel applications. It offers a simple Blade component, clean HTML output, image upload support, and configurable toolbars, making it easy to add rich text editing to your app.
Architecture fit. Unchanged in substance, but the new release notes sharpen the picture. Lilac is still a client-side WYSIWYG editor whose real integration surface is the browser, and v0.7.1 confirms the packaging shape: a UMD bundle exposing window.Lilac, plus a Composer package that ships alongside it, plus a Qwik-based live playground. The UMD global is a genuine convenience — it means the editor can be dropped into a Blade view via a <script> tag without a build step, which is useful for legacy admin screens and for the one-day spike. It does not change the core TPM conclusion: there is still no evidence of a service provider, config publish, migration, or extra.laravel block, so the PHP-side work — persistence, sanitization, validation, uploads, render path — remains ours. Fit remains good for content-authoring surfaces and poor for constrained/structured input.
Integration feasibility. Unchanged for the thin slice (still a day or two), and marginally improved by the UMD artifact because a no-build prototype is now possible. The expensive parts are identical: server-side HTML sanitization (mews/purifier/HTMLPurifier), a tag/attribute allowlist, an authenticated image endpoint with MIME sniffing and caps, and one canonical render path. One new feasibility question is raised by the notes: if the editor's internals are Qwik-based, check whether the Qwik runtime is bundled or required as a peer dependency — a bundled runtime inflates the payload, a peer dependency risks version conflicts with the host app. Livewire 3 binding still needs wire:ignore plus explicit $wire.set() sync and Alpine glue for toolbar state.
Technical risk. The dominant risk remains maturity, and v0.7.1 is itself evidence for it. A patch release whose sole purpose is to restore a missing dist/lilac.umd.js means the publish pipeline was silently shipping incomplete artifacts and nothing in the release process validated the packed output. That is a process signal, not a code-quality one, but TPMs should read it as: assume published tarballs are not smoke-tested, so verify every artifact you upgrade to rather than trusting the registry. Two secondary consequences. First, the project is clearly pre-1.0 (0.7.x), so minor bumps may carry breaking changes; treat 0.7 → 0.8 as a migration event, not a routine upgrade. Second, since 0.7.0 was the release that presumably introduced the Composer package / UMD / playground trio, the 0.7.0 artifact may have been broken for script-tag consumers for its entire life — any spike done against 0.7.0 must be redone. The previously flagged anomalous release date remains unexplained and still needs verification before a dependency lock. Standing risks unchanged: stored XSS via paste/import, undocumented accessibility conformance, unverified i18n/RTL, unclear canonical output format, and single-maintainer bus factor. MIT remains clean, but still check for bundled third-party code (a bundled Qwik runtime would be the obvious place).
Key questions.
composer require lilac-wysiwyg/lilac actually install — a full Laravel package with provider/config, or a thin wrapper that only publishes assets? The release notes claim a "PHP/Laravel Composer package" but nothing indicates Laravel wiring.dist/lilac.umd.js present in the published v0.7.1 tarball? Verify by inspecting the packed artifact, not the repo.Stack fit. Still a clean fit with Laravel 10/11/12 + Vite + Blade, with one addition: the UMD global gives a viable no-build path for <x-rich-text> on legacy or non-Vite admin pages, alongside the preferred ESM/Vite entry. Alpine pairs naturally; Livewire 3 needs wire:ignore plus explicit sync. Tailwind design systems still need token overrides. Inertia/React/Vue apps consume the ESM build directly — but confirm the Qwik runtime story before assuming it composes cleanly with an existing framework bundle.
Migration path. Content migration is unchanged: if Lilac reads and writes HTML, moving off TinyMCE/CKEditor/Quill/Trix is a re-sanitization pass, not a transform. Leaving Lilac stays cheap only if the stored format is plain HTML; a proprietary JSON document model turns exit into a rewrite, so negotiate for HTML export on every save regardless. Keep the one-time batch re-sanitize-and-diff job before cutover.
Compatibility. PHP version remains irrelevant. Constraints are Node version for the build, the browser matrix, Qwik runtime/peer-dependency interaction, and — newly relevant — artifact integrity: pin exact versions (0.7.1, not ^0.7) because the publish pipeline has a demonstrated failure mode of omitting build outputs, and because pre-1.0 minor bumps are breaking by policy. Coexistence with an incumbent editor on separate screens remains low-risk and a good sequencing tactic; two editors in one form does not.
Sequencing.
dist/lilac.umd.js is actually inside the published package, inspect the Composer package contents, record gzipped size and Qwik dependency shape. This replaces the earlier "does the artifact exist" spike step and must precede everything else.mews/purifier config, allowlist, output helper before the editor ships.Maintenance. Assume ownership. Zero dependents means no community absorbing upgrade pain, and v0.7.1 demonstrates the specific hazard: an upgrade can deliver a broken or incomplete artifact rather than a broken API, so failures surface as "the editor doesn't load" in production, not as a failing test. Budget for a pinned-version policy, a documented upgrade runbook that includes post-install artifact checks, and a vendored fork if the project goes quiet. Track upstream commits monthly; treat 0.8.0 as a planned migration, not a patch.
Support. Community-only, no SLA, no escalation. Internal load lands on the platform team: formatting bugs, paste-from-Word corruption, "content disappeared" tickets — plus, now, packaging questions from developers ("why is the bundle 404ing?"). Establish a triage owner and known-issues doc before launch; capture editor HTML output in error reports so bugs are reproducible.
Scaling. Server-side load essentially unchanged — client-side editing, text-column storage. Watch the authoring page's JS budget (the Qwik runtime, if bundled, is the variable to measure) and lazy-load the editor only on screens that need it. The upload endpoint remains the real scaling surface: rate limits, size caps, object storage from day one, or it is an unbounded disk-fill vector. Cache public rendering of stored HTML as with any content.
Failure modes.
localStorage draft, visible save-state indicator.Ramp-up. Developer ramp-up stays low (half a day; the UMD global lowers it slightly for no-build prototypes), but the team ramp-up is still dominated by sanitization and content-security literacy. Author ramp-up is near zero if the toolbar is trimmed to exactly the tags the sanitizer permits — ship both allowlists from one config, since an editor offering formatting the backend strips is the single most common source of "the editor ate my formatting" complaints.
How can I help you explore Laravel packages today?