Are Bluesky DMs Private? Your DM Setting Is Public
Bluesky DMs are private from other users and not private from Bluesky. The messages themselves are the one thing the app keeps out of your public repository — they live on a separate chat service instead of sitting alongside your posts, follows and blocks. They are not end-to-end encrypted, and Bluesky's launch post says the moderation team "may need to open your DMs to investigate broader patterns of abuse."
There's a second answer nobody gives, and it's the one that surprised me. The setting that decides who can message you is public. Not the messages — that part holds up fine. The setting. It ships inside Bluesky's public profile response, and you can read anyone's with no account and no key:
curl "https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor=bsky.app"
→ "associated": { "chat": { "allowIncoming": "none" } }
That's Bluesky's own account, with DMs switched off. And it isn't only readable — any app you've granted chat access to can rewrite it.
What Part of a Bluesky DM Is Actually Public?
The message content isn't; the settings wrapped around it are. Bluesky writes your posts, likes, follows, blocks and list memberships as records into a repository anyone can fetch, uninvited — that's why strangers can enumerate which lists you're on without asking. Chat is deliberately built the other way, and you can see the seam. Fetch the record that governs your DMs and it comes straight off the public API:
com.atproto.repo.getRecord?repo=bsky.app
&collection=chat.bsky.actor.declaration&rkey=self
→ { "$type": "chat.bsky.actor.declaration", "allowIncoming": "none" }
chat.bsky.actor.declaration is a real record, in the repo, filed next to the posts. What it holds is two fields — who may DM you, and who may add you to a group:
| What | Where it lives | Who can read it |
|---|---|---|
| Your DM messages | Bluesky's chat service (api.bsky.chat) |
You, the other person, moderators when a report is filed |
Your DM setting (allowIncoming) |
A record in your public repo | Anyone with a browser |
Your group-invite setting (allowGroupInvites) |
The same record | Anyone with a browser |
| Your posts, follows, blocks, list memberships | Records in your public repo | Anyone — no account needed |
| A group chat's name, owner and member count | Returned with any join link | Anyone holding the link, logged out |
allowIncoming takes three documented values — all, following, none — matching the three radio buttons on the Chat Settings screen. (If you've never opened that screen, often no record exists at all and the app falls back to following. Which means the most common answer on Bluesky is one nobody actually gave.)
One caveat before you go looking at other people's: this is roughly the information the Chat button on a profile already implies, and it has to be readable for other clients to grey that button out correctly. It is not a breach. It's just that the guide most likely to tell you — a widely-shared explainer titled "What Information is Public on Bluesky?" — doesn't mention DM settings, the declaration record, or allowIncoming anywhere in it.
Are Bluesky DMs Encrypted, and Are They Safe to Use?
No end-to-end encryption, and none since launch. Bluesky shipped DMs on May 22, 2024 with the caveat printed right there in the announcement — "This first version of DMs has limited features (no images or encryption yet)" — alongside a promise to "fully support end-to-end encrypted messaging down the line." Two years and change later, the native chat still isn't encrypted end-to-end. Safe enough for arranging a coffee; not the place for anything you'd mind a moderator reading.
What did arrive is stranger and more interesting, and it came from outside. Germ, a messenger from a separate company built on Messaging Layer Security — the IETF's standard for group encryption — launched a standalone iOS app in 2025, and in February 2026 Bluesky began integrating it as an experimental feature reachable from a badge on a profile. Because it's built on the protocol rather than bolted onto the app, you can watch it work from outside, which is what I did. Paul Frazee's repository carries a com.germnetwork.keypackage record with an anchorHello blob in it: public key material, published to the network so someone can open an encrypted conversation with him without both of them being online for a key exchange. (Frazee's repo also holds RPG sprites and a meal generator — he's a protocol developer with 56 collections in there, so treat it as a demo rather than a typical account.)
Which is a neat inversion of everything above. Bluesky's own DMs keep the content off the public network and the settings on it. Germ does the opposite, publishing a key in the open precisely so the content can be sealed.
Can Bluesky See Your DMs?
You, whoever you're messaging, and Bluesky's moderators when a message gets reported. Bluesky frames that last one narrowly — access happens "only when absolutely necessary to keep Bluesky safe," is "extremely limited," and is "tracked internally." I've no reason to doubt any of it. What I can add is the shape of the tooling, since it's published:
- A report pulls the conversation, not the line.
chat.bsky.moderation.getMessageContexttakesbeforeandafterparameters, both defaulting to 5, plus up to ten interleaved system messages per gap. One reported message reaches a moderator with the surrounding exchange attached. - Deleting doesn't delete. The only method for deleting a message is
deleteMessageForSelf, which "marks a message as deleted for the viewer, so they won't see that message in future enumerations." Your copy goes. Theirs doesn't. There is no unsend on Bluesky — and a DM gives you 1,000 characters against a post's 300 in which to say the wrong thing (the full set of limits is its own post). - Blocking is the hard stop. A block cuts DMs both ways for as long as it stands, while muting doesn't touch them at all — the difference is covered in mute versus block.
- Any app with chat access can rewrite your DM setting. Bluesky's chat permission bundle,
chat.bsky.authFullChatClient, lists 39 chat methods and then, at the bottom, create/update/delete on yourchat.bsky.actor.declarationrecord.
It's not a vulnerability — a chat client genuinely needs to write that record to offer you a settings screen. But "read my DMs" and "decide who may DM me" arrive as a single yes.
How Do I Turn Off Bluesky DMs?
Three steps, and the group control is separate from the DM control:
- Open the Chat tab and go to Chat Settings.
- Under "Allow direct messages from", choose No one (the options are Everyone, People I follow, and No one).
- Set "Allow group chat invites from" separately — turning off DMs does not turn off group invites.
Existing threads survive the change: Bluesky's own note on that screen says you "can continue ongoing conversations regardless of which setting you choose." And per the section above, your choice lands in your public profile data either way.
What Do Most People Set Their Bluesky DMs To?
Two samples, because one wouldn't have told me anything. On August 10, 2026 I read the declaration record for 200 accounts posting into Bluesky's Discover feed, and separately for 200 accounts drawn from @bsky.app's followers — the second group being overwhelmingly brand-new signups.
| Active posters (200) | New-signup sample (199 read) | |
|---|---|---|
| No record at all | 36.0% | 89.4% |
| Record present | 64.0% | 10.6% |
| → set to No one | 25.0% | — |
| → set to People I follow | 20.5% | — |
| → set to Everyone | 18.5% | — |
The finding is the first column. Among people who actually post, a quarter have closed their DMs completely — "No one" edges the other two options, though the three-way split is close enough to even that the honest reading is simply that there's no consensus about what DMs on Bluesky are for.
I've left the second column's breakdown blank on purpose, and that blank is the more interesting half of the exercise. I'd assumed a record only exists when a human makes a choice. That's wrong: Bluesky writes one automatically. In the app's signup path, if an account isn't age-assured, restrictChatSettings fires a putRecord setting allowIncoming: 'none' — the helper's own comment describes it as "used when a user isn't age-assured." Sure enough, almost every record-holder in that second sample was created the same day I sampled, with zero posts, set to none. Those aren't decisions; they're onboarding.
Which is exactly why the first column holds up. Its none-setters are overwhelmingly older accounts that predate age assurance, and they include newsrooms — The Verge, NBC News, Mother Jones, the Guardian's US account. Those are editorial policies, not defaults. (Both runs are repeatable: ./scripts/bsky_stats.py dmsettings <handle> 200.)
Are Bluesky Group DMs Private?
Private in that same limited sense: not encrypted, one moderation path, invite-only. Group chats launched on June 11, 2026, and two details in the coverage have since gone stale.
- The size cap has doubled, and there's a receipt. Launch reporting said 50 participants, correctly at the time — the June 10 lexicon capped the member list at
maxLength: 49, plus the owner. A commit on August 3, 2026 replaced that with a note reading "Bluesky currently supports up to 100 total members." If you read 50 somewhere, it's a June number. - Join links leak a little.
chat.bsky.group.defs#joinLinkPreviewViewis documented as a preview "that can be shown in feeds, including to unauthenticated viewers," and the fields it must carry include the group's name, its owner, its member count and its member limit. By the schema's own description, posting an invite link publicly shows logged-out strangers how big your group is and who runs it.
Group chats are also 18-and-over, and media sharing wasn't supported at launch. The invite permission is the second field in that same record, so your answer there is readable from outside too.
Where Does Agent Sky Fit?
Full disclosure, since this post is partly about who holds chat permissions: Agent Sky is one of the apps that does. It sends optional welcome DMs, so it asks for chat scope — and ours is broader than what I described above, because we still use the older transition:generic and transition:chat.bsky scopes, which carry write access to any record type rather than just the chat declaration. If you're auditing what you've connected, audit us on the same terms.
What we do with it is narrow. Welcomes fire only for someone who has just followed you — never a cold message to a person who didn't ask — and before sending, the code asks Bluesky getConvoAvailability and takes the answer as final. If it comes back saying the conversation isn't allowed, that's a permanent failure rather than something to retry: the message is dropped and the person is never contacted. That's this post's allowIncoming field doing its job, and note we never need to read it. We ask, Bluesky answers.
A welcome goes out when it goes out, too — the queue drains across a day instead of in a batch, because an inbox punishes a burst far harder than a follower list does. Sending nothing at all is a supported configuration, and it's the default: welcome messages are off until you write one. Welcomes work the same on the free tier; $9/month is the paid plan, and it doesn't buy a bigger send.
Whatever you do with the rest of this, go and look at your own setting. Chat tab, Chat Settings, top item. Thirty-six percent of active posters have never opened that screen — which means their public answer is one they never chose.
Quick FAQ
Are Bluesky DMs private? Private from other users, not private from Bluesky. Bluesky's own DMs are the one thing the app doesn't write into your public repository — they sit on a separate chat service rather than alongside your posts, follows and blocks, so nobody can read them out of the network the way they can read your follower list. But they are not end-to-end encrypted, and Bluesky's launch announcement says the moderation team "may need to open your DMs to investigate broader patterns of abuse" in rare cases. One piece of your DM setup is fully public, though: the setting controlling who is allowed to message you.
Are Bluesky DMs encrypted? Not end-to-end. Bluesky shipped DMs in May 2024 describing them as having "no images or encryption yet" and promised to "fully support end-to-end encrypted messaging down the line"; two years on, the native chat still isn't encrypted end-to-end. The nearest thing is Germ, a third-party messenger built on the IETF's Messaging Layer Security standard, which Bluesky began integrating in February 2026 as an experimental feature. Germ is a separate company's product rather than a switch inside Bluesky.
Can Bluesky see your DMs?
Yes, in defined circumstances, and the tooling for it is published. Bluesky says moderator access happens "only when absolutely necessary to keep Bluesky safe" and that it is "extremely limited and tracked internally". The protocol shows the shape of it: the moderation endpoint chat.bsky.moderation.getMessageContext fetches a reported message together with the conversation around it, defaulting to five messages either side. Deleting won't undo it — the only method Bluesky offers for deleting a message marks it deleted for you alone, and the other person keeps their copy.
How do I turn off Bluesky DMs? Open the Chat tab, go to Chat Settings, and set "Allow direct messages from" to No one. Group chat invites are a separate control on the same screen. If you have never touched either, the default is People I follow. Two things worth knowing before you choose: whatever you pick is written into your public profile data, so anyone can read your answer without an account, and Bluesky notes that you "can continue ongoing conversations regardless of which setting you choose".