Agent Skills: Yjs in Next.js 16, tRPC, and shadcn/ui

Corrects the wrong defaults a capable model has when building Yjs collaborative editing into a Next.js 16 App Router app with tRPC v11 and shadcn/ui — pinned to Yjs 13.6.31. Covers the decisions whose failure mode is silence rather than an error — plain objects in a Y.Map discarding concurrent edits, updates that vanish because a JSON boundary turned a Uint8Array into a number array, undo that reverts a colleague's paragraph, initial content seeded once per client, and carets thrown to the end of a shadcn Input on every remote keystroke. Also covers where the sync loop can actually run, since route handlers cannot upgrade, Vercel Functions have no instance affinity, and tRPC subscriptions are one-way — plus which packages have already moved to the Yjs 14 prerelease track. Use when writing, reviewing, or debugging collaborative editing, presence, offline sync, or CRDT persistence in this stack.

UncategorizedID: pproenca/dot-skills/yjs-nextjs

Install this agent skill to your local

pnpm dlx add-skill https://github.com/pproenca/dot-skills/tree/HEAD/skills/.experimental/yjs-nextjs

Skill Files

Browse the full folder contents for yjs-nextjs.

Download Skill

Loading file tree…

skills/.experimental/yjs-nextjs/SKILL.md

Skill Metadata

Name
yjs-nextjs
Description
Corrects the wrong defaults a capable model has when building Yjs collaborative editing into a Next.js 16 App Router app with tRPC v11 and shadcn/ui — pinned to Yjs 13.6.31. Covers the decisions whose failure mode is silence rather than an error — plain objects in a Y.Map discarding concurrent edits, updates that vanish because a JSON boundary turned a Uint8Array into a number array, undo that reverts a colleague's paragraph, initial content seeded once per client, and carets thrown to the end of a shadcn Input on every remote keystroke. Also covers where the sync loop can actually run, since route handlers cannot upgrade, Vercel Functions have no instance affinity, and tRPC subscriptions are one-way — plus which packages have already moved to the Yjs 14 prerelease track. Use when writing, reviewing, or debugging collaborative editing, presence, offline sync, or CRDT persistence in this stack.

Yjs in Next.js 16, tRPC, and shadcn/ui

Yjs 13.6.31 in an App Router codebase — the decisions collaborative editing forces and how to settle them, written so an agent applies them while writing or reviewing code. Each rule names the wrong default it corrects; there is no rule for things the model already gets right.

Most of these failures are silent. Yjs converges, the editor keeps working, and the data loss surfaces later as "my change reverted" — so the rules below lead with the evidence of the failure, most of it measured directly against Yjs 13.6.31 rather than asserted.

When to Apply

  • Building collaborative editing, presence, or offline sync into a Next.js 16 App Router app
  • Choosing shared types for a document model, or reviewing one that loses edits under concurrency
  • Deciding where the sync backend runs, or wiring tRPC procedures alongside a Yjs provider
  • Persisting Y.Doc state to a database, or compacting stored updates
  • Binding a Yjs document to React — provider lifecycle, subscriptions, Strict Mode, SSR
  • Wiring Tiptap or shadcn/ui form controls to a live document
  • Debugging a document that syncs but duplicates, blanks, or reverts content

This skill does not cover general Next.js App Router patterns (use the nextjs skill), general tRPC usage (trpc), or shadcn/ui component conventions (shadcn) — only where those intersect with a CRDT.

Version Pin

Rules target Yjs 13.6.31 with y-websocket 3.0.0, y-protocols 1.0.7, and y-indexeddb 9.0.12. Yjs is mid-migration to v14 under the @y/* scope, and several packages have already moved latest or main onto that prerelease track — @y/websocket-server@0.1.5 depends on yjs@^14.0.0-7. See host-pin-the-yjs-13-track before installing anything.

Rule Categories

| # | Category | Prefix | Covers | |---|----------|--------|--------| | 1 | Sync Topology & Dependencies | host- | Where the sync loop runs, which backend to build on, where the trust boundary sits, which versions are on the v13 track | | 2 | Binary Transport & Persistence | wire- | Moving Uint8Array updates across JSON boundaries and into storage | | 3 | Modeling State in Shared Types | model- | Which shared type per field — decides whether concurrent edits merge or destroy each other | | 4 | Doc Lifecycle & React Binding | react- | One document across renders, Strict Mode, subscriptions, the server boundary | | 5 | Undo, Snapshots & Offline Load | hist- | Origin-scoped history, garbage collection, load ordering | | 6 | Awareness & Cursors | pres- | Ephemeral presence and positions that survive concurrent edits | | 7 | Editor & Form Integration | ui- | Tiptap and shadcn/ui form controls against a live document |

Quick Reference

1. Sync Topology & Dependencies

2. Binary Transport & Persistence

3. Modeling State in Shared Types

4. Doc Lifecycle & React Binding

5. Undo, Snapshots & Offline Load

6. Awareness & Cursors

7. Editor & Form Integration

How to Use

Read a reference file when its decision comes up. Each rule names the wrong default it corrects, then shows the canonical way, with an incorrect/correct contrast where the wrong way is a real trap.

When debugging rather than writing, start from the symptom:

| Symptom | Read first | |---------|-----------| | Document loads blank | wire-rehydrate-to-uint8array, hist-wait-for-indexeddb-sync | | Content appears twice | model-seed-the-document-once, ui-tiptap-collaboration-wiring | | Someone's edit silently reverted | model-nested-types-not-plain-objects, hist-scope-undo-by-origin | | List items duplicate when dragged | model-yarray-has-no-move | | Two editors never see each other | host-vercel-lacks-instance-affinity | | A user edited a field they should not reach | host-authorize-rooms-not-updates | | A collaborator's avatar lingers after they leave | pres-awareness-is-ephemeral | | Caret jumps to the end while typing | ui-do-not-drive-inputs-from-the-doc | | Infinite render loop or snapshot error | react-subscribe-via-usesyncexternalstore | | Works in production, broken in dev | react-stable-doc-and-provider |

Reference Files

| File | Description | |------|-------------| | references/_sections.md | Category definitions and ordering | | assets/templates/_template.md | Template for new rules | | AGENTS.md | Auto-built table of contents across all rules | | metadata.json | Version and source references |

Related Skills

  • nextjs — App Router caching, Server Components, and routing outside the CRDT layer
  • trpc — tRPC v11 router, link, and subscription rules in full
  • shadcn — component composition and form patterns this skill builds on
  • zod — the validators used in the tRPC procedure examples here