AppView
The Colibri AppView is responsible for aggregating message data from across the network and providing endpoints for interacting with this data. Any requests to the AppView are meant to be proxied via the user’s PDS, to which the client application makes the requests. When requests are forwarded, the following DID URI should be used to indicate the target:
did:web:api.colibri.social#colibri_appviewImplemented Endpoints
Section titled “Implemented Endpoints”The AppView supports a range of XRPC methods that PDSs can call. All com.atproto endpoints adhere to the original specification. There are also certain social.colibri XRPC endpoints which allow for extended functionality. All of these endpoints are available under the /xrpc/ path.
com.atproto.identity.resolveDid
Section titled “com.atproto.identity.resolveDid”Resolves a DID to a DID document. Does not bi-directionally verify the handle.
com.atproto.identity.resolveHandle
Section titled “com.atproto.identity.resolveHandle”Resolves an atproto handle (hostname) to a DID. Does not necessarily bi-directionally verify against the the DID document.
com.atproto.identity.resolveIdentity
Section titled “com.atproto.identity.resolveIdentity”Resolves an atproto handle (hostname) to a DID. Does not necessarily bi-directionally verify against the the DID document.
com.atproto.repo.getRecord
Section titled “com.atproto.repo.getRecord”Get a single cached record from the AppView.
com.atproto.repo.listRecords
Section titled “com.atproto.repo.listRecords”List a range of cached records in a repository, matching a specific collection.
social.colibri.actor.getData
Section titled “social.colibri.actor.getData”Get the status data and bluesky profile for a Colibri user.
social.colibri.actor.setState
Section titled “social.colibri.actor.setState”Sets the online state for a Colibri user.
social.colibri.actor.listCommunities
Section titled “social.colibri.actor.listCommunities”Lists all communities the Colibri user is a part of (and not blocked from).
social.colibri.sync.subscribeEvents
Section titled “social.colibri.sync.subscribeEvents”Opens a connection with a WebSocket stream that transmits relevant events for the user.
Events
Section titled “Events”The event stream can choose to transmit events to clients who have signed up to receive them. All events follow the same JSON data structure: they have a type (which is the same as the heading below), and an optional data field.
Sent when the AppView receives a heartbeat message from the client. This event carries no data.
community_event
Section titled “community_event”Events of this type are sent to clients when a community has been updated or deleted. If the event is set to delete, only the community’s uri needs to be supplied.
{ event: 'upsert' | 'delete'; uri: string; name: string; description: string; picture: blob; categoryOrder: string[];}member_event
Section titled “member_event”Events of this type are sent to clients when a member has joined or left (or been blocked from) a community. The membership property is an AT-URI to the user’s membership declaration for the community.
{ event: 'join' | 'leave'; community: string; membership: string;}category_event
Section titled “category_event”Events of this type are sent to clients when a category has been created, updated, or deleted. When the event is delete, the name and channelOrder can be omitted.
{ event: 'upsert' | 'delete'; uri: string; community: string; name: string; channelOrder: string[];}channel_event
Section titled “channel_event”Events of this type are sent to clients when a channel has been created, updated, or deleted. When the event is delete, the name, description, and type can be omitted.
{ event: 'upsert' | 'delete' uri: string; community: string; name: string; description: string; type: string;}message_event
Section titled “message_event”Events of this type are sent to clients when a message has been sent, edited, or deleted. When the event is delete, anything but the uri and channel can be omitted.
{ event: 'upsert' | 'delete'; uri: string; channel: string; text: string; facets: facet[]; createdAt: string; indexedAt: string; edited: boolean; parent: string; attachments: blob[];}reaction_event
Section titled “reaction_event”Events of this type are sent to clients when a reaction has been added to or removed from a message.
{ event: 'added' | 'removed'; uri: string; emoji: string; target: string; channel: string;}user_event
Section titled “user_event”Events of this type are sent to clients when a user the client knows about has updated their Bluesky profile or Colibri status.
{ did: string; status?: { emoji?: string; text: string; state: 'online' | 'away' | 'dnd' | 'offline'; }; profile: { displayName?: string; avatar?: blob; banner?: blob; description?: string; handle: string; };}typing_event
Section titled “typing_event”Events of this type are sent to clients when a user is typing in the channel the user is currently viewing. For notes on how to report this to the AppView, see the view message type.
{ event: 'start' | 'stop'; channel: string; did: string;}Messages
Section titled “Messages”The following messages can be sent from the client to the AppView. All messages follow the same JSON data structure: they have a type (which is the same as the heading below), and an optional data field.
heartbeat
Section titled “heartbeat”A generic event that carries no data. It is used to keep the socket connection alive. The AppView will always respond with an ack event.
subscribe
Section titled “subscribe”Clients can send a subscribe message to the AppView, supplying a list of communities for which they wish to receive updates. The AppView handles the rest and infers which users, channels, etc. the client needs to know about.
{ communities: string[];}Clients can send a view message to the AppView to inform it about the channel the user is currently viewing.
{ channel: string;}unsubscribe
Section titled “unsubscribe”Clients can send an unsubscribe message to the AppView, supplying a list of communities, for which they wish to no longer receive events.
{ communities: string[];}activity
Section titled “activity”A message used to prevent clients from having their online status set to “Away” after a certain amount of time. Clients should send this message periodically while the user actively interacts with the app.
voice_join
Section titled “voice_join”Clients must send a voice_join message to the AppView when the user joins a voice channel.
{ channel: string; community: string;}voice_leave
Section titled “voice_leave”Clients must send a voice_leave message to the AppView when the user leaves a voice channel.
{ channel: string; community: string;}social.colibri.community.listBlockedUsers
Section titled “social.colibri.community.listBlockedUsers”Lists all blocked users for a community.
social.colibri.community.listCategories
Section titled “social.colibri.community.listCategories”Lists all categories in a community.
social.colibri.community.listChannels
Section titled “social.colibri.community.listChannels”Lists all channels in a community.
social.colibri.community.listMembers
Section titled “social.colibri.community.listMembers”Lists all members with their roles, status information and Bluesky profiles.
social.colibri.community.blockMessage
Section titled “social.colibri.community.blockMessage”Block a message in a given community.
social.colibri.community.blockUser
Section titled “social.colibri.community.blockUser”Block a user from writing messages in a given community.
social.colibri.community.unblockUser
Section titled “social.colibri.community.unblockUser”Unblock a user from a community, allowing them to write messages there again.
social.colibri.community.createInvitation
Section titled “social.colibri.community.createInvitation”Create an invitation for the specified community.
social.colibri.community.resolveInvitation
Section titled “social.colibri.community.resolveInvitation”Get information about a given invitation code.
social.colibri.community.listInvitations
Section titled “social.colibri.community.listInvitations”List all invitations for the specified community.
social.colibri.community.deleteInvitation
Section titled “social.colibri.community.deleteInvitation”Delete an invitation for the specified community.
social.colibri.channel.listMessages
Section titled “social.colibri.channel.listMessages”Get a paginated message history for the specified channel, newest messages first.
social.colibri.channel.getReadCursor
Section titled “social.colibri.channel.getReadCursor”Get the read cursor for the current user and specified channel.
social.colibri.message.listReactions
Section titled “social.colibri.message.listReactions”Get all reactions for a specified message, grouped by emoji with reactor DIDs.
Humming
Section titled “Humming”The Colibri infrastructure is designed to be easy to self-host. In cases where users prefer to host their own infrastructure, under normal circumstances, data that is not saved on the protocol (like online/offline status, writing presence, etc.) is not able to be transmitted to other users who use a different app view.
The Colibri AppView supports a system called Humming to curcumvent this. Other AppView instances that wish to share off-protocol status data with users on other instances can share them via a Hum, a message sent to another AppView instance’s social.colibri.sync.sendHum endpoint, which can then choose to relay it to its clients via its social.colibri.sync.subscribeEvents WebSocket stream. Additionally, AppViews that wish to forward these events to other AppViews can expose a social.colibri.sync.subscribeHums endpoint, to which other AppViews can subscribe.
social.colibri.sync.sendHum
Section titled “social.colibri.sync.sendHum”Inform another AppView of an event that has occured.
social.colibri.sync.subscribeHums
Section titled “social.colibri.sync.subscribeHums”For transmitted event types, please refer to social.colibri.sync.subscribeEvents.