11 KiB
Sojorn Seeding Philosophy
Core Principle: Honest Onboarding
The Problem: New users dropped into an empty platform experience confusion, not connection. 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
- Community guidelines
- Feature updates
- Transparency notes
Tone: Neutral, factual, direct
Example:
"Welcome to Sojorn. This is a friends-first social platform designed for genuine connections. Posts are ranked by authentic engagement—real 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:
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:
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.engagementScore *= (1 - officialPenalty);
}
Cap Per Feed Window:
// 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:
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:
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 authentic engagement 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:
- What % of feed is official content?
- Are official posts still useful?
- Is user content growing?
- 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
isOfficialfield - 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 connection, not emptiness.