Tag: open source

  • the art of the block: building an atproto tool for gut-checking your next block

    the art of the block: building an atproto tool for gut-checking your next block

    A lightweight, client-side ATProto browser tool for Bluesky that lets you gut-check target accounts against your mutual followers and explore a moot… Read more →

    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.

    Modern flat vector illustration showing bsky-mutual-blocks: gut-checking target accounts against mutual followers and ranking the most-blocked mutuals among your moots on ATProto.
    bsky-mutual-blocks visualizes which mutual followers block a target account and ranks which moots have the most blocks from other moots.

    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.

    Flat vector graphic showing ATProto public repository traversal for checking which mutual followers block a target account versus legacy platform data silos.
    Public signed records in ATProto repositories allow client-side set intersection to reveal which mutuals block a given account.

    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.

    Architecture diagram showing browser OAuth flow, batched ATProto graph traversal, target gut-checking, and moot block leaderboard calculation.
    Client-side architecture of bsky-mutual-blocks illustrating pure browser OAuth, batched block crawling, and the dual analysis pipeline.

    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.