Software
Bluesky Mutuals Block Checker.
A closer look at a decentralized social graph.
A view into the social graph.
The Bluesky Mutuals Block Checker analyzes mutual follow connections and block relationships through the AT Protocol. The application runs in the browser; this page is its technical overview.
How it works
Resolve
Resolve a handle and initialize a session.
Intersect
Fetch followers and follows; find mutual DIDs.
Audit
Query relationships in batches with throttling.
Explore
Review incoming, outgoing and reciprocal blocks; export CSV or JSON.
Architecture & boundaries
React 18, TypeScript and Vite provide the interface. The AT Protocol SDK communicates directly with Bluesky endpoints. Cloudflare Pages hosts the static application.
The existing project overview describes client-side processing and no backend credential retention. These are documentation claims; the application’s current security behavior has not been independently audited in this design study.
API surface
app.bsky.graph.getFollows
app.bsky.graph.getFollowers
app.bsky.graph.getRelationships
app.bsky.actor.getProfile
Features
Mutual follow isolation · Block relationship auditing · Top blocker scanning · Batched requests and backoff · CSV / JSON export
Reference notes & original examples
This route documents a separate application. No account session or social-graph request is started by this overview. Its architecture describes the public source project; the application’s current security behavior has not been independently audited here.
Technical reading and source.
The original source excerpt computes mutual accounts from paginated follow and follower collections. The complete application also describes relationship auditing, rate limiting and export. Use its actual interface for those features; this page does not contain an unrendered account form or export result.
import { BskyAgent } from '@atproto/api' ; // 1. Compute Mutual Accounts from Follow & Follower collections export async function getMutuals (agent: BskyAgent, actorDid: string ) { const follows = await fetchAllFollows (agent, actorDid); const followers = await fetchAllFollowers (agent, actorDid); const followerDidSet = new Set (followers.map(f => f.did)); return follows.filter(f => followerDidSet.has(f.did)); } // 2. Batch-Query Relationship Statuses to detect block flags export async function auditRelationships (agent: BskyAgent, mutualDids: string []) { const BATCH_SIZE = 30 ; const results = []; for ( let i = 0 ; i < mutualDids.length; i += BATCH_SIZE) { const batch = mutualDids.slice(i, i + BATCH_SIZE); const res = await agent.app.bsky.graph.getRelationships({ actor: agent.session?.did!, others: batch }); results.push(...res.data.relationships); } return results; }
Launch the application or inspect its public source. The process overview explains the stages without starting an external session.
