RVRite — Package Upgrade & Technology Report

Branch tiptap-v3-upgrade · two workstreams: TipTap v2→v3 migration + dependency cleanup · all changes currently uncommitted in the working tree.

✓ Vite build passes — 3575 modules, ~46s ✓ Single deduped ProseMirror copy TipTap 3.27.0 ⧗ Track-changes / collab QA pending

1Executive summary

Two pieces of work landed on this branch. (A) The editor core was migrated from a fragile mixed TipTap v2 install (betas + v1 dead weight) to a clean, consistent TipTap 3.27.0. (B) The frontend and collab-server package.json files were then pruned of confirmed-unused dependencies.

v2→v3
TipTap core upgrade (3.27.0)
+6
New core packages added
34
UI packages pruned (unused)
3
Server packages pruned
118
Files touching TipTap / ProseMirror
102
prosemirror-* imports rewritten (73 files)

2TipTap core upgrade (v2-mixed → v3.27.0)

The baseline was not clean v2 — it mixed 2.0.0-beta.199, 2.0.3, 2.1.x, 2.4.0 and a dead tiptap@1.32.2. Every @tiptap/* package is now pinned to one consistent minor (^3.27.0).

PackageBeforeAfterChange
@tiptap/core(transitive 2.0.3)^3.27.0now explicit
@tiptap/pm(transitive 2.26.2)^3.27.0now explicit
@tiptap/react2.0.0-beta.113^3.27.0upgrade
@tiptap/starter-kit2.0.0-beta.189^3.27.0upgrade
@tiptap/suggestion2.1.12^3.27.0upgrade
@tiptap/extension-blockquote2.0.0-beta.199^3.27.0upgrade
@tiptap/extension-collaboration2.0.0-beta.199^3.27.0upgrade
@tiptap/extension-color2.0.0-beta.199^3.27.0upgrade
@tiptap/extension-highlight2.0.0-beta.199^3.27.0upgrade
@tiptap/extension-image2.0.0-beta.209^3.27.0upgrade
@tiptap/extension-link2.4.0^3.27.0upgrade
@tiptap/extension-mention2.1.12^3.27.0upgrade
@tiptap/extension-paragraph2.0.0-beta.199^3.27.0upgrade
@tiptap/extension-subscript2.0.0-beta.204^3.27.0upgrade
@tiptap/extension-superscript2.0.0-beta.204^3.27.0upgrade
@tiptap/extension-table2.0.0-beta.199^3.27.0upgrade + absorbs cell/row/header
@tiptap/extension-text-align2.0.0-beta.199^3.27.0upgrade
@tiptap/extension-text-style2.0.0-beta.199^3.27.0upgrade (default→named export)
@tiptap/extension-underline2.0.0-beta.220^3.27.0upgrade

3New packages introduced by the migration

PackageVersionWhy it was added
@tiptap/core^3.27.0Promoted to an explicit dependency (pin the v3 base).
@tiptap/pm^3.27.0Single source of ProseMirror — eliminates the duplicate-PM instanceof class of bugs.
@tiptap/extension-list^3.27.0Consolidates BulletList / OrderedList / ListItem / TaskList / TaskItem / ListKeymap.
@tiptap/extensions^3.27.0Provides UndoRedo (replaces @tiptap/extension-history) and other bundled utils.
@tiptap/y-tiptap^3.0.5v3's Yjs ⇄ ProseMirror binding — replaces y-prosemirror. Keeps track-changes ↔ collab undo in sync.
y-protocols^1.0.7Yjs awareness peer required by the v3 collaboration tree.

The migration also briefly added @tiptap/extension-collaboration-caret (the v3 rename of collaboration-cursor), but the cleanup later removed it — the main editor uses a vendored caret extension (§5).

4Packages removed or folded in by v3

Removed package (v2)Replacement in v3
@tiptap/extension-table-cell / -table-row / -table-headerNamed exports of @tiptap/extension-table
@tiptap/extension-task-list / -task-itemNamed exports of @tiptap/extension-list
@tiptap/extension-historyUndoRedo from @tiptap/extensions
@tiptap/extension-collaboration-cursorVendored collaboration/collaboration-cursor.ts (v3-compatible)
@tiptap/extension-character-countDropped — no getCharacterCount() usage in the app
@tiptap/extension-code-block-lowlightDropped — StarterKit's plain codeBlock is used
@tiptap/htmlDropped — no generateHTML/JSON usage
tiptap (v1.32.2)Dropped — dead v1 meta-package, never imported

5Code & technology migration details

ProseMirror normalization make-or-break for track changes

Yjs collaboration glue

StarterKit & API call-site changes

Build & toolchain

6Dependency cleanup (unused-package prune)

After the migration, every declared dependency was checked against real imports (JS/TS/JSX/SCSS/CSS/HTML, dynamic imports, CSS imports, peer-dep roles). Confirmed-unused packages were removed. react-scripts + the CRA tooling were retired (the start script now runs vite, and the dead eslintConfig block was removed).

RVRite_ui — 34 removed

30 dependencies:

@createnextapp/async-local-storage · @date-io/date-fns · @hocuspocus/extension-sqlite · @hocuspocus/server · @hocuspocus/transformer · @hookform/resolvers · @react-keycloak/web · @testing-library/user-event · @tinymce/tinymce-react · @tiptap/extension-collaboration-caret · @types/google.accounts · @typescript-eslint/parser · @vitejs/plugin-legacy · chart.js · devextreme-react · diff · groq-sdk · jstoxml · jwt-decode · jwt-encode · katex · keycloak-js · lowlight · randomcolor · raw-loader · react-katex · react-scripts · remixicon · tinymce · zod

4 devDependencies:

@originjs/vite-plugin-commonjs · @prettier/plugin-php · prettier · vite-tsconfig-paths

RVRite_server — 3 removed

@hocuspocus/extension-webhook · @tiptap/html · js-base64

Kept (look unused, but needed)

@tiptap/suggestion (mention peer) · y-protocols (collab peer) · pdfjs-dist (via react-pdf) · web-vitals (dynamic import) · sass (SCSS compiler) · bootstrap / devextreme (CSS imports)

Note: package-lock.json is intentionally not yet regenerated — run npm install in both projects to sync lockfiles and prune node_modules.

7Current technology stack

LayerTechnologyVersionRole
EditorTipTap (core/react/starter-kit/extensions)^3.27.0Rich-text editor framework
Editor@tiptap/pm (ProseMirror)^3.27.0Document model / view / transforms
Collab (CRDT)Yjs + @tiptap/y-tiptap + y-protocols13.5.x / 3.0.5 / 1.0.7Conflict-free real-time sync
FrontendReact + React DOM^18.2.0UI framework
FrontendVite^5.0.12Build & dev server (replaces react-scripts)
StylingSass (Dart Sass)^1.55.0Global stylesheet compilation
Collab serverHocuspocus (server)^1.1.3WebSocket collaboration (RethinkDB-backed)
Collab serverHocuspocus (API sync)^2.0.6Node ⇄ MySQL session bridge
BackendPHP / Laravel^8.2 / ^10REST persistence, queues, export
BackendLaravel Horizon / Reverb^5.27 / ^1.1Queue workers / WebSocket broadcast
DatabasesMySQL / RethinkDB8.0 / latestRelational storage / live collab state

8Status & remaining work

✓ Verified: Production Vite build passes (3575 modules transformed, ~46s); npm ls confirms a single @tiptap/pm@3.27.0 / prosemirror-model@1.25.9 / prosemirror-view@1.41.9 — no duplicate ProseMirror.
⧗ Manual QA required (headless build can't catch): the full track-changes regression matrix — insert/delete/format then Accept & Reject for every tracked node type (text marks, lists, tables, footnotes, equations, references, images/video, boxed-text, anchors) — plus collaboration cursors and Yjs undo/redo interaction.
⚠ Pre-existing, fix separately: a real no-undef bug — lang used but never declared in LanguageToolPopup.jsx:173 (demoted to a warning via ESLINT_NO_DEV_ERRORS); and a POST /save-doc-html 500 from onDestroy which is a backend (Laravel) response, not a migration regression.
Environment caveat: RVRite_ui/build/ may contain root-owned dirs from a prior sudo build → npm run build can EACCES until sudo rm -rf build. Unrelated to the migration.
Next steps: (1) run npm install in both projects to sync lockfiles; (2) complete the track-changes/collab QA matrix; (3) fix the lang bug; (4) commit the branch.

Sources: git diff of RVRite_ui/package.json & RVRite_server/package.json (committed → working tree) · RVRite_ui/TIPTAP_V3_MIGRATION_PLAN.md
Branch tiptap-v3-upgrade · all changes uncommitted · report generated 2026-06-19

Created by : Naveen T M |  Software Engineer  | River Valley Technologies