GoToSocial Adventures: migrate from Mastodon

       1023 words, 5 minutes

I already used a Mastodon account but wanted to migrate it to my brand new GoToSocial instance while keeping as much data as possible.

As-of-now, not everything can automatically be migrated from one Fediverse account to another. What works OOB is Followers, Following, Lists and Blocks - if your ActivityPub softwares supports exports / imports. But Posts / Toots / Messages can only be grabbed in the form of an offline archive.

This is where slurp comes to the rescue.

(slurp is a) tool for exporting data from and importing data to Fediverse instances. Requires that they support the Mastodon API as implemented by GoToSocial. Intended for use with GoToSocial, but should work with other Mastodon-like instances, including Mastodon.

And that’s exactly what I want to do!

Export the Mastodon data

It is possible to get a user’s archive from Mastodon.

Using the Mastodon Web GUI, browse to settings/export and click “Request your archive”. Wait for the process to complete… then click the “Download your archive” button.

It is also possible to export Followers, Follows, Lists and Blocks using the “Data export” section of the Mastodon Web GUI; and get a couple of CSV files.

Import the data using slurp

Get the slurp sources using git and compile in using go; as described in the slurp documentation .

$ git clone https://github.com/VyrCossont/slurp
$ cd slurp
$ go mod download
$ go build .

slurp seems to require access to a local Web browser to authenticate the Mastodon and GoToSocial accounts. So the software should probably be installed on the workstation rather than on the Fediverse server.

Connect to the old Mastodon instance.

$ ./slurp --user bob@mastodon.example.com auth login

The authentication mechanism happens in the default Web browser. When done, copy the provided authorization code in the terminal session. Slurp should now be authenticated.

Now, export the data

$ ./slurp --user bob@mastodon.example.com blocks    export --file mastodon-exports.json
$ ./slurp --user bob@mastodon.example.com bookmarks export --file mastodon-bookmarks.json
$ ./slurp --user bob@mastodon.example.com emojis    export --inline --file mastodon-emojis.json
$ ./slurp --user bob@mastodon.example.com followers export --file mastodon-followers.json
$ ./slurp --user bob@mastodon.example.com follows   export --file mastodon-follows.json
$ ./slurp --user bob@mastodon.example.com mutes     export --file mastodon-mutes.json

A few issues were discovered:

All those data can be exported / imported using the CSV files, so it didn’t bother me at all. And I didn’t debug those issues. The Domain Blocks list was imported from GtS Admin page, using Mastodon CSV export. Same success with Blocked and Muted Accounts.

According to the documentation, importing the archive works best if all the emojis are available on the destination instance. So emojis should be imported before importing the actual archive content. That said, there is a slurp option that basically says “don’t bother about missing emoji and import post anyway”. The emoji import to GoToSocial failed:

# ./slurp --user bob@gts.example.com auth login

# ./slurp --user bob@gts.example.com emojis import --file mastodon-emojis.json
2025/07/11 19:10:04 ERROR couldn't create emoji shortcode=batman err="[POST /api/v1/admin/custom_emojis][403] emojiCreateForbidden"
Error: [POST /api/v1/admin/custom_emojis][403] emojiCreateForbidden

This seem to be an issue with GtS scopes which I didn’t understand how to solve. As I only had something like 10 custom emojis, I simply enabled them in GoToSocial using the administration Web GUI.

Once done, it was time to import my past content…

$ unzip mastodon-archive.zip
$ ./slurp --user bob@gts.example.com archive import \
  --file archive \
  --status-map-file archive/status-map.json \
  --attachment-map-file archive/attachment-map.json

When the process ended, 33 posts over 103 where not imported. Errors were like:

That seems legit.
All public posts, with or without attachments, with or without CW were imported properly.

The same kind of errors raised (3 times over 20 bookmarks) when importing the Bookmarks list.

# ./slurp --user bob@gts.example.com bookmarks import --file mastodon-bookmarks.json
(...)
2025/07/11 19:52:12 WARN couldn't resolve status status_uri=(...) error="no search results"
(...)

Once this was done, my new account looks nearly like the old one. Pretty satisfying!

Migrate the Mastodon account

Read the GoToSocial migration documentation.

First thing to do is to enable the alias on the GoToSocial server.
From the GtS Web GUI, browse to /settings/user/migration and fill-in the alias field with the Mastodon account that is being migrated. Then click the “Save account aliases” button.

Then proceed to the account migration on the Mastodon server.
From the Mastodon Web GUI, browse to /settings/migration and fill-in in the GoToSocial account and the Mastodon user password. Then click the “Move followers” button.

The Mastodon account appears as “being moved” and the followers are being forwarded to the new GoToSocial account.
This can take some time depending on the overall load of your followers' servers. It took about 24H for all my ~300 followers to get the notification and proceed to the new account hop. Note that my GoToSocial account has the “Manually approve follow requests” option activated. I did receive a follow request from each of those accounts and had to allow them all manually.

As the Following list seemed incomplete at the slurp stage, I forced an import from the GoToSocial Web GUI. This is done by browsing to /settings/user/export-import, clicking the “Browse” button to select the “following accounts” CSV export from Mastodon, set the “Import Type” to “Following list”, the “Import mode” to “Merge” and click the “Import” button.

Thoughts on the process

I didn’t really care to keep my previous posts. In fact, except the few messages that are pined, every post is auto deleted after 30 days. It was more of a live-test for the future Pixelfed migration.

All the lists can be exported / imported from the software Web GUI.

The account migration itself is built-in the ActivityPub protocol.

All in all, everything went ok. And slurp is definitively a nice tool to have while account hoping.