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.
LIKE search and requires a custom renderer. As PM, own this decision up front and write it down — it is the single most expensive thing to change later.excerpt on save in a model observer — is a product feature decision (what users see in Nova index tables, meta descriptions, search results), not just a performance tweak. It also keeps derived fields consistent across Nova writes, seeders, imports, and API writes.Consider it when:
longText column.mews/purifier or symfony/html-sanitizer on save in an observer), with sanitization also enforced at render time as defence in depth.^2.0.1, read changelogs before bumps, and maintain a smoke test that the editor mounts in create, update, and detail views.Look elsewhere when:
resources/js/field.js on every release, converting a cheap dependency into a permanent merge cost.dependsOn forms, where rich-text state plus conditional show/hide is a known source of flicker and lost edits.To executives: We can add a modern rich-text editor to our Nova admin for essentially zero license cost (MIT) and roughly a week of engineering, versus several weeks to build and maintain the equivalent in-house. The scope is deliberately small: it only affects how internal staff author long-form content in the admin — it does not touch the public site, our APIs, or customer-facing flows. The real cost isn't the package, it's ownership: it's a small, single-maintainer open-source project, so we should treat it as a trial with a named internal owner and a fallback plan rather than a permanent platform commitment. Recommended ask: a one-week spike on a single low-risk resource, with a go/no-go decision before wider rollout.
To engineering: This is a Nova custom field wrapping Tiptap/ProseMirror. Integration is the standard Nova field contract — install, publish field assets, nova:publish, declare Tiptap::make('Body') on a resource — so no domain code changes. Three things need deciding before we write anything: the storage format (sanitized HTML vs. ProseMirror JSON), the sanitization point (server-side on save, in an observer or mutator, not just at render), and the version pins (package minor, Nova major, Tiptap major, all locked). The known failure mode is the editor failing to mount after an upgrade — 2.0.1's only changelog entry is exactly that fix — so our acceptance criteria for the spike are: editor renders in create, update, and detail views, and a round-trip (create → save → reload → render) preserves content. We should also derive a plain-text excerpt in a model observer so the Nova index doesn't blow out row height on raw HTML or JSON, and so search and meta descriptions don't depend on the editor's output shape.
To security/compliance: Editor output is user input. We will not rely on the field's client-side behavior as a security boundary. Policy: sanitize on save so dirty HTML never reaches the database, sanitize again on render as defence in depth, and add a CSP. Any existing legacy content must be validated before this field is pointed at it.
Known risks to state plainly: single maintainer and a young 2.x line (expect patch churn); Tiptap and Nova major upgrades will require lockstep package upgrades with no migration tooling; custom-node requirements likely mean forking the field component; and content normalized on first open may not survive a poorly planned migration. Each has a cheap mitigation — a mount smoke test, a round-trip test, pinned versions, and a sanitizer — and those mitigations are the actual deliverable of the spike, not the editor itself.
How can I help you explore Laravel packages today?