wotz/filament-custom-tiptap-extensions
Adds custom TipTap extensions to Filament rich text editors, letting you register extra editor features such as custom nodes, marks, and toolbar tools. Extends Filament's built-in TipTap integration with configurable, reusable extensions for richer content editing.
Architecture fit. This is a narrow surface-area plugin: it registers additional Tiptap extensions into Filament's form-field layer via a service provider, and (almost certainly) ships published JS/CSS assets plus Blade views for custom node rendering. That makes it architecturally low-risk in the sense that it does not touch domain logic, persistence, queues, or auth — it is confined to the admin-panel presentation tier. The dependency chain is the real architecture question: filament/filament (v3 vs v4), awcodes/filament-tiptap-editor, the underlying Tiptap JS major, and Livewire/Alpine. Fit is good only if your Filament major and Tiptap editor version are explicitly in the package's supported matrix. If the extensions are things we would otherwise hand-roll (details/accordion blocks, anchors, alignment, color/highlight, custom attributes), the buy-vs-build math is favorable at first pass — but with 2 stars and 0 dependents we are effectively the first production consumer.
Integration feasibility. Straightforward mechanically: composer require, register the plugin on the panel, publish assets, add the extension classes to the Tiptap editor's ->extensions([...]) array, and configure the sanitizer profile so custom tags/attributes survive. The non-trivial work is downstream: every custom node needs a frontend renderer (Blade component or HTML parser), and content round-trip must be validated — Tiptap will silently drop unknown nodes/attributes when content is loaded and re-saved, which is a data-loss vector, not just a cosmetic one.
Technical risk. Ranked:
HtmlSanitizer/purifier config drift, you get either stripped content (author frustration) or an injection path in an admin-authored field that renders on public pages.wire:model dehydration is a known class of bug.Key questions for the maintainer / spike.
filament-tiptap-editor version, Tiptap major, PHP, Livewire.Recommendation. Conditional pilot, not a default dependency. Value is real if the extensions match a documented editorial requirement; risk is concentrated in unproven maintenance and version coupling, both of which are mitigable with pinning and a fork-in-waiting.
Stack fit. Assumes Laravel 10/11+, PHP 8.2+, Filament v3 panel (v4 support unconfirmed — verify before committing), and awcodes/filament-tiptap-editor already in use or acceptable to adopt. If we are still on Filament's stock RichEditor (TinyMCE), this package is not a drop-in: adopting it forces an editor migration first. Treat the two as one decision, not two. If we have no editorial requirement for these specific node types, the correct answer is to decline and revisit when the package has dependents.
Migration path. Sequence it as a spike, not a rollout:
"wotz/filament-custom-tiptap-extensions": "x.y.*") and, if the spike passes, mirror the repo into our VCS as a read-only fork we can patch. Do not rely on upstream for a fix.Compatibility and coexistence. Old TinyMCE-authored HTML will be re-parsed on first edit. Run a dry-run pass: load all existing records through Tiptap headlessly and diff before/after to enumerate what gets stripped (common casualties: inline styles, data-*, legacy classes). Decide per-casualty whether to add a permissive Tiptap extension, pre-normalize on save, or accept loss. Do not migrate fields where loss is unacceptable without a normalization script. Frontend rendering should be implemented as our own Blade components keyed to the emitted markup, so a future swap of the editor does not force a frontend rewrite.
Sequencing summary. Spike + fixtures → pin/fork → sanitizer contract → single-field pilot → normalization pass → broad rollout. Roughly 2–3 sprints of TPM-tracked work if the spike passes cleanly; abort at step 1 if the fixtures show silent data loss.
Maintenance. We inherit the maintenance. With one maintainer and zero dependents, treat this as an internal fork with an occasional upstream sync rather than a supported dependency. Budget a standing ~0.1 FTE for the fork: dependency bumps on Filament/Tiptap releases, asset rebuilds, and fixture re-runs on each Filament minor. Add a calendar check tied to Filament release notes — that is the trigger event.
Support. No meaningful community support channel and no dependents to lean on for Stack Overflow answers. Escalation path is: read source, patch fork. That requires someone on the team comfortable with Tiptap's extension API and ProseMirror schema — a genuine and somewhat scarce skill. Confirm we have that person before adopting; if not, the risk profile changes materially.
Scaling. Editor-side cost is per-session, not per-request — negligible at our scale. The scaling concern is content volume on the read path if custom nodes require query-time parsing (e.g., accordion blocks that need server-side expansion). Prefer storing fully-rendered HTML or rendering via simple Blade partials so public page performance stays flat. No database or queue implications.
Failure modes to monitor.
Ramp-up. Low for developers wiring it up (half a day), moderate for the Tiptap/ProseMirror knowledge needed to safely patch or add an extension (days), low for authors (a short guide plus screenshots of each node). The scarce resource is the one engineer who understands the schema — document the extension list and the fixture suite so that knowledge is not single-threaded.
How can I help you explore Laravel packages today?