Dev WebSocket churn — server.js attached the presence WebSocketServer
with { server } (no path), so it intercepted every upgrade including
Next.js HMR (/_next/webpack-hmr), causing the presence socket to drop
repeatedly ("just you / offline"). Now uses { noServer: true } + a manual
upgrade handler that only claims /_ws; lib/sync.ts connects to that path.
Changed
TopBar presence is now a positive-only signal: the "offline" pill is gone
(absence of the cluster is the offline state). Shows a green live dot +
"Live" when connected solo, and avatars + "N online" when others are present.
Notes
The running dev server must be restarted to pick up the server.js change.