For six months or so I ran an experiment: After enthusiastically jumping into Mastodon and Bluesky following the great Xodus, I found both networks were surfacing a lot of stuff I didn’t want to see — mostly politics and politicians, puncatuated by just the worst people and the worst horrors on a near daily basis. As a way to try and fix that I instantly blocked anything on Bluesky that I didn’t want to hear about and anyone I didn’t want to hear from. No deliberation, just block and move on. On Mastodon I left everything unmoderated. The difference was stark.
Bluesky became an infinitely nicer place to be, and whilst I don’t think blanket ignorance to world affairs is a good idea generally — political awareness doesn’t require politics to be everywhere all the time. I’d let too much in, and it was making me miserable.
Everything in moderation, including content moderation.
My conclusion is that for social media, aggressive curation works — block and mute without agonising over it, the news will find me, and there is joy in missing out.
Having reached that conclusion I wanted to move my account and language blocklists to Mastodon too. And whilst bridging tools like Bridgy Fed can mirror your account across both networks,it doesn’t take your existing mute and block lists and recreate them wholesale as native Mastodon mutes and keyword filters — which is what I wanted. So I wrote one: mute-mover.
There are two very simple scripts:
bsky_to_mastodon_mutes.py migrates accounts you’ve muted or blocked on Bluesky. Since the two platforms run on incompatible protocols, it leans on Bridgy Fed, which bridges Bluesky accounts whose owners have opted in. For each muted account it finds the bridged handle and mutes that on Mastodon. Accounts that haven’t been bridged get logged as not_found.
bsky_to_mastodon_muted_words.py migrates your muted words and tags from Bluesky’s moderation preferences and recreates each as a keyword filter on Mastodon, applied across all contexts. The default action is hide, which is closest to how Bluesky handles mutes — but you can switch to warn if you’d rather have posts blurred out than hidden.
Both scripts default to a dry run so you can see what they’d do before committing. Adding --live does the thing. The scripts write a CSV log and skip anything already processed on re-run, so it’s safe to stop and resume if you hit a rate limit partway through a large list.
Setup: clone the repo, pip install -r requirements.txt, set the environment variables for your credentials and run. Full instructions in the README.
The scripts are currently one way only since that was what I needed, but if you want to add a reverse migration from Mastodon to Bluesky, please do and submit a PR.