Frens System โ Implementation Summary โ
Date: January 9, 2026
Status: โ
Design Phase Complete (Frontend Scaffold)
What Was Built โ
A complete privacy-first reconnection system that allows users to save connections from in-person meetings while maintaining Lantern's core anonymity and privacy principles.
Core Innovation โ
Venue-Bound Broadcasting Model
Unlike traditional social apps where you track other people, Lantern inverts the model:
Traditional: "Let me see where my friends are"
Lantern: "Let my friends see where I am (at specific venues I choose)"Key Difference: You broadcast TO people, not track them. Each venue is a separate, intentional choice.
Files Created โ
Documentation โ
- docs/features/frens/FRENS_SYSTEM.md - Complete system documentation (400+ lines)
- docs/features/frens/FRENS_QUICK_REF.md - Quick reference guide
Components โ
- src/components/SaveConnectionPrompt.jsx - Modal to save connections after chatting
- src/components/ManageVenuesModal.jsx - Manage broadcast venues
Screens โ
- src/screens/frens/FrensList.jsx - Main frens list with filters and search
- src/screens/frens/FrenProfile.jsx - Individual fren detailed view
Storybook Stories โ
- src/components/SaveConnectionPrompt.stories.jsx
- src/components/ManageVenuesModal.stories.jsx
- src/screens/frens/FrensList.stories.jsx
- src/screens/frens/FrenProfile.stories.jsx
Routes โ
- Updated src/App.jsx to include:
#/frens- Frens list#/frens/:id- Individual fren profile
How It Works โ
The User Flow โ
1. You meet someone at Coffee House
โ
2. Accept their wave โ Chat
โ
3. Tap "Save Connection"
โ
4. You're now broadcasting to them at Coffee House
โ They can see YOUR lantern when you're at Coffee House
โ You can't see theirs (unless they save you back)
โ
5. If they save you back:
โ ๐ Mutual connection notification
โ Both see each other at shared venues
โ
6. Later, you both show up at The Speakeasy
โ Option to add as broadcast venue
โ Each venue is a separate choicePrivacy Model โ
| State | You See Them | They See You |
|---|---|---|
| Neither saved | โ | โ |
| You saved them | โ | โ (at broadcast venues) |
| They saved you | โ (at broadcast venues) | โ |
| Mutual save | โ (at shared venues) | โ (at shared venues) |
Key Features Implemented โ
1. SaveConnectionPrompt โ
- Clear explanation of venue-bound broadcasting
- Visual confirmation of what they're agreeing to
- Success state with celebration
- Privacy-first messaging
2. FrensList โ
- Filters: All, Lit (active), Mutual
- Search: Filter by lantern name
- Real-time status: Lit indicator with pulse animation
- Lit banner: "X frens have lit lanterns" priority section
- Empty state: Educational onboarding
3. FrenProfile โ
- Current status: Lit/not lit with venue
- Interests: Visual tags
- Connection info: Where/when you met
- Venue broadcasting:
- Who you broadcast to (๐ก)
- Who broadcasts to you (๐)
- Shared venues highlight (โจ)
- Actions: Wave, manage venues, remove connection
- Privacy notice: Explanation of how it works
4. ManageVenuesModal โ
- Checkbox list: Toggle venues on/off
- Mutual indicators: Show which venues are mutually broadcast
- Explanatory text: How broadcasting works
- Save state: Only enable save if changes made
- Privacy reminder: Can change anytime
Design Decisions โ
Why Venue-Bound Broadcasting? โ
Problem with traditional location tracking:
- Reveals patterns (every Tuesday at gym)
- Enables stalking
- Creepy factor
Solution:
- Only see someone at venues you BOTH chose
- Each venue is intentional
- Can't build routines or patterns
- Natural privacy boundaries
Why Asymmetric Visibility? โ
You save someone = You broadcast to them
- Like leaving a standing invitation
- "If you want to find me again, here's my signal"
- NOT "Let me track where you are"
- Consent flows with the action
Why No Persistent Chat? โ
Forces real-world connection:
- Chat only when both at venues
- 2-hour post-meetup window for logistics
- Prevents "pen-pal" syndrome
- Beacon Invites for coordination
What's Next โ
Phase 2: Firebase Integration โ
- [ ] Firestore
connectionscollection schema - [ ] Real-time listeners for lit lanterns
- [ ] Cloud Functions for mutual detection
- [ ] Notification system (mutual save, fren lit)
- [ ] Connection CRUD operations
Phase 3: Real-Time Features โ
- [ ] Live updates when frens light lanterns
- [ ] Priority wave queue for frens
- [ ] Venue expansion prompts
- [ ] Connection removal handling
Phase 4: Beacon Invites โ
- [ ] "I'll be at X venue on Y date" invites
- [ ] One-way coordination (no chat)
- [ ] Calendar integration
- [ ] Reminder system
Phase 5: Polish & Analytics โ
- [ ] Track save rates
- [ ] Monitor venue expansion patterns
- [ ] A/B test messaging
- [ ] User feedback integration
- [ ] Performance optimization
Testing in Storybook โ
bash
npm run storybookNavigate to:
Frens/SaveConnectionPrompt- Save modal variationsFrens/FrensList- List views and filtersFrens/FrenProfile- Profile states (mutual, one-way, lit, not lit)Frens/ManageVenuesModal- Venue management
Testing in App โ
bash
npm run devNavigate to:
http://localhost:5173/#/frens- Frens listhttp://localhost:5173/#/frens/1- Fren profile (mock data)
Data Model (Preview) โ
javascript
// Firestore: connections/{connectionId}
{
connectionId: "abc123",
user1Id: "user123",
user2Id: "user456",
// Venue-specific broadcasting
user1Broadcasts: [
{ venueId: "coffee-house", venueName: "Coffee House", addedDate: "2026-01-09" }
],
user2Broadcasts: [],
// Metadata
metAt: "Coffee House",
metDate: "2026-01-09",
isMutual: false,
// Cached profile data
user1LanternName: "Amber Beacon",
user1Interests: ["Jazz", "Coffee", "Art"]
}Success Metrics (Proposed) โ
Engagement โ
- % of wave acceptances โ saves
- Average frens per user
- Average venues per mutual connection
- Reconnection rate (7+ days later)
Privacy Health โ
- % users with >10 broadcast venues (spam indicator)
- Venue expansion rate
- Connection removal rate
Feature Adoption โ
- % users with โฅ1 fren
- % users with โฅ1 mutual fren
- Frens feature DAU/MAU
Related Documentation โ
- Complete System Docs - Full technical specification
- Quick Reference - At-a-glance guide
- Privacy-First Profiles - Profile system
- Wave-to-Meet - Connection initiation
- Zero-Knowledge Encryption - Security model
Design Highlights โ
Visual Language โ
- Amber glow: Active/lit lanterns
- Purple badges: Mutual connections
- Gray dots: Inactive status
- Pulse animation: Real-time activity
UX Patterns โ
- Progressive disclosure: Only show complexity when needed
- Educational empty states: Guide users to first action
- Celebration moments: Mutual save notification
- Clear affordances: What's clickable is obvious
Accessibility โ
- Color contrast: WCAG AA compliant
- Focus states: Keyboard navigation support
- Screen reader labels: Semantic HTML
- Touch targets: 44px minimum
Status: Ready for Firebase backend integration. All frontend components are functional with mock data and fully documented.