sojorn/sojorn_docs/philosophy/SEEDING_PHILOSOPHY.md
Patrick Britton 38653f5854 Sojorn Backend Finalization & Cleanup - Complete Migration from Supabase
##  Phase 1: Critical Feature Completion (Beacon Voting)
- Add VouchBeacon, ReportBeacon, RemoveBeaconVote methods to PostRepository
- Implement beacon voting HTTP handlers with confidence score calculations
- Register new beacon routes: /beacons/:id/vouch, /beacons/:id/report, /beacons/:id/vouch (DELETE)
- Auto-flag beacons at 5+ reports, confidence scoring (0.5 base + 0.1 per vouch)

##  Phase 2: Feed Logic & Post Distribution Integrity
- Verify unified feed logic supports all content types (Standard, Quips, Beacons)
- Ensure proper distribution: Profile Feed + Main/Home Feed for followers
- Beacon Map integration for location-based content
- Video content filtering for Quips feed

##  Phase 3: The Notification System
- Create comprehensive NotificationService with FCM integration
- Add CreateNotification method to NotificationRepository
- Implement smart deep linking: beacon_map, quip_feed, main_feed
- Trigger notifications for beacon interactions and cross-post comments
- Push notification logic with proper content type detection

##  Phase 4: The Great Supabase Purge
- Delete function_proxy.go and remove /functions/:name route
- Remove SupabaseURL, SupabaseKey from config.go
- Remove SupabaseID field from User model
- Clean all Supabase imports and dependencies
- Sanitize codebase of legacy Supabase references

##  Phase 5: Flutter Frontend Integration
- Implement vouchBeacon(), reportBeacon(), removeBeaconVote() in ApiService
- Replace TODO delay in video_comments_sheet.dart with actual publishComment call
- Fix compilation errors (named parameters, orphaned child properties)
- Complete frontend integration with Go API endpoints

##  Additional Improvements
- Fix compilation errors in threaded_comment_widget.dart (orphaned child property)
- Update video_comments_sheet.dart to use proper named parameters
- Comprehensive error handling and validation
- Production-ready notification system with deep linking

##  Migration Status: 100% Complete
- Backend: Fully migrated from Supabase to custom Go/Gin API
- Frontend: Integrated with new Go endpoints
- Notifications: Complete FCM integration with smart routing
- Database: Clean of all Supabase dependencies
- Features: All functionality preserved and enhanced

Ready for VPS deployment and production testing!
2026-01-30 09:24:31 -06:00

463 lines
11 KiB
Markdown

# Sojorn Seeding Philosophy
## Core Principle: Honest Onboarding
**The Problem:**
New users dropped into an empty platform experience confusion, not calm. They don't know what belongs, what tone is expected, or whether anyone else is here.
**Traditional Solution (Rejected):**
- Create fake user personas
- Simulate conversations and arguments
- Inflate engagement metrics
- Hide that content is from the platform itself
**Sojorn Solution (Honest):**
- Create clearly labeled official accounts
- Post authentic, useful content
- Never fake engagement
- Never pretend to be real users
---
## What We Seed
### Official Accounts (3)
All official accounts are:
- Clearly labeled with "SOJORN" badge
- Unable to log in (disabled passwords)
- Restricted to service role posting only
- Transparent in their bios
#### 1. @sojorn
**Purpose:** Platform transparency and announcements
**Content:**
- How Sojorn works
- Calm velocity explanations
- Feature updates
- Transparency notes
**Tone:** Neutral, factual, direct
**Example:**
> "Welcome to Sojorn. This is a text-only social platform designed for calm expression. Posts are ranked by calm velocity—genuine appreciation over time, not outrage or virality."
#### 2. @sojorn_read
**Purpose:** Reading content and prompts
**Content:**
- Public domain poetry excerpts
- Gentle observations about reading
- Literary reflections
- No attribution debates (handled in metadata)
**Tone:** Observational, appreciative
**Example:**
> "Sometimes a book sits on your shelf for years, and then one Tuesday you pick it up and it feels like it was waiting for exactly this moment."
#### 3. @sojorn_write
**Purpose:** Writing prompts and reflections
**Content:**
- Gentle writing invitations
- Observational prompts
- Seasonal/temporal reflections
- No instruction or therapy framing
**Tone:** Invitational, present
**Example:**
> "Write about a small moment that did not need to be shared."
---
## What We Don't Seed
### Never Fake Users
- ❌ Create personas ("Sarah from Portland")
- ❌ Generate profile pictures
- ❌ Simulate follower networks
- ❌ Pretend accounts are real people
### Never Fake Engagement
- ❌ Auto-like posts
- ❌ Generate fake saves
- ❌ Create fake comments
- ❌ Inflate view counts
### Never Fake Conversations
- ❌ Simulate arguments
- ❌ Create fake disagreements
- ❌ Post as if replying to users
- ❌ Generate synthetic dialogue
### Never Hide Origin
- ❌ Bury "official" labels
- ❌ Use vague language ("community team")
- ❌ Suggest content is user-generated
- ❌ Imply accounts are volunteers
---
## Content Guidelines
### Acceptable Themes
**Observational:**
- Weather, light, seasons
- Small routines
- Reading experiences
- Writing reflections
**Reflective:**
- Quiet gratitude
- Neutral observations
- Gentle prompts
- Present-moment awareness
**Educational:**
- How Sojorn works
- Tone detection explanations
- Feature announcements
- Transparency notes
### Unacceptable Themes
**Performative:**
- ❌ Engagement bait ("What do YOU think?")
- ❌ Calls to action ("Share this!")
- ❌ Virality attempts
- ❌ Trending topic chasing
**Instructional:**
- ❌ Self-improvement commands
- ❌ Therapy framing
- ❌ Moral instruction
- ❌ "Should" language
**Divisive:**
- ❌ Politics
- ❌ Religious preaching
- ❌ Persuasion
- ❌ Debate provocation
---
## Temporal Distribution
### Backdating Strategy
**Goal:** Avoid all content appearing on the same day
**Approach:**
- Backdate posts naturally over 14 days
- Spread across categories evenly
- Maintain chronological integrity
- Never future-date content
**Implementation:**
```sql
base_time := NOW() - INTERVAL '14 days';
-- Posts inserted with timestamps from base_time to NOW
-- Example: base_time, base_time + 6 hours, base_time + 1 day, etc.
```
**Why 14 Days:**
- Long enough to feel natural
- Short enough to stay relevant
- Creates scrollable history
- Avoids "ghost town" feeling
### No Artificial Freshness
**We Don't:**
- ❌ Constantly bump old posts
- ❌ Create "trending" illusions
- ❌ Simulate real-time activity
- ❌ Post at fake peak hours
**We Do:**
- ✅ Let old posts age naturally
- ✅ Post new official content occasionally
- ✅ Maintain honest timestamps
- ✅ Accept that some feeds will be quiet
---
## Volume Targets
### Initial Seed (Per Category)
**General Discussion:**
- Platform explanations: 5 posts
- Observations: 10-15 posts
- Writing prompts: 10 posts
- **Total: ~25 posts**
**Quiet Reflections:**
- Poetry excerpts: 8-10 posts
- Reading reflections: 5 posts
- Seasonal observations: 8 posts
- **Total: ~20 posts**
**Gratitude:**
- Gratitude reflections: 5 posts
- Writing prompts: 5 posts
- **Total: ~10 posts**
### Overall Target
**Total Seed Content: ~55 posts**
**Why This Number:**
- Enough to scroll 2-3 minutes
- Not overwhelming
- Models tone diversity
- Leaves room for user content
---
## UI Treatment (Honest Labeling)
### Official Badge
**Design:**
```
[SOJORN] badge in soft blue (AppTheme.info)
- 8px font, uppercase
- 12% opacity background
- Always visible, never hidden
```
**Placement:**
- Next to author name
- In profile header
- On all official posts
**Copy:**
- Just "SOJORN" (no embellishment)
- Not "Verified" (implies endorsement)
- Not "Staff" (implies employees)
- Not "Official" (too formal)
### No Deceptive Language
**Never:**
- ❌ "Recommended for you" (implies algorithm knows you)
- ❌ "Trending" (fake popularity)
- ❌ "Popular" (fake consensus)
- ❌ "You might like" (false personalization)
**Always:**
- ✅ "From Sojorn" (honest origin)
- ✅ [SOJORN badge] (clear labeling)
- ✅ Bio transparency ("Official Sojorn account")
---
## Feed Weighting (Exit Strategy)
### Problem
Official seed content must not dominate forever as user-generated content grows.
### Solution: Gradual Dilution
#### Phase 1: Empty Platform (Week 1)
- Official posts: 100% of feed
- User posts: 0%
- **Weighting:** Equal visibility for official posts
#### Phase 2: Growing Platform (Week 2-4)
- Official posts: 50-80% of feed
- User posts: 20-50%
- **Weighting:** Begin reducing official post ranking
#### Phase 3: Active Platform (Month 2+)
- Official posts: 10-30% of feed
- User posts: 70-90%
- **Weighting:** Official posts ranked lower than user content
#### Phase 4: Mature Platform (Month 6+)
- Official posts: 0-10% of feed
- User posts: 90-100%
- **Weighting:** Official posts archived or heavily downranked
### Implementation
**Ranking Modifier:**
```typescript
if (post.author.is_official) {
// Reduce ranking weight based on platform maturity
const platformAge = daysSinceFirstUserPost();
const officialPenalty = Math.min(platformAge / 30, 0.7); // Max 70% reduction
post.calmVelocity *= (1 - officialPenalty);
}
```
**Cap Per Feed Window:**
```typescript
// Limit official posts in each feed page
const maxOfficialPosts = Math.max(2, Math.floor(pageSize * 0.2)); // 20% or 2, whichever is higher
```
### Optional Archival
**After 6 Months:**
- Move oldest official posts to "archived" status
- Still accessible via direct link
- No longer appear in feeds
- Preserves history without clutter
---
## Engagement Integrity
### Rule: No Synthetic Engagement
**All Metrics Start at Zero:**
```sql
INSERT INTO post_metrics (post_id, like_count, save_count, comment_count, view_count)
VALUES (post_id, 0, 0, 0, 0);
```
**Why:**
- Faking engagement = lying
- Lies erode trust
- Trust is Sojorn's only asset
- Zero is honest
### Comments Disabled
Official accounts **cannot receive comments**:
```sql
CREATE POLICY "Official accounts cannot receive comments"
ON comments
FOR INSERT
WITH CHECK (
NOT EXISTS (
SELECT 1 FROM posts p
JOIN profiles pr ON pr.id = p.author_id
WHERE p.id = post_id AND pr.is_official = true
)
);
```
**Why:**
- Official accounts never reply (not real users)
- Prevents fake dialogue
- No "community manager" persona
- Maintains honesty
---
## Content Examples
### ✅ Good Seed Content
**@sojorn (Transparency):**
> "Your feed has two tabs: Following shows posts from people you follow, chronologically. Sojorn shows posts ranked by calm velocity from everyone. You control which categories you see."
**Why:** Factual, useful, transparent
**@sojorn_read (Observation):**
> "Reading before bed is different than reading in the morning. One settles you down. The other wakes you up in a quiet way."
**Why:** Observational, relatable, no instruction
**@sojorn_write (Invitation):**
> "Write about something ordinary you noticed today."
**Why:** Gentle prompt, no pressure, present tense
### ❌ Bad Seed Content
**Fake Persona:**
> "Hi everyone! I'm Sarah and I just joined Sojorn. What are you all reading?"
**Why:** Deceptive, pretends to be real user
**Engagement Bait:**
> "What's your favorite book? Let me know in the comments!"
**Why:** Solicits performance, implies conversation
**Moral Instruction:**
> "Remember: you should always take time for self-care. Here are 5 ways to practice mindfulness today."
**Why:** Preachy, instructional, "should" language
---
## Monitoring & Adjustment
### Monthly Review
**Check:**
1. What % of feed is official content?
2. Are official posts still useful?
3. Is user content growing?
4. Should we archive old official posts?
### User Feedback
**Listen For:**
- "These posts feel fake" → Review tone
- "Too much Sojorn content" → Increase penalty
- "I don't know what to post" → Add more prompts
- "Official accounts are helpful" → Continue
---
## Summary
### What This Accomplishes
**For New Users:**
- ✅ Never dropped into emptiness
- ✅ Immediately see what tone is expected
- ✅ Have content to interact with
- ✅ Understand "what belongs here"
**For Platform:**
- ✅ Honest onboarding through presence
- ✅ Trust preserved through transparency
- ✅ No deception or fake activity
- ✅ Gradual transition to user content
### The Commitment
**Sojorn will:**
- ✅ Always label official content
- ✅ Never fake users or engagement
- ✅ Reduce official content as platform grows
- ✅ Maintain transparency about seeding
**Sojorn will never:**
- ❌ Create fake personas
- ❌ Inflate metrics
- ❌ Hide content origin
- ❌ Pretend official accounts are users
---
## Implementation Checklist
- [ ] Run `seed_official_accounts.sql` (create @sojorn, @sojorn_read, @sojorn_write)
- [ ] Run `seed_content.sql` (insert ~55 posts backdated over 14 days)
- [ ] Update Profile model with `isOfficial` field
- [ ] Add official badge to PostCard UI
- [ ] Implement feed weighting for official posts
- [ ] Schedule monthly review of official content ratio
- [ ] Plan archival after 6 months
---
**Philosophy:** Seeding is not deception. It is honest hospitality.
**Execution:** Clearly labeled, authentically useful, gradually diluted.
**Result:** New users welcomed into calm, not emptiness.