Tag: atproto

  • 2
    god forbid a bitch own a weird little website

    god forbid a bitch own a weird little website

    A personal site can still be a garden, junk drawer, clubhouse, and tiny act of resistance against the feed. Read more →

    “god forbid a bitch name his blog whimsically”

    god forbid a bitch name his blog whimsically

    — schweg, (@schwegler.lol) 2026-08-29T21:00:42.603Z

    i posted that as a joke, but it is also the entire operating theory behind tacobout.online

    a personal website should have a name you have to explain. it should contain at least three subjects a growth consultant would beg you to split into separate brands. it should occasionally look like somebody opened a junk drawer and installed an rss feed in it

    the vertical is a lie

    platforms want a clean answer to “what do you post about?” because clean answers are easier to package. tech account. politics account. reality tv account. music account. gay little pop-culture account. choose a lane, feed the recommendation engine, become legible to the machine

    but a person is not a vertical. a person is twenty-seven browser tabs, one of them playing audio from somewhere, three of them technically research, and at least one open because the headline made you mad six hours ago

    in the space of two days this site went from Big Brother strategy pathology to an ATProto moderation tool, Geese marketing discourse, krishnacore, and an Avengers multiverse collision. that is not editorial confusion. that is what a brain looks like when nobody has forced it into a content calendar

    Close photograph of a pale pink hibiscus bloom and unopened bud against green leaves and a brick wall.
    The camera roll and the personal blog share a basic instinct: save the small, specific thing before the feed swallows it.

    the camera roll and the blog are cousins

    this flower has been sitting in my IMG library for years. it does not have a discourse attached to it. it does not need a hot take, an affiliate link, or a call to action. i liked it enough to save it

    that is still one of the best reasons to put anything on the internet

    the camera roll says: this happened in front of me and i wanted another look. the personal blog says: this passed through my head and i wanted somewhere it would not immediately disappear. both are ways of refusing the feed’s insistence that whatever is newest is whatever matters

    ownership is not the same thing as audience

    Bluesky and Mastodon are better than most platforms at letting posts point outward. rss is still sitting there, unbothered and useful, waiting for everybody to remember it never asked an algorithm for permission. open protocols make it possible to build small, nosy tools when a social platform is missing exactly one fact you want to know

    that is how i ended up building a client-side ATProto tool for checking which of your mutuals already block an account. sometimes a post explains a thought. sometimes a post has buttons and performs set intersection

    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.
    Small tools are personal posts with inputs: a hyperfixation made clickable.

    none of that makes the domain a fortress. owning a site does not mean pretending the social web is beneath you; it means having a home to return to after visiting everybody else’s apartments

    the feeds are where the conversation happens. the site is where the conversation gets furniture

    the weird name is the point

    there is no conversion funnel here. no promise that every post will reinforce a niche. the same person can care about open protocols, reality-show social strategy, queer pop culture, old songs, labor, games, movies, and whether the kitchen happens to be clean at the same time the pantry is full

    that mess is not a failure to brand the self. it is the self

    so yes, the blog is named tacobout.online. god forbid a bitch own a weird little corner of the internet and put a whimsical sign over the door

  • 2
    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.