Goal
A lightweight but real social profile system — persistent identity, avatar, unique @username, display name, short bio, social links, and a follow relationship between registered users — with a public profile page other viewers can open from the live room. Explicitly not a full social network: no feed, no posts, no DMs, no notifications, no gamification (win rate/XP/levels/badges/leaderboards), no recommendation algorithms.
Critical constraint
Profiles must never gate the core experience. Guests keep watching/commenting/reacting/voting/requesting the mic/speaking with zero account, per the progressive-authentication model (AGENTS.md). Only the Follow action itself may prompt signup, and only with a benefit-framed inline prompt — never a redirect.
Scope (first pass)
- Data model:
username (unique, case-insensitive, reserved-name list), avatar_url, bio (≤160 chars, plain text), social_links (jsonb, extensible platform map).
/profile/[username] public profile page (avatar, display name, @username, bio, social icons, follower/following counts, join date, stage-appearance count).
/profile/edit — avatar upload/remove, display name, username, bio, social links, explicit Save/Cancel.
- Avatar storage: new Supabase Storage
avatars bucket, owner-scoped RLS, client-side resize/compression, fallback initials avatar.
- Social links: Instagram/TikTok/YouTube/X/Twitch/website, handle-or-URL input normalized to one canonical stored value, unsafe-scheme rejection (javascript:/data:/etc.), extensible to future platforms without a schema change.
- Follow system: follow/unfollow, follower/following counts visible to guests, no self-follow, no duplicates, authoritative DB constraints + RLS.
- Live-room identity integration: avatar/name becomes tappable into the profile in speaker tiles and expanded comments for registered users; guests and no-username accounts stay non-navigable (no fake guest profile pages); tap never triggers the underlying vote/like/comment/speaker control (proper event-boundary handling).
- "My Profile" entry point added to the existing room account menu (
RoomInfoOverlay) — no revived site-wide header inside the room.
Explicitly out of scope this pass
Follower/following lists (counts only, unless small scope allows lists — flag as deferred if not), posts/feeds, DMs, private accounts, verified badges, payments, themes, OAuth verification, full notifications, blocking, ads.
See DECISIONS.md and SESSION_LOG.md for the actual implementation record.
Goal
A lightweight but real social profile system — persistent identity, avatar, unique
@username, display name, short bio, social links, and a follow relationship between registered users — with a public profile page other viewers can open from the live room. Explicitly not a full social network: no feed, no posts, no DMs, no notifications, no gamification (win rate/XP/levels/badges/leaderboards), no recommendation algorithms.Critical constraint
Profiles must never gate the core experience. Guests keep watching/commenting/reacting/voting/requesting the mic/speaking with zero account, per the progressive-authentication model (AGENTS.md). Only the Follow action itself may prompt signup, and only with a benefit-framed inline prompt — never a redirect.
Scope (first pass)
username(unique, case-insensitive, reserved-name list),avatar_url,bio(≤160 chars, plain text),social_links(jsonb, extensible platform map)./profile/[username]public profile page (avatar, display name, @username, bio, social icons, follower/following counts, join date, stage-appearance count)./profile/edit— avatar upload/remove, display name, username, bio, social links, explicit Save/Cancel.avatarsbucket, owner-scoped RLS, client-side resize/compression, fallback initials avatar.RoomInfoOverlay) — no revived site-wide header inside the room.Explicitly out of scope this pass
Follower/following lists (counts only, unless small scope allows lists — flag as deferred if not), posts/feeds, DMs, private accounts, verified badges, payments, themes, OAuth verification, full notifications, blocking, ads.
See DECISIONS.md and SESSION_LOG.md for the actual implementation record.