Privacy-first social features for recovery apps - sponsors, groups, messaging, friend connections. Use for sponsor/sponsee systems, meeting-based groups, peer support, safe messaging. Activate on "sponsor", "sponsee", "recovery group", "accountability partner", "sober network", "meeting group", "peer support". NOT for general social media patterns (use standard social), dating features, or public profiles.
Build privacy-first social features for addiction recovery apps. These patterns prioritize anonymity, safety, and the unique relationship structures in recovery communities.
✅ USE this skill for:
❌ DO NOT use for:
recovery-community-moderator for content safetyRecovery apps handle sensitive data. Default to maximum privacy, let users opt into visibility.
interface PrivacySettings {
profileVisibility: 'private' | 'friends' | 'community';
showSobrietyDate: boolean;
showProgram: boolean; // AA, NA, CMA, etc.
showLocation: 'none' | 'city' | 'region';
allowMessages: 'none' | 'friends' | 'sponsors' | 'all';
anonymousInGroups: boolean; // Use display name only
}
// Default to most private
const DEFAULT_PRIVACY: PrivacySettings = {
profileVisibility: 'friends',
showSobrietyDate: false,
showProgram: false,
showLocation: 'none',
allowMessages: 'friends',
anonymousInGroups: true,
};
Many users need complete anonymity. Support display names separate from real identity.
interface Profile {
id: string;
// Private - never exposed publicly
email: string;
realName?: string;
// Public-facing identity
displayName: string; // "JohnD" or "GratefulMember"
avatarType: 'initials' | 'icon' | 'custom';
avatarIcon?: string; // Predefined icon set
// Recovery-specific
sobrietyDate?: Date;
programs: ('aa' | 'na' | 'cma' | 'smart' | 'refuge' | 'other')[];
homeGroup?: string; // Primary meeting
}
The sponsor relationship is hierarchical and private. Only the two parties should know about it.
Key concepts:
Hooks provided:
useSponsorInvite() - Generate and accept invite codesuseSponsorRelationships() - List sponsors and sponseesComponents:
GenerateSponsorInvite - Sponsor creates shareable codeAcceptSponsorInvite - Sponsee enters code to connectSponsorDashboard - View all sponsor/sponsee relationshipsSee:
references/sponsor-sponsee.mdfor full implementation
Groups that form organically around meetings. Ephemeral by default but can be made permanent.
Key concepts:
Group Settings:
interface GroupSettings {
name: string;
meetingId?: string; // Link to meeting
visibility: 'public' | 'private' | 'invite';
ephemeral: boolean; // Auto-delete after 24h
maxMembers: number; // Member limit
}
| Visibility | Who Can See | Who Can Join |
|---|---|---|
public | Anyone | Anyone |
private | Members only | Invite only |
invite | Members only | Has invite code |
Hooks provided:
useMeetingGroup() - Create, join, leave groupsComponents:
QuickMeetingGroup - One-tap group creation at meetingsSee:
references/groups.mdfor full implementation
Peer-to-peer connections without hierarchy. Mutual consent required.
Key concepts:
Hooks provided:
useFriendships() - Full friendship management with real-time syncComponents:
FriendRequestButton - Context-aware add/pending/friends statesPendingFriendRequests - Accept/decline UISee:
references/friendships.mdfor full implementation
Recovery-appropriate messaging with crisis detection and safety features.
Key concepts:
Crisis Keywords (trigger resource prompt):
const CRISIS_KEYWORDS = [
// Suicidal ideation
'suicide', 'kill myself', 'want to die', 'end it all',
// Relapse indicators
'relapse', 'using again', 'fell off the wagon',
// Self-harm
'hurt myself', 'cutting', 'self-harm',
];
Best Practices:
Hooks provided:
useMessages() - Real-time message thread with Supabase subscriptionsComponents:
MessageInput - Input with crisis detection overlaySee:
references/messaging.mdfor full implementation
Sharing recovery progress with trusted connections.
Check-In Sharing:
Sobriety Visibility Settings:
| Level | Who Can See | Use Case |
|---|---|---|
private | Only self | Maximum privacy |
sponsors | Self + sponsors | Accountability focus |
friends | Self + sponsors + friends | Peer support |
community | All app users | Public milestone celebrations |
HALT Check-In Data:
interface DailyCheckIn {
date: string;
mood: 1 | 2 | 3 | 4 | 5; // 1=worst, 5=best
halt: {
hungry: boolean;
angry: boolean;
lonely: boolean;
tired: boolean;
};
gratitude?: string;
notes?: string;
}
Components:
ShareCheckIn - Select sponsors to share withSobrietyVisibility - Privacy level pickerSee:
references/accountability.mdfor full implementation
Content moderation and user blocking for safe communities.
Moderation Categories:
| Category | Description | Action |
|---|---|---|
crisis | Suicidal ideation, self-harm | Show resources, don't block |
sourcing | Drug seeking, dealing | Block + flag for review |
harassment | Personal attacks, threats | Block + flag for review |
spam | Promotional content | Block |
explicit | Sexual/graphic content | Block |
Blocking Behavior:
RLS Policy Pattern:
-- Hide content from blocked users
CREATE POLICY "Hide messages from blocked users" ON messages
FOR SELECT USING (
NOT EXISTS (
SELECT 1 FROM friendships
WHERE status = 'blocked'
AND (
(requester_id = auth.uid() AND addressee_id = sender_id)
OR (addressee_id = auth.uid() AND requester_id = sender_id)
)
)
);
Hooks provided:
useContentModeration() - Check content against moderation APIuseBlocking() - Block/unblock users, check block statusSee:
references/moderation.mdfor full implementation
| Feature | Privacy Default | Who Can See |
|---|---|---|
| Profile | Friends only | Configurable |
| Sobriety date | Hidden | Configurable |
| Sponsor relationship | Private | Only the two parties |
| Group membership | Group members | Configurable per group |
| Messages | Participants only | Never public |
| Check-ins | Private | Opt-in sharing |
See supabase-admin/references/social-schema.md for complete Supabase schema including:
Detailed implementations in /references/:
| File | Contents |
|---|---|
sponsor-sponsee.md | useSponsorInvite hook, invite UI components, SponsorDashboard |
groups.md | useMeetingGroup hook, QuickMeetingGroup component |
friendships.md | useFriendships hook with real-time, friend request UI |
messaging.md | useMessages hook, MessageInput with crisis detection |
accountability.md | ShareCheckIn, SobrietyVisibility components |
moderation.md | useContentModeration, useBlocking hooks, RLS policies |