Terence Eden
banner
edent.mastodon.social.ap.brid.gy
Terence Eden
@edent.mastodon.social.ap.brid.gy
Longer hair than you.
Got the ⏻ symbol into #Unicode.
Open Standards / Source / Data geek.
Known as @Edent on most social platforms.

Bit obsessed with #SolarPower […]

🌉 bridged from ⁂ https://mastodon.social/@Edent, follow @ap.brid.gy to interact
@coba you can sort of do it.
See my blog post for details.
https://shkspr.mobi/blog/2023/09/how-far-did-my-post-go-on-the-fediverse/
**How far did my post go on the Fediverse?** https://shkspr.mobi/blog/2023/09/how-far-did-my-post-go-on-the-fediverse/ I wrote a moderately popular post on Mastodon. Lots of people shared it. Is it possible to find out how many different ActivityPub servers it went to? Yes! As we all know, the Fediverse is one big chain mail. I don't mean that in a derogatory way. When I write a post, it appears on my server (called an "instance" in Mastodon-speak). Everyone on my instance can see my post. My instance looks at all my followers - some of whom are on completely different instances - and sends my post to their instances. As an example: * I am on `mastodon.social` * John is on `eggman_social.com` * Paul is on `penny_lane.co.uk` * Both John and Paul follow me. So my post gets syndicated to their servers. With me so far? What happens when someone shares (reposts) my status? * John is on `eggman_social.com` * Ringo is on `liverpool.drums` * Ringo follows John * John reposts my status. * `eggman_social.com` syndicates my post to `liverpool.drums` And so my post goes around the Fediverse! But can I see where it has gone? Well... sort of! Let's look at how. A note on privacy People on Mastodon and the Fediverse tend to be privacy conscious. So there are limits - both in the API and the culture - as to what is acceptable. Some people don't share their "social graph". That is, it is impossible to see who follows them or who they follow. Users can choose to opt-in or -out of publicly sharing their social graph. They remain in control of their privacy. In the example above, if Ringo were to reshare John's reshare of my status - John doesn't know about it. Only the original poster (me) gets notified. If John doesn't share his social graph, it _might_ be possible to work out where Ringo saw the status - but that's rather unlikely. Mastodon has an API rate limit which only allows 80 results per request and 1 request per second. That makes it long and tedious to crawl thousands of results. Similarly, some instances do not share their social data or expose anything of significance. Some servers may no longer exist, or might have changed names. It's impossible to get a comprehensive view of the entire Fediverse network. And that's OK! People should be able to set limits on what others can do with their data. The code you're about to see doesn't attempt to breach anyone's privacy. All it does is show me which servers picked up my post. This is information which is already shown to me - but this makes it slightly easier to see. The Result I looked at this post of mine which was reposted over 100 times. It eventually found its way to… **2,547** instances! Ranging from `0ab.uk` to `թութ.հայ` via `godforsaken.website` and many more! And that's one of the things which makes me hopeful this rebellion will succeed. There are a thousand points of light out there - each a shining beacon to doing things differently. And, the more the social media giants tighten their grip, the more these systems will slip through their fingers. The Code This is not very efficient code - nor well written. It was designed to scratch an itch. It uses Mastodon.py to interact with the API. It gets the instance names of all my followers. Then the instance names of everyone who reposted one of _my_ posts. But it cannot get the instance names of _everyone_ who follows the users who reposted me - because: [Image: Followers from other servers are not displayed. Browse more on the original profile.] The only way to get a list of followers from a user on a different instance is to apply for an API key for that instance. Which seems a bit impractical. But I can get the instance name of the followers of accounts on my instance who reposted me. Clear? I can also get a list of everyone who favourited my post. If they aren't on my instance, or one of my reposter's follower's instances, they're probably from a reposter who isn't on my instance. My head hurts. Got it? Here we go! import configfrom mastodon import Mastodonfrom rich.pretty import pprint# Set up accessmastodon = Mastodon( api_base_url=config.instance, access_token=config.access_token, ratelimit_method='pace' )# Status to check forstatus_id = 111040801202691232print("Looking up status: " + str(status_id))# Get my datame = mastodon.me()my_id = me["id"]print("You have User ID: " + str(my_id))# Empty setsinstances_all = set()instances_followers = set()instances_reposters = set()instances_reposters_followers = set()instances_favourites = set()# My Followersfollowers = mastodon.account_followers( my_id )print( "Getting all followers" )followers_all = mastodon.fetch_remaining( followers )print("Total followers = " + str( len(followers_all) ) )# Get the server names of all my followersfor follower in followers_all: if ( "@" in follower["acct"]) : f = follower["acct"].split("@")[1] instances_all.add( f ) if ( f not in instances_followers): print( "Follower: " + f ) instances_followers.add( f ) else : instances_all.add( "mastodon.social" ) instances_followers.add( "mastodon.social" )total_followers = len(instances_followers)print( "Total Unique Followers Instances = " + str(total_followers) )# Reposters# Find the accounts which reposted my statusreposters = mastodon.status_reblogged_by( status_id )reposters_all = mastodon.fetch_remaining(reposters)# Get all the instance names of my repostersfor reposter in reposters_all: if ( "@" in reposter["acct"]) : r = reposter["acct"].split("@")[1] instances_all.add( r ) if ( r not in instances_followers ) : print( "Reposter: " + r ) instances_reposters.add( r )total_reposters = len(instances_reposters)print( "Total Unique Reposters Instances = " + str(total_reposters) )# Followers of reposters # This can take a *long* time! for reposter in reposters_all: if ( "@" not in reposter["acct"]) : reposter_id = reposter["id"] print( "Getting followers of reposter " + reposter["acct"] + " with ID " + str(reposter_id) ) reposter_followers = mastodon.account_followers( reposter_id ) reposter_followers_all = mastodon.fetch_remaining( reposter_followers ) for reposter_follower in reposter_followers_all: if ( "@" in reposter_follower["acct"]) : f = reposter_follower["acct"].split("@")[1] instances_all.add( f ) if (f not in instances_reposters_followers) : print( " Adding " + f + " from " + reposter["acct"] ) instances_reposters_followers.add( f ) total_instances_reposters_followers = len(instances_reposters_followers)print( "Total Unique Reposters' Followers Instances = " + str(total_instances_reposters_followers) )# Favourites# Find the accounts which favourited my statusfavourites = mastodon.status_favourited_by( status_id )favourites_all = mastodon.fetch_remaining(favourites)# Get all the instance names of my favouritesfor favourite in favourites_all: if ( "@" in favourite["acct"]) : f = favourite["acct"].split("@")[1] instances_all.add( f ) if ( f not in instances_favourites ) : print( "Favourite: " + f ) instances_favourites.add( r )total_favourites = len(instances_favourites)print( "Total Unique Favourites Instances = " + str(total_favourites) )print( "Total Unique Reposters Instances = " + str(total_reposters) )print( "Total Unique Followers Instances = " + str(total_followers) )print( "Total Unique Reposters' Followers Instances = " + str( len(instances_reposters_followers) ) )print( "Total Unique Instances = " + str( len(instances_all) ) ) https://shkspr.mobi/blog/2023/09/how-far-did-my-post-go-on-the-fediverse/ #mastodon #MastodonAPI #python
shkspr.mobi
November 24, 2025 at 8:42 AM
@derickr they should work. I added some code a few weeks ago.
November 22, 2025 at 4:07 AM
Reposted by Terence Eden
I think that's the most annoying thing, to me: You can't debloat Linux because the package management tools forbid it.

Cups is pretty damn good, I have nothing against the project, it's *way* better at just working than any print stack in the commercial operating systems, but if I'm not […]
Original post on mastodon.monoceros.co.za
mastodon.monoceros.co.za
November 21, 2025 at 6:52 AM
@evan it's all good 😄
November 19, 2025 at 4:14 PM
@evan What did you think about the blog post, Evan 😆
November 19, 2025 at 4:04 PM
@evan indeed! But people rarely visit their own country's museum having had all of that forced into them at school.
November 19, 2025 at 12:58 PM
## Grinding down open source maintainers with AI https://shkspr.mobi/blog/2025/07/grinding-down-open-source-maintainers-with-ai/ Early one morning I received an email notification about a bug report to one of my open source projects. I like to be helpful and I want people who use my stuff to have a good time, so I gave it my attention. Here's what it said: > ## 😱 I Can't Use On This Day 😭 > > Seriously, What’s Going On?! 🔍 > I’ve been trying to use the On This Day feature, but it’s just not working for me! 😩 > Every time I input my details, it says I have no posts for today, even though I know I’ve posted stuff! 🧐 > > ### Here’s My Setup: ⚙️ > > * Python 3.x 🐍 > * Access token fully generated (I triple-checked!) 🔑 > * Attempted on multiple instances but still nothing! 😩😩 > > > ### Could It Be a Bug? 🤔 > > I’m really starting to doubt my posting history! 😳 > Is it supposed to show only specific types of posts? > I’ve made some pretty epic posts before! 💥💬 > > ### Documentation Confusion 📚 > > The README says to register for an access token but doesn’t clarify if it factors into this feature! 🤔❓ > Did I miss something REALLY important?! > Help me figure this out, please!!! 😱 > > ### Feature Suggestion 💭 > > If this is broken, can we at least have a debug mode to log what’s happening! 😬 > I need to know if it’s truly my fault or the code’s! 🔍🛠 > Thanks for looking into this TRAGIC situation!!! 😭💔 > > P.S. My friends ARE posting on this day and their instances work!! 😤 > I feel so left out!! 😟 > Let’s get this sorted ASAP! ⚡ OK, that's a _lot_ of Emoji - too much even for me! But if one of my users needs help, I'm there for them! As the feature works for me, I decided I'd ask for the output of the app. Maybe there'd be a clue in the minimal debugging output it had. I clicked on the link to the Codeberg repository and was hit be a 404! What? I clicked on the link to the user "simpleseaport2" but that was also broken. "Seriously, What’s Going On?! 🔍" It looks like Codeberg has been hit by a wave of spam bug reports. I read through the bug report again, slightly more awake, and saw just how content free it was. Yes, it is superficially well structured, the Emoji are a bit over-the-top but not the worst I've seen, and the emotional manipulation is quite insidious. A few weeks later, I got a bug report to a different repo. This one was also deleted before I could reply to it, see if you can spot that it is AI generated: > I've been trying to use the Threads tool to visualize some conversations but I'm running into a serious problem, and it's really frustrating! > > When I input the URL for a post with a substantial number of replies, the script seems to hang indefinitely. I've waited more than 15 minutes on a couple of occasions, and nothing seems to happen. This is not what I expected, especially since the README mentions large conversations may take a long time, but doesn’t specify any limits or give guidance on what users should do if it doesn’t respond at all! > > It's unclear what's actually happening here. Is the script failing silently? Is it the API timing out? Why isn’t there any sort of progress notification built into the tool? It feels like a complete dead end. > > Can you please add some kind of error handling or logging feature to the Threads script? It would be helpful if it could at least inform the user when a timeout occurs or if the API response is simply taking too long. Additionally, could you clarify the maximum number of replies that can be handled? It’s really inconvenient to have no idea if the script is still processing or if it’s just broken. > > Thanks for addressing this. I hope to see improvements soon. * The emotional manipulation starts in the first line - telling me how frustrated the user is. * It turns the blame on me for providing poor guidance. * Then the criticism of the tool. * Next, a request that I do work. * Finally some more emotional baggage for me to carry. I'm not alone in getting these - other people have also received similar spam To be fair to Codeberg, they are under attack and are trying to stop these specious complaints reaching maintainers. > Post by @Codeberg > > View on Mastodon But, still, search the socials and you'll find a stream of frustrated developers. > Woke this morning to my first ever AI generated spam issue on a repo. Got it via email. When I went to check it out at Codeberg, it had already been moderated. Wonder how many others were affected.I immediately knew it was AI spam due to the overuse of emojis…🎉 > > [image or embed] > > — Jeff Sikes (@bsky.box464.social) 24 April 2025 at 15:07 ## What's Going On⁉️ I can only think of a few possibilities - none of them particularly positive. * Attacking the viability of CodeBerg - make users abandon it for a different platform. * Attacking the attention of developers - make them unwilling to give attention where it is actually needed. * Attacking the integrity of users - make them less likely to receive help because they are mistaken for AI. * Maybe it is just a bored kid or an unethical researcher. Trying to find the limits of what a maintainer will recognise as spam? Either way, AI bug reports like this are about as welcome as a haemorrhage in a jacuzzi. #AI #git #LLM #spam
shkspr.mobi
November 19, 2025 at 9:31 AM
Here's three on one of my #codeberg repos.

The legit looking one is LLM generated nonsense. Looks vaguely right, but doesn't actually make sense.

Annoyingly, despite reporting the abuse, I can't see a way to delete the issue. I guess I have to manually close it?
November 19, 2025 at 9:06 AM