There is a very specific gut-check that happens when you come across a chaotic account or bad-faith actor on your timeline. Before hitting the block button, you almost instinctively wonder: is it just me, or have my mutuals already blocked this person?
Naturally, as someone who spends entirely too much time thinking about social graph mechanics and relational data structures, I wanted a clean, reliable way to answer that question. I wanted to see which of my mutual followers (“moots”) are blocking a specific target account—and discover the broader moderation consensus across my network. To make that happen, I built a small tool.
Enter bsky-mutual-blocks: a lightweight, client-side browser app built on Bluesky and ATProto that lets you gut-check target accounts against your mutual follower network and explore a live moot block leaderboard.
the beauty of open protocols (and why this works)
On traditional siloed platforms, analyzing moderation consensus across your social circle is essentially impossible. Data is locked behind proprietary servers, rate limits are punitive, and moderation actions are treated like state secrets.
Bluesky and the AT Protocol completely change the paradigm. Because user repositories on ATProto are publicly discoverable collections of structured, signed data—including app.bsky.graph.block and follow records—you don’t need privileged backend access to inspect public network topology.
When you want to gut-check a target account, the client identifies your mutual followers (bidirectional follows) and crawls their public block records. If multiple people in your trusted circle have already created signed block records pointing at that target’s DID, that overlap is revealed through transparent, client-side set intersection.
how it’s built & what it actually does
I designed the app to be fast, privacy-preserving, zero-maintenance, and centered around two primary workflows:
1. target gut-check
Search any Bluesky handle or DID to see which of your mutual followers are currently blocking that account. It provides instant context before you block, follow, or reply, allowing you to leverage the collective moderation wisdom of your trusted network.
2. moot block leaderboard
Beyond individual lookups, the client can analyze your entire mutual graph to calculate which accounts hold the highest block counts across your moots, ranking network-wide block consensus in real-time.
pure browser OAuth (@atproto/oauth-client-browser)
Nobody should have to hand over app passwords or account credentials to third-party tools. Using ATProto’s official browser OAuth flow with public client metadata, authentication happens directly against your own PDS (Personal Data Server). The session token lives solely in your browser memory and is discarded when you disconnect.
Vite + Cloudflare Pages architecture
The entire project is built with TypeScript and bundled with Vite, deployed as a static application on Cloudflare Pages (wrangler.jsonc). There is no backend server, no intermediary proxy, and no central database storing your social connections.
key technical takeaways
PDS Federation & DID Resolution: Translating user handles into persistent DIDs (via plc.directory or HTTPS DNS) and querying decentralized repositories requires robust fallback handling for custom domains, federated PDS hosts, and deleted accounts.
Concurrent Batching & Rate Limits: Traversing block records across dozens or hundreds of mutual followers sequentially in the browser would quickly trigger AppView rate limits. Chunking requests into controlled concurrent batches keeps traversal fast while avoiding 429 throttling.
Client-Side Privacy by Default: Because all graph traversal and set comparisons execute locally in the user’s browser, there is zero risk of logging, tracking, or leaking who you search or who your mutuals block.
wrap-up
Building on ATProto highlights what makes open social protocols exciting: open schemas, verifiable user data, and the ability to build lightweight, single-purpose tools that empower users to understand their network dynamics on their own terms.
Check out the live tool at bsky-mutual-blocks.pages.dev, or inspect the open-source codebase on GitHub: schwegler/bsky-mutual-blocks.



leave a reply