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).