Feed generation
FetchFeedUseCase reads the feed schema. It does not join social.friendships at request time. Friend relationship changes arrive as friend-request-accepted and are applied by FriendRequestAcceptedInboxHandler. User names come from auth user streams into a local cache (UserProfileCache) with a TTL.
A post write (CreatePostUseCase) commits the post, audience, and media references, then outbox events for tags, mentions, and friend-photo. Comments and reaction milestones emit their own types. Payment evidence on a post is a feed use case that also notifies through feed.payment-evidence-* and can call expense internally.
Streaks are derived state: streak_recovery_state, user_streak_leaderboard, user_timezones. StreakLeaderboardJob and StreakReminderJob maintain them. Reminders become feed.streak-reminder and then a notification. The system avatar is used for those automated reminders; a person-triggered event uses that person's avatar. The catalog of copy and deep links is docs/NOTIFICATIONS.md in the meta-repo.
Startup (FetchStartupDataUseCase) and app-release admin routes live in feed so clients can boot with one call. That is a pragmatic bundle, not a new bounded context. Keep release metadata in app_releases rather than spreading it into auth.
Public preview GET /v1/public/posts/{postId} is what the website share function uses for Open Graph. It must stay free of private fields.