The Bluesky team added a privacy preserving, opt in "find friends" feature that imports your contacts.
There was an initial "Request for Comments" (RFC) on the technical, privacy preserving options of this design.
The feature is available in the native mobile apps only, I believe, because of how this has to be done securely.
I've pasted in screenshots of the flow below on iOS. If anyone has Android screenshots, please share.
You may see this "new feature pop-up" advertising it when you get the updated app:
This leads you to first verify your phone number.
You'll get a text message you need to paste into a verification screen, and then it will move on with some more information.
I'll include the text from the screenshot here, Bluesky is trying hard to explain this technical, privacy preserving technique.
Bluesky helps friends find each other by creating an encoded digital fingerprint, called a "hash", and then looking for matching hashes.
We never keep plain phone numbers
We delete hashes after matches are made
We only suggest follows if both people consent
You can always opt out and delete your data
We apply the highest privacy standards, and never share or sell your contact information.
(the next text is at the bottom of the screen above a button that says "Find my friends" or "Cancel")
I consent to Bluesky using my contacts for mutual friend discovery and to retain hashed data for matching until l opt out.
This next part is the iOS contact picker. It prompts to either share some contacts or all. I've cropped this screen to just the bottom messaging.
Once imported, it shows a scrollable list of all the contacts, with an invite button next to them.
Oh look, I found myself! OK great, I can test this.
Hitting invite opens a new text message:
It says: "I'm on Bluesky as bmann.ca - come find me! https://bsky.app/download"
I did send it, and found that this probably needs some improvement.
You can see that bmann.ca is now highlighted, and iOS Messages turns it into a clickable http link.... which doesn't go to my bsky profile, but instead to my out of date landing page:
I shared this with Alex, suggesting that bsky.app/profile/bmann.ca would be a better link to include.
Along with another request for Bluesky app user docs so I don't have to do screenshot essays 😜
This is a technically sound implementation, I'll re-link the Dev Blog RFC for those that want to dive into the details.
I have had several other discussions around private set intersection like this for related use cases today. Ping if you have some other thoughts on this.