Mirroring your socials
Ever since I left Twitter, back in 2022 when the world's saddest loser bought it, I've had a fraught relationship with social media. I was pissed that I put so much time and effort into something one jerk could buy outright one day and ruin instantly, so I moved most of my posting energy to this blog and then my mastodon account.
Mastodon is my first choice because it's distributed and no single shithead can ruin it for everyone. It also lets you post up to 500 characters as well as endlessly edit your posts for typos (seriously, why is that impossible on every other social network?!).
But Mastodon has some major drawbacks like occasional cranky weirdos in your replies and a byzantine system of interlocking servers that never quite feels user-friendly to newcomers. So naturally, many of my friends went to Bluesky instead, which works a lot more like early twitter (but with a 300 character limit). It's way easier to sign up and use, and has most of the good energy Twitter had in its early days.
An ugly hack
A couple years ago, as I was bouncing between the two services, I found an app that let me post to both of them, but it was mobile-only and added a significant barrier because I could only make my posts in a (paid) app then wait as it attempted to publish to multiple networks.
Later, I found a service called "Bridgy" which basically copied all your posts on one network to the other, but it had a lot of drawbacks. One, it gave you an ugly username like mine, which was @mathowie.xoxo.zone.ap.brid.gy, which honestly just rolls off the tongue. You also couldn't log into Bluesky with your alternate account, so you couldn't edit or delete posts or reply to anyone directly. People didn't know if they should reply to this ghost profile of your other online presence, or @-mention you directly with your "real" Bluesky account.
I still enjoy the service for being able to read occasional Bluesky-only posts from friends when I'm reading in Mastodon, but it fell way short of an ideal, which is having a frictionless, fully distributed social network no matter what service people were using to read it.
Bridgy always felt like an ugly hack, so I finally decided to fix it.

A better way
In my ideal setup, I wanted to remove the mirrored bluesky version of me that I couldn't control or tweak to my liking, and I first checked to see what services are available for people in my situation. There are a handful of paid services that will take your content from one social network, log in as you automatically in another, then repost things on your behalf. You can still log in to those other accounts and control them fully, but I balked at the best option costing $30 a month just to do this one task for me.
Last night I started building my ideal version using Codex and after a couple hours of tinkering and testing, I got something I really like.
It's a bundle of python scripts that run in a Docker container on my home server, and it runs unattended, basically forever. Every couple of minutes, it checks my mastodon account and takes any new post and sends it to my Bluesky account.
If my post has images, it shrinks them to under 2Mb so the Bluesky API doesn't refuse the new post. If there are over 300 characters of text in my Mastodon post, it automatically creates a thread of two posts with the text spread across them (and checks for orphaned words/characters). If I reply to my own Mastodon posts, it gets posted to Bluesky too, as a reply to my original post. You also get a local dashboard website with your posting history so you can debug any issues.
Download my code to build your own version
Here's a generic copy of the code I'm using on my Synology server, over on my GitHub account. You can point my GitHub repo at Codex or Claude, and ask it to tweak it for your own servers and services, and run a similar version in Docker on almost anything (if you've never used Docker, ask Claude or Codex to get you up to speed on that too, it's a pretty amazing utility).

The end result
I am really stoked on this new setup and I finally feel like a full participant in Bluesky for the first time. I have my own service that does exactly what I need and I will continue tweaking it as I find any shortcomings. Also, if Bluesky is one day taken over by a shithead, I can simply pick a new destination for my Mastodon posts and keep using it.
Honestly this code not only fixed what was broken but removed all the friction from cross-posting. Since it's totally automated and does exactly what I want, I'm already posting more often to both networks as a result. I'm also having more fun interacting with people on both networks when they reply and I'm really glad I finally got this all set up and working.
My next revision to this codebase will automatically send any new blog posts I publish here to both of my social networks as well.
But that's a project for another day. Today is a day to play in social spaces.

