slop slop slop sahuuuurrr
Missing AppView Endpoints (Final Deep Comparison)#
This document provides a final audit of our custom Hydrant-based AppView compared to the official @atproto/bsky reference implementation.
1. Native / Fully Local Implementations#
These are features served entirely from our local Hydrant index or fjall private database.
- Actor:
getProfile,getProfiles,getPreferences,putPreferences. - Feed:
getAuthorFeed,getTimeline,getPostThread,getPosts,getQuotes,getActorLikes,getLikes,getRepostedBy,getFeed(Hydrated via external generators). - Graph:
getFollows,getFollowers,getKnownFollowers,getRelationships,getBlocks,getMutes,muteActor,unmuteActor,getList,getLists. - Notification:
listNotifications,getUnreadCount,updateSeen. - Private State:
getBookmarks,createBookmark,deleteBookmark,getDrafts,createDraft,updateDraft,deleteDraft.
2. Missing Endpoints (Currently Proxied)#
Search & Discovery (The biggest gap)#
app.bsky.actor.searchActors/searchActorsTypeahead: Requires a full-text search engine.app.bsky.feed.searchPosts: Requires a full-text search engine.app.bsky.actor.getSuggestions: Algorithmic "Who to follow".app.bsky.feed.getSuggestedFeeds: Discovery of new custom feeds.app.bsky.graph.searchStarterPacks: Search for starter packs.app.bsky.unspecced.getTrends/getTrendingTopics: Real-time analysis of global post volume.
Moderation & Labeling#
app.bsky.labeler.getServices: Fetching views of moderation services.app.bsky.graph.getListBlocks/getListMutes: Mutes/Blocks based on curated lists.app.bsky.graph.muteActorList/muteThread/ etc.: Bulk or contextual muting.
Starter Packs & Misc Graph#
app.bsky.graph.getStarterPack/getStarterPacks/getActorStarterPacks: Curated onboarding packs.app.bsky.graph.getListsWithMembership: Finding which lists a user belongs to.
Push Notifications#
app.bsky.notification.registerPush/unregisterPush: Requires integration with FCM/APNs.
3. Reference Implementation Details Missing#
Even in our "implemented" endpoints, we lack some deep "AppView-only" hydration features present in the reference TypeScript code:
- Embed Record Hydration: Our
getPostViewhydrates the main post but doesn't recursively hydrate nestedapp.bsky.embed.recordembeds (showing a quote-post's content inside the main post view). The client currently has to fetch those separately or they show as empty. - Labels: We do not currently fetch or apply labels from Ozone or other labelers to the returned views.
- Viewer State: Our views (like
postView) don't always include theviewerfield (e.g.,viewer.like,viewer.repost) which tells the client if you have already liked that post. This requires checking your repo's records for every post returned.
4. Excluded by Design#
- Age Assurance: Always returns "assured".
- Contacts: Not implemented.
Summary Status#
The AppView is ~85% complete for a single-user power-user experience. It handles all daily interactions (reading the timeline, checking notifications, viewing threads, managing settings) natively. The remaining ~15% consists of "Global" features like Search and Discovery which typically require massive infrastructure beyond a local repository index.