wamesk/laravel-nova-tiptap-field
A Tiptap-powered rich text editor field for Laravel Nova, giving your admin panels a modern, extensible WYSIWYG experience with clean HTML output and easy integration into existing resources.
Architecture fit. wamesk/laravel-nova-tiptap-field is a drop-in Nova form field that wraps Tiptap (a ProseMirror-based headless editor) in a Vue component and persists rich text through the standard Nova field contract. It does not touch domain code: a TPM can treat it as an authoring-layer dependency, declared per-resource, with no changes to models beyond the content column itself. Fit is strong if the team already standardises on Nova for admin authoring; it is a poor fit if authoring must be exposed outside Nova (customer-facing editors, headless CMS workflows) or if the front end is not Laravel/Blade.
Integration feasibility. Low-to-moderate. Requirements are the usual Nova field mechanics — a FieldServiceProvider, published/compiled JS assets, and a working npm/Vite build in the host app. The real planning question is not "can we install it" but "which versions are we pinning": Nova major (4 vs 5) and the bundled Tiptap major must be validated together, and this package's 2.x line is very young. Budget a short spike (1–2 days) to confirm the editor mounts correctly in form, detail, and index contexts before committing.
Technical risk. This is where a TPM should spend the most attention:
Key questions to resolve before approval.
resources/js/field.js?Stack fit. Assumes Laravel + Nova (Vue 3) + a Node build pipeline. The decision that constrains everything downstream is the storage format: sanitised HTML (trivial to render, searchable with LIKE, works with existing Blade) versus ProseMirror JSON (lossless re-editing, but requires a renderer and kills LIKE search). Pick one per column and document it; do not mix. If full-text search matters, plan a derived plain-text excerpt column populated on save.
Migration path. Treat this as greenfield for new content types first. For existing rich-text columns (Trix, Markdown, raw HTML), plan a one-way transform into the chosen format and keep the legacy field available as a fallback until the transform is validated on real content. Because the 1.x→2.x history is undocumented, do not point this field at a column where content loss is unrecoverable without a backup and a dry run — Tiptap re-serialises on open and will silently drop schema-invalid markup the first time an editor saves a legacy record.
Compatibility. Pin the package (^2.0.1), Nova, and Tiptap versions explicitly in composer.json / package.json and commit the lockfiles. Add a smoke test that asserts the editor mounts in create, update, and detail views — that is exactly the surface 2.0.1 touched and the fastest regression detector we can own.
Sequencing (suggested delivery plan).
Maintenance. Ongoing cost is real but bounded. Budget one composer update / npm update cycle plus a re-run of the mount smoke test after every Nova or Tiptap bump, and one package-upgrade project per Nova major. Because the package is single-maintainer, assume we may eventually need to fork it: keep customisations in our own component overrides rather than patches in vendor/, and note that the extension-hook question (Key Question 5) determines whether a fork becomes mandatory the first time Product asks for a custom node.
Support. Upstream support is best-effort via GitHub issues with no SLA. Placing this on a critical authoring path requires a named internal owner who can read the Vue component and the ProseMirror schema — designate that person before adoption, not after the first incident. For high-value authoring flows, keep a contingency in the plan: either a commercial Tiptap-backed editor or a first-party Nova field.
Scaling. Rendering is client-side and cheap; the cost is editor JS bundle weight on Nova pages, mitigated by declaring the field only on resources that need it. Server-side cost is storage — a JSON document is materially larger than plain text, so watch column sizing and any search indexing built directly on the column. Derive and index an excerpt instead.
Failure modes and detection hooks. Each needs an owner and a check:
Ramp-up. A Laravel developer familiar with Nova is productive on basic field usage within a day. Custom Tiptap extensions, toolbar changes, or a storage-format migration require ProseMirror familiarity — plan roughly a week for whoever owns that work. Net TPM recommendation: approve for pilot use on non-critical authoring surfaces with pinned versions, a documented sanitisation policy, and a named owner; defer any decision that depends on custom extensions until the extension-hook question is answered in the spike.
How can I help you explore Laravel packages today?