How Custom Feeds Work
┌─────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Client │────>│ AppView │────>│ Feed Generator │
│ (bsky.app) │ │ (bsky.social) │ │ (your server) │
└─────────────┘ └──────────────────┘ └─────────────────┘
Your app Bluesky's backend Your algorithm
What are these components?
- Client - The app you use (bsky.app website, mobile app, etc). Just a UI.
- AppView - Bluesky's backend API server. Stores all posts/profiles and serves them to clients. Think of it as "the Bluesky server."
- Feed Generator - A third-party server (yours!) that decides which posts appear in a custom feed.
The flow:
- You open a custom feed in your client
- Client asks the AppView: "give me posts for this feed"
- AppView asks the Feed Generator: "which posts should I show?"
- Generator returns a list of post IDs (just IDs, not content)
- AppView looks up the full post data and sends it back to your client
Why this design? Feed generators only return post IDs - they never see the actual content you view. The AppView handles authentication, content, and privacy. This lets anyone run an algorithm without needing to store all of Bluesky's data.