Digging into Bluesky DMs

May 23, 2024

Yesterday, the Bluesky team announced that direct messages (DMs) were now available in first-party clients. I thought I’d dig into this to see if I could figure out how this worked.

I first found a mention of this feature coming on the roadmap. It’s under the headline “Basic “Off-Protocol” Direct Messages”. Based on the description here, it looks like this is a centralized side-channel outside of the protocol. I assume this is separate from “Non-Public Content” mentioned in the atproto docs, and is more of a stopgap.

I then looked to see if I could find any technical details about the implementation. I assumed DMs are handled outside of the PDSs, but I decided to look just in case. The most recent commits to the repo just bumped API and PDS version numbers. I then found mention of a “convo” message type in the client source, and then a line that referenced This helped me find some entries in the API docs.

Now it’s clear how one could access DM content… but I was hoping there’d be more detail on how the system works from a backend perspective. I’m assuming there are servers separate from the ones handling the atproto work that are just for DMs? Maybe the team doesn’t want to talk about/document these because it’s a stopgap? Perhaps they just haven’t gotten around to it? Maybe I’ve just completely missed it somewhere?

I also decided to look and see if anyone else was using this. There are a handful of third-party clients, and Klearsky is in the process of integrating DMs. I didn’t learn much more from this, but it was interesting to see the work started on May 19th — three days before the feature was officially released. It turns out that the API endpoints were added to the docs on May 13th. It also turns out that the feature was found by users on a staging server ahead of the release date as well.

So, not much detail on how this works behind the scenes. At least it’s nice to know that the API endpoints exist and are documented.