Summary
Three independent App View additions are present in upstream but missing from ATProtoKit. Each is a stable, single-endpoint sibling of an already-wrapped surface, so the additions are mechanical follow-ups rather than design decisions.
Pain points
app.bsky.embed.getEmbedExternalView has no typed wrapper in ATProtoKit, so it cannot be called without dropping to raw XRPC.
app.bsky.feed.searchPostsV2 is the v2 successor to searchPosts (already wrapped). Consumers cannot migrate without re-implementing the wrapper from scratch.
app.bsky.graph.getStarterPacksWithMembership is the Starter Pack counterpart to the already-wrapped getListsWithMembership. Profile UIs cannot show "which Starter Packs contain this user" without dropping to raw XRPC.
Considered Alternatives
Raw XRPC per call site — works but each consumer reimplements the same wrapper shape.
Is this a breaking change?
No
Library Examples
N/A
Additional Context
Missing lexicons
| Lexicon |
Suggested wrapper |
app.bsky.embed.getEmbedExternalView |
getEmbedExternalView(url:) |
app.bsky.feed.searchPostsV2 |
searchPostsV2(matching:limit:cursor:...) |
app.bsky.graph.getStarterPacksWithMembership |
getStarterPacksWithMembership(actor:limit:cursor:) |
References
Summary
Three independent App View additions are present in upstream but missing from ATProtoKit. Each is a stable, single-endpoint sibling of an already-wrapped surface, so the additions are mechanical follow-ups rather than design decisions.
Pain points
app.bsky.embed.getEmbedExternalViewhas no typed wrapper in ATProtoKit, so it cannot be called without dropping to raw XRPC.app.bsky.feed.searchPostsV2is the v2 successor tosearchPosts(already wrapped). Consumers cannot migrate without re-implementing the wrapper from scratch.app.bsky.graph.getStarterPacksWithMembershipis the Starter Pack counterpart to the already-wrappedgetListsWithMembership. Profile UIs cannot show "which Starter Packs contain this user" without dropping to raw XRPC.Considered Alternatives
Raw XRPC per call site — works but each consumer reimplements the same wrapper shape.
Is this a breaking change?
No
Library Examples
N/A
Additional Context
Missing lexicons
app.bsky.embed.getEmbedExternalViewgetEmbedExternalView(url:)app.bsky.feed.searchPostsV2searchPostsV2(matching:limit:cursor:...)app.bsky.graph.getStarterPacksWithMembershipgetStarterPacksWithMembership(actor:limit:cursor:)References
getEmbedExternalView: https://github.com/bluesky-social/atproto/blob/main/lexicons/app/bsky/embed/getEmbedExternalView.jsonsearchPostsV2: https://github.com/bluesky-social/atproto/blob/main/lexicons/app/bsky/feed/searchPostsV2.jsongetStarterPacksWithMembership: https://github.com/bluesky-social/atproto/blob/main/lexicons/app/bsky/graph/getStarterPacksWithMembership.json