Some_claude_skills recovery-social-features
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
git clone https://github.com/curiositech/some_claude_skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/curiositech/some_claude_skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.claude/skills/recovery-social-features" ~/.claude/skills/erichowens-some-claude-skills-recovery-social-features && rm -rf "$T"
.claude/skills/recovery-social-features/SKILL.mdRecovery-Focused Social Features
Build privacy-first social features for addiction recovery apps. These patterns prioritize anonymity, safety, and the unique relationship structures in recovery communities.
When to Use
✅ USE this skill for:
- Sponsor/sponsee relationship systems
- Recovery-focused group features (meeting groups, accountability circles)
- Privacy-first friend connections with mutual consent
- Safe messaging between recovery peers
- Anonymity-preserving profile systems
❌ DO NOT use for:
- General social media patterns → use standard social feature docs
- Dating or romantic connection features → not appropriate for recovery context
- Public-facing profiles → recovery apps should default to privacy
- Content recommendation algorithms → use
for content safetyrecovery-community-moderator
Core Principles
Privacy by Default
Recovery 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, };
Anonymity Support
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 }
Feature Overview
Sponsor/Sponsee Relationships
The sponsor relationship is hierarchical and private. Only the two parties should know about it.
Key concepts:
- Invite-based connection (sponsor generates code, sponsee accepts)
- Time-limited invite codes (24h expiration)
- Private by design - no public visibility
- One sponsor per program, unlimited sponsees
Hooks provided:
- Generate and accept invite codesuseSponsorInvite()
- List sponsors and sponseesuseSponsorRelationships()
Components:
- Sponsor creates shareable codeGenerateSponsorInvite
- Sponsee enters code to connectAcceptSponsorInvite
- View all sponsor/sponsee relationshipsSponsorDashboard
See:
for full implementationreferences/sponsor-sponsee.md
Meeting-Based Groups
Groups that form organically around meetings. Ephemeral by default but can be made permanent.
Key concepts:
- Tied to specific meetings or standalone
- Ephemeral groups auto-delete after 24 hours
- Visibility options: public, private, invite-only
- Member limits prevent overcrowding
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 |
|---|---|---|
| Anyone | Anyone |
| Members only | Invite only |
| Members only | Has invite code |
Hooks provided:
- Create, join, leave groupsuseMeetingGroup()
Components:
- One-tap group creation at meetingsQuickMeetingGroup
See:
for full implementationreferences/groups.md
Friend Connections
Peer-to-peer connections without hierarchy. Mutual consent required.
Key concepts:
- Request/accept flow (no auto-follows)
- Real-time updates via Supabase subscriptions
- Blocking supported (one-way, discreet)
- Status: pending, accepted, blocked
Hooks provided:
- Full friendship management with real-time syncuseFriendships()
Components:
- Context-aware add/pending/friends statesFriendRequestButton
- Accept/decline UIPendingFriendRequests
See:
for full implementationreferences/friendships.md
Safe Messaging
Recovery-appropriate messaging with crisis detection and safety features.
Key concepts:
- Real-time message delivery via Supabase
- Crisis keyword detection (non-blocking, shows resources)
- Soft-delete (messages hidden, not destroyed)
- Privacy-first (no read receipts by default)
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:
- Non-blocking - Crisis prompts suggest resources, don't block messages
- Privacy-first - Don't log or report crisis keywords automatically
- Helpful tone - Gentle, non-judgmental language
- Direct resources - Link to crisis page, not external sites
- Offline capable - Cache crisis resources for offline access
Hooks provided:
- Real-time message thread with Supabase subscriptionsuseMessages()
Components:
- Input with crisis detection overlayMessageInput
See:
for full implementationreferences/messaging.md
Accountability Features
Sharing recovery progress with trusted connections.
Check-In Sharing:
- Share daily check-ins with selected sponsors
- HALT tracking (Hungry, Angry, Lonely, Tired)
- Mood and gratitude logging
Sobriety Visibility Settings:
| Level | Who Can See | Use Case |
|---|---|---|
| Only self | Maximum privacy |
| Self + sponsors | Accountability focus |
| Self + sponsors + friends | Peer support |
| 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:
- Select sponsors to share withShareCheckIn
- Privacy level pickerSobrietyVisibility
See:
for full implementationreferences/accountability.md
Safety & Moderation
Content moderation and user blocking for safe communities.
Moderation Categories:
| Category | Description | Action |
|---|---|---|
| Suicidal ideation, self-harm | Show resources, don't block |
| Drug seeking, dealing | Block + flag for review |
| Personal attacks, threats | Block + flag for review |
| Promotional content | Block |
| Sexual/graphic content | Block |
Blocking Behavior:
- Blocked user cannot send messages
- Blocked user cannot see blocker's profile
- Blocked user cannot see blocker in groups
- Existing messages are hidden (not deleted)
- Blocking is one-way (blocked user doesn't know)
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:
- Check content against moderation APIuseContentModeration()
- Block/unblock users, check block statususeBlocking()
See:
for full implementationreferences/moderation.md
Quick Reference
| 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 |
Database Schema
See
supabase-admin/references/social-schema.md for complete Supabase schema including:
- Friendships table with RLS
- Sponsorships with invite codes
- Groups and group members
- Conversations and messages
- Real-time subscription patterns
References
Detailed implementations in
/references/:
| File | Contents |
|---|---|
| useSponsorInvite hook, invite UI components, SponsorDashboard |
| useMeetingGroup hook, QuickMeetingGroup component |
| useFriendships hook with real-time, friend request UI |
| useMessages hook, MessageInput with crisis detection |
| ShareCheckIn, SobrietyVisibility components |
| useContentModeration, useBlocking hooks, RLS policies |