Category: schwegler

personal posts

  • why would i let 20-year-old me review my life

    why would i let 20-year-old me review my life

    he had more friends, a better city, and absolutely none of the information. i’m willing to hear his concerns. Read more →

    somebody asked whether 20-year-old you would be impressed or disappointed by you today. i gave it some thought, which was my first mistake.

    20-year-old me had more friends. probably more fun. lived in a city i liked better. he had fairly high expectations of a future somewhere gay-friendly, with a social life that did not require quite so much deliberate effort.

    so, sure. show him the current situation and he’d probably have some complaints.

    but why the fuck would i listen to that 20-year-old dickhead?

    20 y/o me had way more friends and probably more fun and lived in a better city and had pretty high expectations of a future in a gay-friendly city, so he'd probably be mad at me, but, then again, why the fuck would i listen to that 20 year old dickhead?

    — schweg, (@schwegler.lol) 2026-09-17T19:43:56.389Z
    https://embed.bsky.app/static/embed.js
    A street scene in downtown Athens, Georgia, looking toward the University of Georgia Arch in 2008.
    downtown Athens in 2008, close to the period the question sent me back to. Richard Chambers / source. Public domain

    i say that with affection. i was him. i remember enough of what he wanted to know that it wasn’t stupid. wanting friends, belonging, interesting work, and a place where being gay feels ordinary is a pretty reasonable set of requests. i haven’t stopped wanting those things.

    what i object to is giving him the final say about how well i’ve done. he was making a prediction. he wasn’t agreeing to live through everything that happened next and then submit a report.

    he did not have the full itinerary

    when i started listing what 2009 me hadn’t experienced yet, the list got long quickly. friendships falling apart. the company behind a dream job shutting down. moving back to the hometown we’d left when i was ten. eventually ending up in Alabama. becoming my mother’s caregiver. losing her. the pandemic.

    i’ve already written some of that history in “My Lost Decade.” i don’t need to repeat the whole thing here. but i do need it to count when i’m being asked to compare the life i imagined with the one i have.

    there’s a remarkable amount of missing information in “would younger you be proud?” younger me hadn’t tried to hold his life together under those circumstances. he hadn’t even heard of most of the circumstances. he had a lot of opinions, of course. that part came installed.

    if i asked an actual 20-year-old to assess my life, i’d probably explain what had happened before taking his disappointment personally. apparently, when the 20-year-old is me, i’m supposed to skip that step and accept the review.

    A panoramic photograph of downtown Montgomery, Alabama, with buildings spread across the skyline.
    Montgomery: a place the earlier version of the plan did not account for. Chris Pruitt / source. CC BY-SA 3.0.

    i can miss that life without owing it an apology

    the comparison is tempting because some of what i miss is real. i don’t want to pretend that every difficult thing improved me or that every turn was secretly taking me somewhere better. sometimes something good ended. sometimes i made a bad choice. sometimes the available choices were all pretty shitty.

    i can miss the friends, the city, and the feeling that there was plenty of time without concluding that my current life is evidence against me.

    i also don’t have to turn surviving into an inspirational job. there doesn’t need to be a lesson attached to everything i lost. i would happily have learned several of those lessons in a less thorough manner.

    what i want is a fairer comparison. the person i was at twenty could imagine the future, but he couldn’t know what living it would cost or what would become important along the way. i know more now. not everything, obviously. enough to have earned a vote.

    i wrote recently about never quite feeling like a finished adult. this is a different problem: treating an unfinished younger person’s expectations as if they were binding instructions.

    some of those expectations are still useful. i’d like more connection. i’d like more fun. i can take those wishes seriously today without first agreeing that i’ve let somebody down.

    so yes, 20-year-old me can tell me what he misses. i might agree with quite a lot of it.

    then he can listen for a while. he has seventeen years to catch up on.

    Featured image: Tichnor Brothers Collection / Boston Public Library / source. Public domain

  • five years is not a deadline for missing someone

    five years is not a deadline for missing someone

    my mother would have turned 65 this week. grief has reviewed the calendar and declined to recognize the five-year performance target. Read more →

    wednesday would have been my mom’s 65th birthday.

    the sentence is simple enough. the feeling has apparently declined to remain within the assigned scope.

    i have spent the last few days moving between missing her and being angry at myself for still being this affected after half a decade of “healing.” five years sounds like enough time to have completed something. there should be a certificate. perhaps a small badge i can attach to my shirt that says processed one major loss, please proceed normally.

    wednesday would have been my mom's 65th birthday and i am cycling between feeling sad and also being mad at myself for feeling sad after half a decade of 'healing'

    — schweg, (@schwegler.lol) 2026-09-21T20:10:03.129Z

    i posted that thought on Bluesky, and people replied with the thing i can believe when it applies to anybody except me: grief does not have a deadline. one person said five years is nothing. another told me to be kind to myself.

    reasonable advice. deeply inconvenient.

    A scattered collection of old black-and-white portrait photographs.
    Mr Cup / Fabien Barral / Unsplash

    healing is not an uninstall button

    i think part of the problem is the way we talk about healing as if it were a project with an end state. you do the work. you learn the lessons. eventually the loss becomes a tasteful line item in your personal history, and the emotional department stops opening tickets about it.

    that has not been my experience.

    i am not as wrecked as i was five years ago. that matters. i can remember my mother without every memory immediately collapsing into the fact that she died. i can write about her angry power-walking playlist and let the memory be funny. i can hear “You Oughta Know” and picture a specific woman being specifically pissed off, rather than treating her entire life as a preface to losing her.

    that is healing, i think. not becoming somebody who no longer hurts, but becoming somebody who has more room around the hurt.

    the trouble is that birthdays are very good at finding the room.

    the calendar keeps making plans for people who are gone

    a birthday is not an abstract reminder. it arrives with a number attached. sixty-five. a whole age she did not get to be. the calendar presents it like an appointment i forgot to cancel, then acts surprised when i have feelings about the empty slot.

    there are other dates, obviously. the day she died. holidays. the ordinary anniversaries that do not announce themselves until i notice what month it is. but a birthday carries a different kind of alternate timeline. i can imagine the cards, the cake, the jokes about senior discounts, and whatever opinion she would have developed about being sixty-five.

    none of that means the previous five years did not count. it means wednesday counts, too.

    Two empty wooden chairs beside a wall, crossed by warm sunlight and shadow.
    Greg Rosenke / Unsplash

    i do not need to grade this

    being mad at myself for being sad is an attempt to turn grief into a performance review. surely, after this much time, i should be more efficient. surely the same date should not be able to surprise me again. surely i have received sufficient training.

    but grief is not evidence that i failed to heal correctly. it is evidence that the relationship still has consequences. my mother mattered while she was here, and her absence remains capable of mattering now. five years did not revoke that.

    i wrote before that grief is not a loyalty program. apparently it is also not continuing education. i do not earn a cleaner response by logging enough hours.

    so, on wednesday, i am going to try not to evaluate the sadness while i am having it. i can miss her. i can be irritated that i have to miss her. i can laugh about the playlist and feel terrible about the age she never reached, possibly within the same five minutes.

    the feeling does not need to demonstrate progress before it is allowed in.

    she would have been sixty-five. i wish she had gotten to complain about it.

    Featured image: Dasha Kroti / Unsplash. Body images are credited in their captions. All three photographs are used under the Unsplash License.

  • a stray dog showed up and kindness immediately became logistics

    a stray dog showed up and kindness immediately became logistics

    a stray dog appeared at the door, and suddenly caring was not a feeling. it was a checklist. Read more →

    a dog appeared on my doorstep last night and immediately turned compassion into an operations problem.

    literally crying about a stray dog outside rn; I wish I had money for the vet bills and supplies so I could know she’s ok

    — schweg, (@schwegler.lol) 2026-09-23T01:54:09.726Z

    she looked like a light-brown lab mix. no visible owner. no little instruction card explaining whether she had escaped a yard, been dumped, or had simply selected my porch as tonight’s least-bad option.

    i did what panic allows: filled out the humane society’s form, sat outside with her, and wished very hard that wishing came with a scanner, a kennel, a veterinary budget, and office hours.

    it does not. this is the rude part of kindness. the feeling arrives all at once. the infrastructure does not.

    the first job is not adoption

    finding a dog does not instantly make you the dog’s forever person. the first job is smaller and more urgent: keep everybody safe long enough to make the next call.

    if the animal is injured, acting aggressively, standing in traffic, or otherwise unsafe to approach, call local animal control or an emergency veterinary clinic instead of trying to become an improvised action hero. a scared dog can bite. a well-meaning stranger can make a frightened dog run farther. love is not improved by adding an avoidable emergency.

    if the dog can be contained safely, offer water and a quiet place away from traffic, children, and your own animals. check for an ID tag without forcing contact. take clear photos. write down exactly where and when the dog appeared. these are not glamorous acts, but they are the beginning of a handoff.

    Light-brown stray dog waiting near the porch after arriving at Andrew's home
    still here, still somebody’s dog until proven otherwise. Photo by Andrew / Bluesky.

    there is probably a person already having the worst night

    a dog without a person in view is not necessarily a dog without a person. collars break. gates fail. fireworks happen. somebody may be refreshing neighborhood groups every thirty seconds while the dog is sitting three streets away looking like she has never participated in a plan.

    a veterinary office or shelter can scan for a microchip. if a number is found, the AAHA Universal Pet Microchip Lookup can identify which registry should have the owner’s contact information. the chip itself is not GPS; it is a tiny clue with paperwork attached, assuming the paperwork stayed current.

    the ASPCA recommends contacting local animal control, veterinary hospitals, municipal and private shelters, and rescue groups. it also tells people who find an animal to contact their local shelter for guidance. that is important because the shelter is where many owners are going to look, even if the finder is able to keep the dog temporarily.

    post the same clear photo and location in neighborhood groups and local lost-pet networks. file a found report with the public shelter. ask whether the shelter offers a finder-to-foster option, what its stray-hold policy is, and whether it can scan the dog without requiring immediate surrender. “call the shelter” and “leave the dog there” are not the same instruction.

    ASPCA image accompanying guidance for finding and reporting a lost pet
    the boring infrastructure—identification, shelters, neighbors, and reports—is how lost pets get home. Image: ASPCA, used with attribution for commentary.

    “no-kill” is not a magic word

    one reply warned me not to involve a government-run shelter unless i could confirm it was no-kill. i understand the fear inside that advice. shelter outcomes vary enormously, capacity matters, and asking questions before transferring an animal is responsible.

    but “no-kill” is not a promise that no animal is ever euthanized, and “municipal” is not a synonym for death sentence. Best Friends Animal Society uses a 90 percent save-rate benchmark when it labels a shelter no-kill. the label describes an outcome threshold, not the ownership structure of the building and not the complete circumstances of the dog in front of you.

    a blanket instruction to avoid the public shelter can also remove the dog from the system her owner is most likely to check. the useful questions are local and specific: what happens at intake? how long is the stray hold? can the finder foster? which rescues pull from this shelter? is the facility over capacity today? the answers matter more than the sign outside.

    kindness needs a handoff

    the part that made me cry was not only that the dog might need help. it was the sudden belief that helping meant i personally had to become the entire institution: owner, rescuer, foster, fundraiser, veterinarian, transportation department, and emotional-support porch furniture.

    that is too much for one person, which is why the checklist matters. contain if safe. photograph. scan. report. call. ask what happens next. keep the dog visible to the systems her family will use to find her. none of those steps guarantees a clean ending, but together they make one more possible.

    update: the handoff happened

    by 10:06 Wednesday morning, the logistics had done their job: she was safely at the humane society. i am going to keep watching for her adoption listing and share it once she is available. the ending is not that one person suddenly acquired unlimited money and a surprise dog. it is that the next part of the system showed up.

    Mission accomplished. Gonna keep an eye out and post a link once she’s adoptable. 💜

    — schweg, (@schwegler.lol) 2026-09-23T15:06:18.216Z

    Featured and first body photos by Andrew, originally posted to Bluesky. Additional image from the ASPCA’s lost-pet guidance, used with attribution for commentary and public-interest reporting.

  • the map must be optimistic because the food is not

    the map must be optimistic because the food is not

    the driver is “nearby” in the same way a distant thunderstorm is technically in the area. Read more →

    delivery tracking is one of the few consumer technologies designed to make a perfectly manageable wait feel like a military operation. the driver has accepted the order. the driver is waiting. the driver is apparently moving in a direction that suggests an entirely different meal.

    Person holding a smartphone outdoors
    Image: GB News

    the map is always serene about this. a little icon glides around with the confidence of a person who has never had to find an apartment complex after dark. meanwhile, the food is becoming a philosophical concept.

    i do not need a detailed route. i need one honest sentence: ‘there has been a development.’ maybe the driver is on a bike. maybe the restaurant has entered a fugue state. maybe the app has decided miles are a kind of vibe.

    Portable external drive on a desk
    Image: Seagate

    i will still order again, obviously. there are some systems we criticize because we believe they can be better, and some we criticize while opening them for the fourth time.

  • sleep is a mandatory meeting i cannot attend

    sleep is a mandatory meeting i cannot attend

    sleep is essential, automatic, and apparently unavailable whenever the brain notices you are counting on it. Read more →

    i reblogged “sleep is not normal to want and impossible to achieve” because it is the cleanest available description of a system that becomes less cooperative the more urgently you need it.

    sleep is supposedly the passive activity. you lie down, close your eyes, and stop participating. this would be very convenient if the brain did not interpret “please stop participating” as a request for the complete director’s commentary on every awkward interaction since middle school.

    during the day, i can want sleep with the uncomplicated intensity of a Victorian child staring through a bakery window. then bedtime arrives, the product is available, and suddenly my body would like to review tomorrow’s calendar, my long-term prospects, one noise the air conditioner made in 2024, and whether i have ever been normal in a grocery store.

    A woman lies awake in bed at night with her eyes open, resting her head on one hand.
    Photo: National Heart, Lung, and Blood Institute, National Institutes of Health.

    the official definition is almost offensively polite. the National Heart, Lung, and Blood Institute describes insomnia as trouble falling asleep, staying asleep, or getting good-quality sleep even when there is enough time and the right environment. yes, thank you, that is the administrative summary. the lived version is negotiating with a pillow as if it has access to a lever marked UNCONSCIOUS.

    the CDC says adults ages 18 through 60 generally need at least seven hours, which is useful information in the same way a weather alert saying “avoid getting wet” is useful while your car floats past the mailbox. knowing the target and reaching it are not the same project.

    sleep advice also has a particular tone. keep a schedule. make the room cool and quiet. avoid caffeine late in the day. turn off electronics before bed. all reasonable. all delivered as though i have not already transformed the bedroom into a controlled laboratory where the only uncontrolled variable is the patient.

    Cover of the NHLBI booklet Your Guide to Healthy Sleep, featuring an illustration of a person sleeping beneath a night sky.
    Your Guide to Healthy Sleep, via the National Heart, Lung, and Blood Institute.

    and then there is the final indignity: trying harder is not a useful sleep position. you cannot clench your way into unconsciousness. every check of the clock becomes an unsolicited progress report. six hours remaining. five hours and thirty-eight minutes remaining. congratulations, you have unlocked arithmetic.

    this is not me issuing medical advice from underneath a blanket. persistent sleep problems are worth discussing with a healthcare professional, especially because poor sleep can interfere with attention, memory, mood, and daily life. it is merely an acknowledgment that sleep occupies a strange category: essential maintenance that must happen naturally, on schedule, under observation, without you appearing to care too much.

    perfectly normal. no notes. see everyone again tonight for the mandatory meeting i remain unable to attend.

  • 1

    september, finally

    Read more →

    a hand holding Starbucks brand Pumpkin Spice Creamer
    a hand holding Starbucks brand Pumpkin Spice Creamer
  • 🐰

    AI might tear the fabric of our society apart. But look at this bunny wearing a little hat! Read more →

    AI might tear the fabric of our society apart. But look at this bunny wearing a little hat!

  • 2
    uncmaxxing: becoming playground equipment with dignity

    uncmaxxing: becoming playground equipment with dignity

    being the fun uncle is mostly controlled irresponsibility, available attention, and discovering that your lower back has become deeply conservative. Read more →

    there is a particular moment in adulthood when you realize you have become furniture.

    not metaphorically. i mean a small child has looked at your back, performed several calculations involving leverage and the complete absence of fear, and decided you are now part of the climbing wall.

    : apparently the final form of having a nephew is becoming playground equipment.

    children do not recognize personal space as a legal concept

    my nephew Sam hanging off my back in the kitchen is not an unusual event so much as the natural outcome of being within grabbing distance. children do not ask whether you are prepared to become a ride. they simply begin boarding.

    this is one of the stranger pleasures of being an uncle. parents have to maintain civilization. they are responsible for meals, bedtimes, school forms, shoes that have somehow vanished while still being inside the house, and the ongoing investigation into why everything is sticky. an uncle can arrive, make the situation louder, get climbed like a moderately stable tree, and then leave before anyone has to locate a matching pair of socks.

    it is an excellent system, especially for the uncle.

    Two adults and two children sit around a coffee table playing a board game together.
    Family play does not need an objective beyond everyone agreeing to the same small, temporary world. Photo by Bill Branson for the National Cancer Institute, via Wikimedia Commons. Public domain.

    the fun uncle is mostly controlled irresponsibility

    people talk about being the “fun uncle” like it requires gifts, elaborate outings, or a convertible purchased during a manageable midlife crisis. mostly, it seems to require being willing to participate in whatever bit a child has started without immediately asking where the bit is going.

    the answer is usually nowhere. this is the beauty of it.

    adults are forever trying to make activities produce something. the walk should count as exercise. the hobby should become a side hustle. the photograph should be optimized for a platform. even relaxing has developed performance metrics. did you hydrate? did you practice mindfulness? did you extract the maximum restorative value from sitting completely still?

    a kid will spend twenty minutes repeatedly falling off the same cushion because the fall made a funny noise once. this is a far more honest relationship with leisure.

    An adult and child sit together at a table while the child draws with colored pencils.
    Sometimes “being available” is simply treating a child’s current project like the important briefing it clearly is. Photo by Nenad Stojkovic, licensed CC BY 2.0.

    being remembered as available

    i do not remember every toy I had as a child, and I definitely do not remember which adults bought most of them. I remember who was willing to get on the floor. I remember the adults who listened to an explanation that made no sense and responded as though I had presented a complicated but potentially viable infrastructure proposal.

    that is probably the actual job. not performing childhood enthusiasm perfectly, but making room for it. being the adult who can be interrupted by a very urgent report about a bug, a cartoon, or an object found under the couch. being someone whose attention does not always have to be earned by doing something impressive.

    it is easy to forget how much power adults have over the atmosphere in a room. we decide whether something is annoying, embarrassing, too loud, too weird, or worth joining. sometimes the kindest possible response is to accept that you have been assigned the role of mountain and crouch down a little so the smaller person can get a better grip.

    uncmaxxing has terrible ergonomics

    none of this means my spine has endorsed the arrangement.

    being an uncle in your late thirties introduces a widening gap between your emotional willingness to roughhouse and your lower back’s deeply conservative interpretation of the same proposal. the child sees a beloved relative. the lumbar region sees an OSHA violation.

    still, there are worse ways to discover that you are no longer young than having someone assume you are strong, safe, and probably willing to make a ridiculous noise when they climb aboard.

    I can work with that.


    originally inspired by a moment posted on Bluesky. The embedded photograph includes alt text on the source post.

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