Tootify 🦋→🐘#
A simple Bluesky-to-Mastodon cross-posting service
What does it do#
Tootify allows you to do a selective one-way sync of Bluesky posts to your Mastodon account.
The way it works lets you easily pick which skeets you want to turn into toots: it scans your recent posts and checks which of them you have liked yourself, and only those posts are reposted. The self-like is automatically removed afterwards.
Currently handles:
- post with link embeds
- quotes – posted as "RE: bsky.app/..."
- images (with alt text)
- videos
- threads of multiple chained posts from you
Installation#
At the moment:
git clone https://github.com/mackuba/tootify.git
cd tootify
bundle install
Usage#
First, log in to the two accounts:
./tootify login johnmastodon@example.com
./tootify login @alf.bsky.team
Press like on the post(s) on Bluesky that you want to be synced to Mastodon.
Then, you can either run the sync once:
./tootify check
Or run it continuously in a loop:
./tootify watch
By default it checks for new skeets every 60 seconds – use the interval parameter to customize the interval:
./tootify watch --interval=15
Configs#
Tootify stores configs and data in the config folder:
bluesky.yml– created when you log in, stores Bluesky user ID/password and access tokensmastodon.yml– created when you log in, stores Mastodon user ID/password and access tokenshistory.csv– stores a mapping between Bluesky and Mastodon post IDs; used for reply references in threadstootify.yml- optional additional configuration
The config in tootify.yml currently supports one option:
extract_link_from_quotes: true– if enabled, posts which are quotes of someone else's post which includes a link will be "collapsed" into a normal post that just includes that link directly without the quote (so the link card on Mastodon will show info about the link and not the quoted bsky.app post)
Credits#
Copyright © 2025 Kuba Suder (@mackuba.eu).
The code is available under the terms of the zlib license (permissive, similar to MIT).