GoToSocial Adventures: migrate from Pixelfed

       762 words, 4 minutes

When I decided to stop publishing on Instagram, I seeked for alternatives and Pixelfed looked like a nice one. The fact that it had a migration feature from IG made me go for it.

But for reasons, I don’t want to use this software anymore. And now that GoToSocial features the Gallery / Gram-style layout , it is time to migrate the account and its data to GtS.

Create the GoToSocial account

In case it is not already done, create the GoToSocial account that will host the old Pixelfed data.

# doas -u _gotosocial ~_gotosocial/current/gotosocial \
  --config-path ~_gotosocial/config.yaml              \
  admin account create                                \
  --username bob --email bob@gts.example.com          \
  --password '<change me>'

Export the Pixelfed data

Pixelfed exports are JSON files. There is no content archive like in Mastodon and the “Statuses” export contains only textual elements of posts. All the media files are stucked on the Pixelfed server (as-of-now).

From the Pixelfed GUI, browse to /settings/data-export and click the “Download” buttons for the “Following”, “Followers”, “Statuses”, Mute/Block List" and “Account” lists. Save those files in a directory; named “archive”, for example.

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 seem to require access to a local Web browser to authenticate the Pixelfed and GoToSocial accounts. So the software should probably be installed on the workstation rather than on the Fediverse server.

Authenticate slurp on the GoToSocial account and proceed to the data import. The source Pixelfed account needs to be accessible during import so that the photos are grabbed from the Pixelfed server and uploaded to GoToSocial. The Pixelfed JSON export files were saved in the “archive” folder during the previous step.

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

# ./slurp --user bob@gts.example.com archive import \
  --format pixelfed                                 \
  --file archive/pixelfed-statuses.json             \
  --attachment-map-file archive/attachment-map.json \
  --status-map-file archive/status-map.json         \
  --attachment-directory archive/media_attachments  \
  --allow-missing-custom-emojis

During the migration process, network outage happened on my side. This led to a bunch of errors such as:

2025/07/12 15:55:26 ERROR Couldn't upload media attachment (...) err=(...): net/http: TLS handshake timeout"
2025/07/12 15:55:26 ERROR Error retrieving or uploading attachment (...) err=(...): net/http: TLS handshake timeout"
2025/07/12 15:55:26 io: read/write on closed pipe

Hopefully, slurp keeps track of what it does and how it fails / succeeds. So running the “archive import” command a second time imported all the posts that have previously failed.

A couple of other errors still kept happening:

2025/07/12 17:39:49 INFO Skipping status because it's a reply to another account' status=(...)
2025/07/12 17:39:49 INFO Skipping status due to visibility status=(...) visibility=direct

Those looked legit and I actually didn’t notice any of my public posts being targeted by those errors.

Once the migration is finished, I switched to the gallery layout, which is not the default in GoToSocial. From the GtS Web GUI, browse to the user’s preference section (/settings/user/profile) and set the “Layout for the web view of your profile” to “Gram-style gallery layout” to have the photo-centric rendering.

Migrate the Pixelfed account

Read the GoToSocial migration documentation .

On the GoToSocial server, enable the alias for the old Pixelfed account. From GoToSocial Web GUI, browse to /settings/user/migration and fill-in the alias field with the Pixelfed account that is being migrated. Then click the “Save account aliases” button.

On the Pixelfed server, enable the migration to GoToSocial. From the Pixelfed Web GUI, browse to /settings/account/migration/manage. Fill-in the “New Account Handle” and the “(Pixelfed) Account Password” fields. Click the “Move followers” button.

On my private instance, the migration process failed!
I also tried with an alternate account on some other public instance. It also failed.
The cryptic error message was something about a bad response from GoToSocial. Looking at the logs, I could get the HTTP request that was done. And passing it through cURL, I could see it was responding ok and in the same way a Mastodon server does. So that’s probably a problem in the Pixelfed code.

Thoughts on the process

The overall process of migrating the photos from Pixelfed to GoToSocial worked like a charm thanks to slurp. And that was my main scary concern.

I was never really satisfied with running Pixelfed and never really used it intensively. So I just PM the 10 people that were following my Pixelfed account to notify the migration. Most of them manually switched to the new account.

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