Summary
The upstream lexicon now ships a full chat.bsky.group.* namespace (group lifecycle, membership, join links, join requests) plus a chat.bsky.embed.joinLink embed object. None of these are reflected in ATProtoKit, so group conversation management is unreachable through the typed pipeline.
Pain points
The entire group surface (lifecycle, membership, join links, join requests, and the messageInput.embed join-link) has to be hand-built on raw XRPC, re-implementing the api.bsky.chat routing and auth plumbing that ATProtoBlueskyChat already handles for every other chat call.
Considered Alternatives
Raw XRPC for the entire group surface — loses typed pipeline, isRelatedToBskyChat host routing, and forces every consumer to repeat the same auth plumbing.
Is this a breaking change?
No
Library Examples
N/A
Additional Context
Missing lexicons
| Lexicon |
Suggested wrapper |
chat.bsky.embed.joinLink |
ChatBskyLexicon.Embed.JoinLink embed object, selectable in the sendMessage messageInput.embed union |
chat.bsky.group.addMembers |
addMembers(to:memberDIDs:) |
chat.bsky.group.approveJoinRequest |
approveJoinRequest(for:requesterDID:) |
chat.bsky.group.createGroup |
createGroup(name:memberDIDs:memberLimit:) |
chat.bsky.group.createJoinLink |
createJoinLink(for:) |
chat.bsky.group.defs |
types only |
chat.bsky.group.disableJoinLink |
disableJoinLink(for:) |
chat.bsky.group.editGroup |
editGroup(by:name:) |
chat.bsky.group.editJoinLink |
editJoinLink(for:expiresAt:) |
chat.bsky.group.enableJoinLink |
enableJoinLink(for:) |
chat.bsky.group.getJoinLinkPreviews |
getJoinLinkPreviews(for:) |
chat.bsky.group.listJoinRequests |
listJoinRequests(for:limit:cursor:) |
chat.bsky.group.listMutualGroups |
listMutualGroups(with:limit:cursor:) |
chat.bsky.group.rejectJoinRequest |
rejectJoinRequest(for:requesterDID:) |
chat.bsky.group.removeMembers |
removeMembers(from:memberDIDs:) |
chat.bsky.group.requestJoin |
requestJoin(by:) |
chat.bsky.group.updateJoinRequestsRead |
updateJoinRequestsRead(for:) |
chat.bsky.group.withdrawJoinRequest |
withdrawJoinRequest(by:) |
Wrappers follow the existing ATProtoBlueskyChat convention (method name mirrors the lexicon's final segment, no artificial Group prefix — matching getConversation, listConversations). All sit on api.bsky.chat and require isRelatedToBskyChat: true routing, and the group namespace maps to ChatBskyLexicon.Group.
Cross-reference
References
Summary
The upstream lexicon now ships a full
chat.bsky.group.*namespace (group lifecycle, membership, join links, join requests) plus achat.bsky.embed.joinLinkembed object. None of these are reflected in ATProtoKit, so group conversation management is unreachable through the typed pipeline.Pain points
The entire group surface (lifecycle, membership, join links, join requests, and the
messageInput.embedjoin-link) has to be hand-built on raw XRPC, re-implementing theapi.bsky.chatrouting and auth plumbing thatATProtoBlueskyChatalready handles for every other chat call.Considered Alternatives
Raw XRPC for the entire group surface — loses typed pipeline,
isRelatedToBskyChathost routing, and forces every consumer to repeat the same auth plumbing.Is this a breaking change?
No
Library Examples
N/A
Additional Context
Missing lexicons
chat.bsky.embed.joinLinkChatBskyLexicon.Embed.JoinLinkembed object, selectable in thesendMessagemessageInput.embedunionchat.bsky.group.addMembersaddMembers(to:memberDIDs:)chat.bsky.group.approveJoinRequestapproveJoinRequest(for:requesterDID:)chat.bsky.group.createGroupcreateGroup(name:memberDIDs:memberLimit:)chat.bsky.group.createJoinLinkcreateJoinLink(for:)chat.bsky.group.defschat.bsky.group.disableJoinLinkdisableJoinLink(for:)chat.bsky.group.editGroupeditGroup(by:name:)chat.bsky.group.editJoinLinkeditJoinLink(for:expiresAt:)chat.bsky.group.enableJoinLinkenableJoinLink(for:)chat.bsky.group.getJoinLinkPreviewsgetJoinLinkPreviews(for:)chat.bsky.group.listJoinRequestslistJoinRequests(for:limit:cursor:)chat.bsky.group.listMutualGroupslistMutualGroups(with:limit:cursor:)chat.bsky.group.rejectJoinRequestrejectJoinRequest(for:requesterDID:)chat.bsky.group.removeMembersremoveMembers(from:memberDIDs:)chat.bsky.group.requestJoinrequestJoin(by:)chat.bsky.group.updateJoinRequestsReadupdateJoinRequestsRead(for:)chat.bsky.group.withdrawJoinRequestwithdrawJoinRequest(by:)Wrappers follow the existing
ATProtoBlueskyChatconvention (method name mirrors the lexicon's final segment, no artificialGroupprefix — matchinggetConversation,listConversations). All sit onapi.bsky.chatand requireisRelatedToBskyChat: truerouting, and the group namespace maps toChatBskyLexicon.Group.Cross-reference
convoView.kind→#groupConvo) and the 4 convo-level endpoints (getConvoMembers,listConvoRequests,lockConvo,unlockConvo) are tracked in a separate feature request [Feature Request]: Addchat.bsky.convoreply and group conversation support #320.References
chat.bsky.embed.joinLink: https://github.com/bluesky-social/atproto/blob/main/lexicons/chat/bsky/embed/joinLink.jsonSources/ATProtoKit/Models/Lexicons/chat.bsky/Group/(new),Sources/ATProtoKit/APIReference/ChatBskyAPI/(new method files)