internal/collab (jetstream): a mutex-guarded Doc over aholstenson/loro-go (EncodeSnapshot/EncodeUpdate/ApplyUpdate/StateVersion); a SyncWorker that subscribes app.sync.>, merges Loro updates, and persists the resolved snapshot to PocketBase (whiteboards collection, upsert by doc_id); a Publisher so the desktop edge pushes deltas on app.sync.<docID>.
Ephemeral multi-user presence over app.presence.>: Presence (heartbeat join/leave + cursor with roster TTL) plus a central SSE bridge GET /api/collab/presence/{docID} so browser clients receive edge cursors live. cmd/desktop starts a Presence session + demo cursor.
Desktop CI bundles (.github/workflows/build-platforms.yml): .dmg×2 / .exe / .AppImage via wails build -tags jetstream.
e2e guards (in make test-combined, -tags "jetstream dagnats"): TestCollab_LeafNodeE2E (real central NATS + separate leaf-node edge replicating a Loro update to central + persisting) and TestPresence_SSEBridgeE2E (SSE bridge carries an edge cursor to a browser client). Found + fixed a real SSE hang (handler blocked before writing headers). All collab tests finish in ~2s.
README "Desktop & Mobile" section; mobile marked experimental.
Rejected ipfs/go-ds-crdt (LWW-per-key KV CRDT over libp2p — would lose concurrent edits; drags libp2p on top of the NATS Leaf Node). Loro stays.