Toot toooooooot (Bluesky-Mastodon cross-poster)
1# Tootify 🦋→🐘 2 3A simple Bluesky-to-Mastodon cross-posting service 4 5 6## What does it do 7 8Tootify allows you to do a selective one-way sync of Bluesky posts to your Mastodon account. 9 10The 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. 11 12Currently handles: 13 14- post with link embeds 15- quotes – posted as "RE: bsky.app/..." 16- images (with alt text) 17- videos 18- threads of multiple chained posts from you 19 20 21## Installation 22 23At the moment: 24 25 git clone https://github.com/mackuba/tootify.git 26 cd tootify 27 bundle install 28 29 30## Usage 31 32First, log in to the two accounts: 33 34 ./tootify login johnmastodon@example.com 35 ./tootify login @alf.bsky.team 36 37Press like on the post(s) on Bluesky that you want to be synced to Mastodon. 38 39Then, you can either run the sync once: 40 41 ./tootify check 42 43Or run it continuously in a loop: 44 45 ./tootify watch 46 47By default it checks for new skeets every 60 seconds – use the `interval` parameter to customize the interval: 48 49 ./tootify watch --interval=15 50 51 52## Configs 53 54Tootify stores configs and data in the `config` folder: 55 56* `bluesky.yml` – created when you log in, stores Bluesky user ID/password and access tokens 57* `mastodon.yml` – created when you log in, stores Mastodon user ID/password and access tokens 58* `tootify.yml` - optional additional configuration 59 60The config in `tootify.yml` currently supports one option: 61 62- `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) 63 64There is also an SQLite database file that's automatically created in `db/history.sqlite3`. It stores a mapping between Bluesky and Mastodon post IDs, and is used to maintain reply references in threads. 65 66 67## Credits 68 69Copyright © 2025 Kuba Suder ([@mackuba.eu](https://bsky.app/profile/mackuba.eu)). 70 71The code is available under the terms of the [zlib license](https://choosealicense.com/licenses/zlib/) (permissive, similar to MIT).