# 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 `getPostView` hydrates the main post but doesn't recursively hydrate nested `app.bsky.embed.record` embeds (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 the `viewer` field (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.