- Eliminate N+1 on resolveCollaborator: add batchResolveCollaborators() in
auth.ts (2 DB queries max regardless of session count), update all 4
workshop services to use post-batch mapping
- Debounce router.refresh() in useLive.ts (300ms) to group simultaneous
SSE events and avoid cascade re-renders
- Call cleanupOldEvents fire-and-forget in createEvent to purge old SSE
events inline without blocking the response
- Add loading.tsx skeletons on /sessions and /users matching actual page
layout (PageHeader + content structure)
- Lazy-load ShareModal via next/dynamic in BaseSessionLiveWrapper to reduce
initial JS bundle
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- New workshop where each team member shares up to 5 GIFs with notes to express their weekly mood
- Per-user week rating (1-5 stars) visible next to each member's section
- Masonry-style grid with adjustable column count (3/4/5) toggle
- Handwriting font (Caveat) for GIF notes
- Full real-time collaboration via SSE
- Clean migration (add_gif_mood_workshop) safe for production deploy
- DB backup via cp before each migration in docker-entrypoint
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>