Acc.
2026.02
CollabDocs
A shared document editor — a TipTap canvas with anchored comments, per-document roles and email invites, backed by Convex reactive queries and an explicit last-write-wins conflict rule.
- Role
- Sole developer
- Medium
- Next.js · TypeScript · Convex · TipTap · Tailwind CSS
- Acquired
- Status
- ACTIVE
- Condition
- Untouched since April 2026. Editing, auth, comments, roles and invites work. Concurrent editing is last-write-wins by design, so two people typing in the same paragraph will lose one side's changes — that is the known limit, not a bug to be found. The table and task-list extensions are wired but thin on tests.
- Links
Convex’s reactive queries carry the document, so a save on one client lands in every other open editor without a socket layer of its own. What the app does not have is a CRDT. Edits are debounced and written whole, and lib/sync/conflictResolver.ts states the rule plainly: the higher server timestamp wins, ties go to the server. That is a real limitation with two people in one paragraph, and it is written down rather than hidden behind the phrase “real-time.”
The editor is TipTap with the extensions a working document tool needs — tables, task lists, text alignment, code blocks through lowlight, a character count — plus two written for this app: an image node that uploads to Convex storage, and a chart node rendering through Chart.js. Comments are a custom CommentMark that anchors a thread to a span and keeps the quoted excerpt with it, so a thread survives edits around it and can be resolved from the sidebar. Sharing runs on a collaborators table with editor and viewer roles against an invites table carrying pending, accepted and declined states.
The parts usually skipped at this size are present: zod validation on every mutation, DOMPurify on rendered content, rate limiting, an audit log indexed by time, user and document, structured logging with request IDs, Sentry, and both Vitest and Playwright suites.